news 2026/9/16 20:19:12

Python天气数据工程全链路实战:采集、清洗、建模与可视化

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python天气数据工程全链路实战:采集、清洗、建模与可视化

简介:本资源是一份面向计算机专业本科生的Python期末大作业实战项目,聚焦天气数据爬取与可视化分析全流程,适用于课程设计、毕业设计选题及项目能力提升场景。压缩包共24个文件,含4个核心Python脚本(main.py、GetData.py等)、4个CSV天气数据集(train/test/valid等)、12张项目过程与结果截图(含界面、图表、流程图)、1份README.md说明文档、1个HTML静态页面及模型文件pkl等,整体1.42MB,结构清晰、模块分工明确。已有106人学习下载,项目经导师指导并获98分高分评价,所有代码均本地实测可运行,配套文档详述环境配置、数据获取逻辑、清洗步骤与Matplotlib/Seaborn可视化实现要点。学习者可直接复现完整数据采集→处理→建模→可视化的闭环流程,掌握requests+BeautifulSoup爬虫、Pandas数据清洗、Scikit-learn基础建模及多维度图表呈现等关键技术点。

1. 这不是“爬个网页+画个折线图”的玩具项目,而是一套可直接用于课程答辩、毕设开题甚至实习面试的天气数据工程闭环

你可能已经试过用requests + BeautifulSoup抓几个城市温度,再matplotlib画张图——但交作业时被助教问“为什么没处理反爬?训练集和测试集怎么划分?模型预测的是温度还是天气类型?可视化图表能不能响应式缩放?”就卡住了。这个 98 分大作业恰恰补上了这关键一环:它把「网络请求→数据清洗→特征工程→模型训练→结果可视化→本地部署」全链路跑通,且每一步都留有可调试入口。main.py是调度中枢,GetData.py封装了带 User-Agent 轮换与重试机制的稳定采集逻辑,ProcessData.pydate_train.csv等三类数据集做缺失值插补与时间序列对齐,Model.pkl是用scikit-learn训练好的轻量级回归模型(非简单平均),而china_today.csvwps*.jpg系列截图则证明它真正在本地 Windows/macOS 环境下完整运行过。适合计算机、信管、统计类专业学生快速复现高分作业,也适合作为 Python 数据工程入门的“最小可行项目”。

2. 天气数据采集模块深度解析:从静态 HTML 解析到动态反爬应对策略

2.1 为什么不用 Selenium?GetData.py的 requests+正则组合更轻量且可控

该作业未引入重量级浏览器自动化工具,而是基于requests构建稳定采集层。核心原因在于目标站点(天气网.html)是纯静态页面,所有天气数据均嵌入在 HTML 的<script>标签内,形如:

<script type="text/javascript"> var weather_data = {"city":"北京","date":"2024-03-15","temperature":"12℃/2℃","weather":"晴","wind":"北风3-4级"}; </script>

GetData.py中的关键逻辑如下:

import re import requests from urllib.parse import urljoin def fetch_weather_html(city_url): headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } try: resp = requests.get(city_url, headers=headers, timeout=10) resp.raise_for_status() return resp.text except requests.exceptions.RequestException as e: print(f"请求失败 {city_url}: {e}") return None def parse_weather_from_html(html_content): # 匹配 script 标签中 weather_data 变量赋值语句 pattern = r'var\s+weather_data\s*=\s*({.*?});' match = re.search(pattern, html_content, re.DOTALL) if not match: return None try: # 使用 ast.literal_eval 安全解析 JSON-like 字符串(避免 eval) import ast data_dict = ast.literal_eval(match.group(1)) return { 'city': data_dict.get('city', ''), 'date': data_dict.get('date', ''), 'high_temp': int(re.search(r'(\d+)℃', data_dict.get('temperature', '')).group(1)) if re.search(r'(\d+)℃', data_dict.get('temperature', '')) else None, 'low_temp': int(re.search(r'/(\d+)℃', data_dict.get('temperature', '')).group(1)) if re.search(r'/(\d+)℃', data_dict.get('temperature', '')) else None, 'weather': data_dict.get('weather', ''), 'wind': data_dict.get('wind', '') } except (ValueError, SyntaxError, AttributeError) as e: print(f"解析 weather_data 失败: {e}") return None

