154 lines
6.4 KiB
Python
154 lines
6.4 KiB
Python
import os
|
||
from datetime import datetime
|
||
|
||
# 设置中文字体支持(如果需要可视化)
|
||
# import matplotlib.pyplot as plt
|
||
# plt.rcParams["font.family"] = ["SimHei", "WenQuanYi Micro Hei", "Heiti TC"]
|
||
|
||
class EducationResourceForecast:
|
||
def __init__(self):
|
||
# 数据文件路径
|
||
self.data_dir = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'Data')
|
||
# 教育阶段映射
|
||
self.education_stages = {
|
||
'preschool': '学前',
|
||
'primary': '小学',
|
||
'junior': '初中',
|
||
'senior': '高中',
|
||
'vocational': '中职'
|
||
}
|
||
# 预测年份范围
|
||
self.forecast_years = list(range(2023, 2030)) # 2023-2029年
|
||
# 加载数据
|
||
self.teacher_data = self._load_data('TeacherCount.json')
|
||
self.school_area_data = self._load_data('SchoolArea.json')
|
||
# 存储预测结果
|
||
self.forecast_results = {stage: [] for stage in self.education_stages.keys()}
|
||
|
||
def _load_data(self, filename):
|
||
"""加载JSON数据文件"""
|
||
import json
|
||
file_path = os.path.join(self.data_dir, filename)
|
||
try:
|
||
with open(file_path, 'r', encoding='utf-8') as f:
|
||
data = json.load(f)
|
||
# 数据文件是数组格式,我们只需要云南省的数据
|
||
for item in data:
|
||
if item.get('area_name') == '云南省':
|
||
return item
|
||
return {}
|
||
except Exception as e:
|
||
print(f"加载文件 {filename} 失败: {e}")
|
||
return {}
|
||
|
||
def _get_teacher_data_by_stage(self, stage):
|
||
"""获取特定教育阶段的教师数据"""
|
||
# 教师数据字段映射
|
||
teacher_field_map = {
|
||
'preschool': 'preschool_teachers',
|
||
'primary': 'primary_teachers',
|
||
'junior': 'junior_teachers',
|
||
'senior': 'senior_teachers',
|
||
'vocational': 'vocational_teachers'
|
||
}
|
||
|
||
field = teacher_field_map.get(stage)
|
||
if not field or field not in self.teacher_data:
|
||
return []
|
||
|
||
teacher_data = []
|
||
# 提取2015-2024年的专任教师数据
|
||
for year in range(2015, 2025):
|
||
year_data = self.teacher_data[field].get(str(year), {})
|
||
# 优先使用专任教师数量
|
||
teacher_count = year_data.get('total_teacher', 0)
|
||
teacher_data.append({
|
||
'year': year,
|
||
'teacher_count': teacher_count
|
||
})
|
||
|
||
return teacher_data
|
||
|
||
def _get_school_area_data_by_stage(self, stage):
|
||
"""获取特定教育阶段的学校面积数据"""
|
||
# 学校面积字段映射
|
||
area_field_map = {
|
||
'preschool': 'preschool_area',
|
||
'primary': 'primary_area',
|
||
'junior': 'junior_high_area', # 修正字段名
|
||
'senior': 'senior_high_area', # 修正字段名
|
||
'vocational': 'vocational_area'
|
||
}
|
||
|
||
field = area_field_map.get(stage)
|
||
if not field or field not in self.school_area_data:
|
||
return []
|
||
|
||
area_data = []
|
||
# 提取2015-2024年的学校面积数据
|
||
for year in range(2015, 2025):
|
||
year_data = self.school_area_data[field].get(str(year), {})
|
||
# 优先使用教学面积,如果为0则使用学校总面积
|
||
teaching_area = year_data.get('teaching_total', 0)
|
||
if teaching_area == 0:
|
||
teaching_area = year_data.get('school_total', 0)
|
||
area_data.append({
|
||
'year': year,
|
||
'teaching_area': teaching_area
|
||
})
|
||
|
||
return area_data
|
||
|
||
def forecast(self):
|
||
"""执行预测"""
|
||
for stage in self.education_stages.keys():
|
||
# 获取历史数据
|
||
teacher_history = self._get_teacher_data_by_stage(stage)
|
||
area_history = self._get_school_area_data_by_stage(stage)
|
||
|
||
# 生成最终结果
|
||
for year in self.forecast_years:
|
||
if year <= 2024:
|
||
# 2023-2024年使用实际数据
|
||
# 查找实际教师数据
|
||
teacher_item = next((item for item in teacher_history if item['year'] == year), None)
|
||
teacher_count = teacher_item['teacher_count'] if teacher_item else 0
|
||
|
||
# 查找实际面积数据
|
||
area_item = next((item for item in area_history if item['year'] == year), None)
|
||
teaching_area = area_item['teaching_area'] if area_item else 0
|
||
else:
|
||
# 2025-2029年预测数据设为0
|
||
teacher_count = 0
|
||
teaching_area = 0
|
||
|
||
# 添加结果,师资缺口/富余字段暂时设为0
|
||
self.forecast_results[stage].append({
|
||
'year': year,
|
||
'teacher_count': round(teacher_count / 10000, 2), # 转换为万人
|
||
'teacher_gap': 0, # 师资缺口/富余暂时设为0
|
||
'teaching_area': round(teaching_area / 10000, 2), # 转换为万平方米
|
||
'is_forecast': year >= 2025 # 标记是否为预测数据
|
||
})
|
||
|
||
def print_results(self):
|
||
"""打印预测结果"""
|
||
for stage, chinese_name in self.education_stages.items():
|
||
print(f"\n{chinese_name}教育阶段资源配置预测(2023-2029年):")
|
||
print("{:<8} {:<12} {:<16} {:<20} {:<10}".format("年份", "专任教师(万人)", "师资缺口/富余", "教学及辅助用房面积(万㎡)", "数据类型"))
|
||
for item in self.forecast_results[stage]:
|
||
data_type = "预测" if item['is_forecast'] else "实际"
|
||
print("{:<8} {:<12.2f} {:<16.2f} {:<20.2f} {:<10}".format(
|
||
item['year'],
|
||
item['teacher_count'],
|
||
item['teacher_gap'],
|
||
item['teaching_area'],
|
||
data_type
|
||
))
|
||
|
||
if __name__ == "__main__":
|
||
print("开始执行教育资源配置发展预测...")
|
||
forecast = EducationResourceForecast()
|
||
forecast.forecast()
|
||
forecast.print_results()
|
||
print("\n预测完成!") |