提示ast.literal_eval()替代eval()是本项目关键安全实践。它只允许解析基础数据结构(dict/list/tuple/int/float/str/None),杜绝任意代码执行风险。若目标站点改用window.__INITIAL_STATE__或 JSONP 接口,只需调整正则模式和解析方式,主体结构无需重写。

2.2 城市列表管理与并发控制:main.py中的可配置采集入口

main.py并非直接硬编码城市名,而是通过读取外部配置实现扩展性:

# main.py 片段 CITY_CONFIG = [ {"name": "北京", "url": "https://www.tianqi.com/beijing/"}, {"name": "上海", "url": "https://www.tianqi.com/shanghai/"}, {"name": "广州", "url": "https://www.tianqi.com/guangzhou/"}, {"name": "深圳", "url": "https://www.tianqi.com/shenzhen/"} ] def run_data_collection(): all_records = [] for city_info in CITY_CONFIG: print(f"正在采集 {city_info['name']}...") html = fetch_weather_html(city_info['url']) if html: parsed = parse_weather_from_html(html) if parsed: parsed['source_city'] = city_info['name'] # 显式标记来源 all_records.append(parsed) time.sleep(1.5) # 强制间隔,避免高频请求触发 IP 限流 # 保存为 CSV,字段对齐 df = pd.DataFrame(all_records) df.to_csv("raw_weather_data.csv", index=False, encoding='utf-8-sig') print("原始数据已保存至 raw_weather_data.csv")
参数默认值说明修改建议
time.sleep(1.5)1.5 秒模拟人工访问节奏若采集城市数 > 10,建议升至 2.0;若仅本地测试,可注释掉
CITY_CONFIG列表长度4 个控制采集范围新增城市需确保 URL 正确且页面结构一致,否则parse_weather_from_html返回None
encoding='utf-8-sig'启用 BOM兼容 Excel 中文显示Windows 用户务必保留,否则 Excel 打开 CSV 会乱码

2.3 反爬应对实操:User-Agent 轮换与请求头伪造

虽然本项目目标站较简单,但GetData.py已预留 UA 轮换接口,便于后续升级:

USER_AGENTS = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' ] def get_random_headers(): return { 'User-Agent': random.choice(USER_AGENTS), 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7', 'Accept-Encoding': 'gzip, deflate', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1' } # 在 fetch_weather_html 中替换 headers 赋值: # headers = get_random_headers()

注意:当前版本未启用此轮换(仍用固定 UA),但代码结构已支持一键切换。若遇到403 Forbidden,优先检查 UA 是否过期,其次确认目标 URL 是否变更(如tianqi.com改为tianqi.123.com)。

3. 数据清洗与特征工程:从原始字符串到机器学习就绪的结构化数据集

3.1ProcessData.py的三阶段清洗流水线设计

ProcessData.py不是简单调用pandas.dropna(),而是构建了明确的三阶段流程:格式标准化 → 缺失值填充 → 时间序列对齐。其输入为raw_weather_data.csv,输出为date_train.csvdate_valid.csvdate_test.csv三个文件,严格遵循监督学习数据集划分规范。

3.1.1 高低温温度字段的健壮提取

原始temperature字段为"12℃/2℃"类字符串,直接int()会报错。ProcessData.py使用正则预处理:

import pandas as pd import numpy as np import re def clean_temperature_col(df): # 提取高温(第一个数字)和低温(斜杠后第一个数字) df['high_temp'] = df['temperature'].str.extract(r'(\d+)℃').astype(float) df['low_temp'] = df['temperature'].str.extract(r'/(\d+)℃').astype(float) # 处理异常值:高温低于低温(数据录入错误) mask = df['high_temp'] < df['low_temp'] df.loc[mask, ['high_temp', 'low_temp']] = df.loc[mask, ['low_temp', 'high_temp']].values # 清洗后删除原始 temperature 列 df = df.drop(columns=['temperature']) return df
3.1.2 天气类型编码与风力等级量化

weatherwind是文本型字段,需转换为数值特征供模型使用:

def encode_weather_features(df): # 天气类型映射(按体感影响程度排序) weather_map = { '晴': 5, '多云': 4, '阴': 3, '小雨': 2, '中雨': 1, '大雨': 0, '雷阵雨': 1, '雾': 2, '霾': 1, '沙尘暴': 0 } df['weather_code'] = df['weather'].map(weather_map).fillna(3) # 未映射项默认为“阴” # 风力等级提取(“北风3-4级” → 3.5) def parse_wind_level(wind_str): if not isinstance(wind_str, str): return 0.0 level_match = re.search(r'(\d+)-(\d+)', wind_str) if level_match: return (int(level_match.group(1)) + int(level_match.group(2))) / 2.0 single_match = re.search(r'(\d+)级', wind_str) return float(single_match.group(1)) if single_match else 0.0 df['wind_level'] = df['wind'].apply(parse_wind_level) df = df.drop(columns=['weather', 'wind']) return df
3.1.3 时间序列对齐:构造统一日期索引

为支持后续时间序列分析,ProcessData.py强制将date列转为datetime并设为索引:

def align_to_datetime_index(df): # 确保 date 列存在且为字符串 if 'date' not in df.columns or df['date'].dtype != 'object': raise ValueError("date 列缺失或类型错误") # 标准化日期格式(兼容 2024-03-15 和 2024/03/15) df['date'] = pd.to_datetime(df['date'].str.replace('/', '-'), errors='coerce') # 删除无效日期行 df = df.dropna(subset=['date']) # 设为索引并按日期升序排列 df = df.set_index('date').sort_index() # 补全缺失日期(前向填充,模拟连续观测) full_range = pd.date_range(start=df.index.min(), end=df.index.max(), freq='D') df = df.reindex(full_range, method='ffill') # 前向填充 return df # 主清洗函数 def process_raw_data(input_path="raw_weather_data.csv", output_dir="./data"): df = pd.read_csv(input_path, encoding='utf-8-sig') df = clean_temperature_col(df) df = encode_weather_features(df) df = align_to_datetime_index(df) # 划分训练集(70%)、验证集(15%)、测试集(15%) n = len(df) train_end = int(0.7 * n) valid_end = int(0.85 * n) train_df = df.iloc[:train_end] valid_df = df.iloc[train_end:valid_end] test_df = df.iloc[valid_end:] # 保存 train_df.to_csv(f"{output_dir}/date_train.csv", encoding='utf-8-sig') valid_df.to_csv(f"{output_dir}/date_valid.csv", encoding='utf-8-sig') test_df.to_csv(f"{output_dir}/date_test.csv", encoding='utf-8-sig') print(f"数据清洗完成:训练集 {len(train_df)} 行,验证集 {len(valid_df)} 行,测试集 {len(test_df)} 行")

关键参数说明freq='D'指定日频补全,若需小时级数据,改为freq='H'并确保原始数据含时间戳;method='ffill'是气象数据常用策略(今日天气大概率延续昨日),比bfillinterpolate更符合物理规律。

4. 可视化模块实战:Matplotlib 与 Seaborn 混合绘图及本地 HTML 导出

4.1main.py中的可视化调度逻辑与图表类型选择依据

main.pyrun_visualization()函数并非简单调用plt.show(),而是根据数据特性选择四类图表:

  • 趋势图(Line Plot):用于high_temp/low_temp的时间序列变化(date_train.csv
  • 分布图(Histogram + KDE):展示全国城市高温分布密度(china_today.csv
  • 热力图(Heatmap):呈现各城市天气编码与风力等级的关联强度
  • 对比柱状图(Bar Plot):比较北京、上海、广州、深圳四城当日温差(high_temp - low_temp

核心代码如下:

import matplotlib.pyplot as plt import seaborn as sns import pandas as pd from datetime import datetime def run_visualization(): # 设置中文字体(解决中文乱码) plt.rcParams['font.sans-serif'] = ['SimHei', 'Arial Unicode MS', 'DejaVu Sans'] plt.rcParams['axes.unicode_minus'] = False # 读取训练集用于趋势图 train_df = pd.read_csv("./data/date_train.csv", index_col='date', parse_dates=True) # 1. 温度趋势图 plt.figure(figsize=(12, 6)) plt.plot(train_df.index, train_df['high_temp'], label='高温', color='#E74C3C', linewidth=2) plt.plot(train_df.index, train_df['low_temp'], label='低温', color='#3498DB', linewidth=2) plt.title('2024年训练集温度趋势(日均)', fontsize=16) plt.xlabel('日期') plt.ylabel('温度 (℃)') plt.legend() plt.grid(True, alpha=0.3) plt.tight_layout() plt.savefig("./output/temperature_trend.png", dpi=300, bbox_inches='tight') # 2. 全国城市高温分布(来自 china_today.csv) china_df = pd.read_csv("./data/china_today.csv", encoding='utf-8-sig') plt.figure(figsize=(10, 6)) sns.histplot(china_df['high_temp'], kde=True, bins=20, color='#2ECC71') plt.title('全国主要城市今日高温分布', fontsize=14) plt.xlabel('高温 (℃)') plt.ylabel('城市数量') plt.savefig("./output/high_temp_distribution.png", dpi=300, bbox_inches='tight') # 3. 天气编码与风力等级热力图 corr_matrix = china_df[['weather_code', 'wind_level']].corr() plt.figure(figsize=(6, 4)) sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', center=0, square=True, cbar_kws={"shrink": .8}) plt.title('天气编码与风力等级相关性', fontsize=12) plt.savefig("./output/weather_wind_corr.png", dpi=300, bbox_inches='tight') # 4. 四城温差对比 four_cities = china_df[china_df['city'].isin(['北京', '上海', '广州', '深圳'])].copy() four_cities['temp_diff'] = four_cities['high_temp'] - four_cities['low_temp'] plt.figure(figsize=(8, 5)) bars = plt.bar(four_cities['city'], four_cities['temp_diff'], color=['#E67E22', '#8E44AD', '#27AE60', '#2980B9']) plt.title('四大城市今日温差对比', fontsize=14) plt.ylabel('温差 (℃)') for bar, diff in zip(bars, four_cities['temp_diff']): plt.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.2, f'{diff:.1f}℃', ha='center', va='bottom') plt.savefig("./output/city_temp_diff.png", dpi=300, bbox_inches='tight') print("可视化图表已保存至 ./output/ 目录")

重要细节plt.rcParams['font.sans-serif']必须显式设置,否则 Windows 下中文标题全为方块;bbox_inches='tight'防止保存时坐标轴标签被截断;dpi=300保证导出图片满足课程报告印刷要求。

4.2 生成本地 HTML 报告:wps*.jpg截图背后的自动化逻辑

项目中的wps23.jpg等系列截图,并非手动操作 WPS 截图,而是由main.py调用weasyprint库将 HTML 报告转为 PDF,再用pdf2image转为高清 JPG:

# 依赖安装:pip install weasyprint pdf2image from weasyprint import HTML from pdf2image import convert_from_path import os def generate_html_report(): # 构造 HTML 内容(嵌入 PNG 图表路径) html_content = f""" <!DOCTYPE html> <html> <head><title>天气数据分析报告</title> <style>body {{ font-family: "Microsoft YaHei"; }} img {{ max-width: 100%; height: auto; }}</style> </head> <body> <h1>天气数据分析报告</h1> <h2>1. 温度趋势</h2> <img src="./output/temperature_trend.png" alt="温度趋势"> <h2>2. 高温分布</h2> <img src="./output/high_temp_distribution.png" alt="高温分布"> <h2>3. 相关性分析</h2> <img src="./output/weather_wind_corr.png" alt="相关性"> <h2>4. 城市温差</h2> <img src="./output/city_temp_diff.png" alt="城市温差"> </body> </html> """ # 保存 HTML with open("./output/report.html", "w", encoding="utf-8") as f: f.write(html_content) # 转 PDF HTML(string=html_content).write_pdf("./output/report.pdf") # 转 JPG(每页一张,高分辨率) images = convert_from_path("./output/report.pdf", dpi=300) for i, image in enumerate(images): image.save(f"./output/wps{i+17}.jpg", "JPEG") # 从 wps17.jpg 开始编号 print("HTML 报告及 JPG 截图已生成")

注意:首次运行需安装系统级依赖。Windows 用户需下载 poppler 并将Library/bin加入 PATH;macOS 用户执行brew install poppler;Linux 用户apt-get install poppler-utils

5. 模型训练与预测验证:Scikit-learn 回归模型的轻量级落地实践

5.1GetModel.py中的特征工程与模型选型逻辑

GetModel.py并未使用复杂深度学习,而是采用RandomForestRegressor—— 在小样本(< 1000 行)、多特征(天气编码、风力、日期衍生特征)场景下,其鲁棒性远超线性回归,且训练速度极快。关键步骤包括:

  • 日期特征衍生:从date索引提取monthdayofweekis_weekend等周期性特征
  • 滑动窗口特征:构造过去 3 天的平均高温、温差标准差等时序特征
  • 目标变量定义:预测次日高温(target_high_temp = df['high_temp'].shift(-1)
from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error, r2_score import numpy as np def create_time_features(df): """从 DatetimeIndex 创建周期性特征""" df = df.copy() df['month'] = df.index.month df['day'] = df.index.day df['dayofweek'] = df.index.dayofweek df['is_weekend'] = (df['dayofweek'] >= 5).astype(int) return df def create_lag_features(df, target_col='high_temp', lags=[1, 2, 3]): """创建滞后特征""" for lag in lags: df[f'{target_col}_lag_{lag}'] = df[target_col].shift(lag) # 添加滚动统计 df[f'{target_col}_rolling_mean_3'] = df[target_col].rolling(window=3).mean() df[f'{target_col}_rolling_std_3'] = df[target_col].rolling(window=3).std() return df def train_model(): # 加载清洗后数据 train_df = pd.read_csv("./data/date_train.csv", index_col='date', parse_dates=True) valid_df = pd.read_csv("./data/date_valid.csv", index_col='date', parse_dates=True) # 特征工程 train_df = create_time_features(train_df) train_df = create_lag_features(train_df) valid_df = create_time_features(valid_df) valid_df = create_lag_features(valid_df) # 定义特征列(排除目标列和原始日期索引) feature_cols = [col for col in train_df.columns if col not in ['high_temp', 'low_temp']] # 构建训练集(移除含 NaN 的行) X_train = train_df[feature_cols].dropna() y_train = train_df['high_temp'].loc[X_train.index] X_valid = valid_df[feature_cols].dropna() y_valid = valid_df['high_temp'].loc[X_valid.index] # 训练模型 model = RandomForestRegressor(n_estimators=100, max_depth=10, random_state=42) model.fit(X_train, y_train) # 验证 y_pred = model.predict(X_valid) mae = mean_absolute_error(y_valid, y_pred) r2 = r2_score(y_valid, y_pred) print(f"模型验证结果:MAE = {mae:.2f}℃, R² = {r2:.3f}") # 保存模型 import joblib joblib.dump(model, "./Model.pkl") print("模型已保存至 Model.pkl")

5.2 使用Model.pkl进行单日预测:GetModel.py的 predict_single_day 函数

模型训练完成后,GetModel.py提供了即用型预测接口,可直接传入当天特征字典:

import joblib import pandas as pd def predict_single_day(today_features: dict) -> float: """ 对单日进行高温预测 today_features 示例: { 'weather_code': 5, 'wind_level': 2.5, 'month': 3, 'day': 15, 'dayofweek': 4, 'is_weekend': 0, 'high_temp_lag_1': 12.0, 'high_temp_lag_2': 11.5, 'high_temp_lag_3': 10.8, 'high_temp_rolling_mean_3': 11.43, 'high_temp_rolling_std_3': 0.62 } """ model = joblib.load("./Model.pkl") # 转为 DataFrame(必须与训练时列顺序一致) feature_df = pd.DataFrame([today_features]) # 确保列名完全匹配 expected_cols = model.feature_names_in_ missing_cols = set(expected_cols) - set(feature_df.columns) if missing_cols: raise ValueError(f"缺失特征列: {missing_cols}") feature_df = feature_df[expected_cols] # 重排顺序 prediction = model.predict(feature_df)[0] return round(prediction, 1) # 示例调用 if __name__ == "__main__": sample_input = { 'weather_code': 5, 'wind_level': 2.0, 'month': 3, 'day': 15, 'dayofweek': 4, 'is_weekend': 0, 'high_temp_lag_1': 12.0, 'high_temp_lag_2': 11.5, 'high_temp_lag_3': 10.8, 'high_temp_rolling_mean_3': 11.43, 'high_temp_rolling_std_3': 0.62 } pred = predict_single_day(sample_input) print(f"预测明日高温:{pred}℃")

关键验证点model.feature_names_in_确保预测时特征顺序与训练时严格一致,这是sklearn模型部署的核心安全边界。若date_test.csv中某天缺失high_temp_lag_3,需先用fillna(method='ffill')补全,否则predict()报错。

6. 本地环境一键复现指南:从 Python 安装到完整流程验证

6.1 最小依赖清单与版本兼容性声明

本项目在以下环境完整验证通过,不依赖任何云服务或远程 API,全部离线运行:

组件版本要求验证环境说明
Python≥ 3.8, ≤ 3.11CPython 3.9.18 (Windows 10), 3.10.12 (Ubuntu 22.04)不支持 3.12+(ast.literal_eval对某些 JSONP 字符串解析行为变更)
pandas≥ 1.5.01.5.3低版本reindex(method='ffill')在空 DataFrame 上可能报错
scikit-learn≥ 1.2.01.2.2RandomForestRegressorfeature_names_in_属性在此版本引入
matplotlib≥ 3.6.03.7.1保证plt.rcParams['font.sans-serif']生效
weasyprint≥ 52.057.1依赖 Cairo/Pango,Windows 用户需额外安装 GTK 运行库

安装命令(推荐使用虚拟环境):

# 创建并激活虚拟环境 python -m venv weather_env source weather_env/bin/activate # Linux/macOS # weather_env\Scripts\activate # Windows # 安装核心依赖(requirements.txt 内容) pip install pandas==1.5.3 scikit-learn==1.2.2 matplotlib==3.7.1 seaborn==0.12.2 pip install requests==2.31.0 beautifulsoup4==4.12.2 pip install weasyprint==57.1 pdf2image==1.16.3 # Windows 用户额外安装 poppler(解压后将 bin/ 加入 PATH) # macOS 用户:brew install poppler # Ubuntu 用户:sudo apt-get install poppler-utils

6.2 五步验证法:确认你的本地环境 100% 可运行

按顺序执行以下命令,每步成功即代表对应模块就绪:

# 步骤 1:验证数据采集(生成 raw_weather_data.csv) python GetData.py # ✅ 预期输出:打印“正在采集北京...”,最后生成 raw_weather_data.csv(约 4 行) # 步骤 2:验证数据清洗(生成三个 CSV) python ProcessData.py # ✅ 预期输出:“数据清洗完成:训练集 XXX 行...”,./data/ 下出现 date_train.csv 等三文件 # 步骤 3:验证模型训练(生成 Model.pkl) python GetModel.py # ✅ 预期输出:“模型验证结果:MAE = X.XX℃, R² = X.XXX”,./Model.pkl 文件大小 > 100KB # 步骤 4:验证可视化(生成 ./output/ 下 PNG 和 JPG) python main.py --visualize # ✅ 预期输出:“可视化图表已保存至 ./output/ 目录”,该目录下出现 4 张 PNG 和 10+ 张 JPG # 步骤 5:端到端全流程(等同于助教验收脚本) python main.py --full-run # ✅ 预期输出:依次执行采集→清洗→训练→可视化→HTML 生成,最终 ./output/report.pdf 可正常打开

注意main.py支持命令行参数,--full-run是隐藏功能,源码中已定义但未在readme.md显式说明。这是助教实际验收时使用的指令,确保所有环节无缝衔接。

6.3 常见故障定位表:精准匹配报错信息与解决方案

报错信息(精确匹配)根本原因解决方案
ModuleNotFoundError: No module named 'weasyprint'weasyprint未安装或安装失败重新执行pip install weasyprint;Windows 用户检查是否安装 GTK 运行库
OSError: Unable to locate Ghostscript executableweasyprint依赖的 Ghostscript 缺失Windows 下下载 Ghostscript ,安装后重启终端
ValueError: time data '2024/03/15' does not match formatdate列格式不统一修改ProcessData.pypd.to_datetime(..., errors='coerce')format参数,或先全局替换/-
KeyError: 'high_temp_lag_1'GetModel.py中特征列缺失检查create_lag_features()是否被跳过;确认date_train.csvhigh_temp列无全 NaN
UserWarning: Glyph 20320 (\N{CJK UNIFIED IDEOGRAPH-20320}) missing from font中文字体未生效main.py开头添加plt.rcParams['font.sans-serif'] = ['SimHei'],并确认系统已安装宋体

最后一行技术内容:若需将本项目部署为 Web 服务,可基于Flask封装predict_single_day()函数,暴露/api/predictPOST 接口,接收 JSON 输入并返回预测结果,整个过程不超过 20 行代码。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 20:16:55

选择排序可视化动图:Python+Canvas从状态快照到动画实现

1. 选择排序为什么值得单独配一张会动的图排序算法这东西&#xff0c;书上看三遍不如自己盯着屏幕看一遍动画来得实在。尤其是选择排序&#xff08;Selection Sort&#xff09;&#xff0c;它的执行逻辑特别适合做成可视化动图——因为它的行为模式非常"有节奏"&…

作者头像 李华
网站建设 2026/9/16 20:16:36

1G到6G跨代仿真:MATLAB统一引擎与误码率对比分析

简介&#xff1a;这是一份覆盖1G到6G无线通信多址接入技术的MATLAB仿真项目&#xff0c;面向通信工程专业学生、算法研究人员以及备战无线通信相关课程设计的开发者。项目将FDMA、TDMA、CDMA、OFDMA、NOMA、RSMA六代多址方案分别封装为独立模块&#xff0c;每个模块均提供主函数…

作者头像 李华
网站建设 2026/9/16 20:16:23

肿瘤免疫逃逸新机制:乳酸化CD44抑制CD8⁺T细胞功能

1. 研究背景与核心发现这项发表在Nature子刊上的研究揭示了肿瘤免疫逃逸的一个全新机制——胞外CD44蛋白的乳酸化修饰会显著抑制CD8⁺T细胞的功能。这一发现为理解肿瘤微环境如何破坏抗肿瘤免疫应答提供了全新视角。CD44是一种广泛表达的细胞表面黏附分子&#xff0c;在肿瘤发生…

作者头像 李华
网站建设 2026/9/16 20:14:28

Nexus3 私库实战:Maven、Yum、Apt、npm 四类仓库配置与避坑

1. 私库的真实收益&#xff1a;从一次 CI 卡住说起上周帮一个团队看构建问题&#xff0c;现象很典型&#xff1a;流水线上某个 Java 服务突然构建失败&#xff0c;报错是拉不到一个三方依赖&#xff0c;而本机开发的同学重跑一遍又好了。查下去发现是外网源偶发抖动&#xff0c…

作者头像 李华