ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

重庆天气爬虫与机器学习分析作业包:从数据采集到AQI预测全流程

重庆天气爬虫与机器学习分析作业包:从数据采集到AQI预测全流程 简介这份资源面向计算机、电子信息工程、数学等专业的大学生适用于课程设计、期末大作业与毕业设计场景围绕重庆天气数据爬取与空气质量分析展开将机器学习方法落地到真实城市气象数据上。压缩包共6个文件包含3个py源码与3个xlsx数据表整体约369KB源码覆盖爬虫采集、数据读取与预测建模等环节数据表则提供重庆天气与空气质量等原始及合并数据便于直接复现实验流程。代码采用参数化编程参数修改方便注释清晰编程思路明确并附有运行结果均经过测试运行成功后才上传可减少环境配置与调试成本。目前已有367人学习下载说明该案例在同类作业中具有一定参考价值。读者可据此获得一套完整的爬虫加分析加预测实践方案理解从数据获取、清洗到建模预测的完整链路并借鉴其代码组织与排错思路快速完成自己的课程作业或毕业设计。1. 重庆天气数据这套作业包到底能帮你省下多少时间如果你正在做机器学习课程作业选题是天气质量分析又不想从零写爬虫、清洗数据、调模型、补文档那这套「重庆天气爬虫 天气质量分析 源代码 文档说明」的资源包基本就是冲着你来的。它把一条完整链路打包好了用 Python 爬虫抓重庆的历史天气与空气质量数据用 SQLAlchemy 落库再做特征工程和机器学习建模分析。适合两类人一类是刚入门机器学习、需要一份能跑通的完整项目撑起作业的人另一类是想看看别人怎么把爬虫和建模串成工程的人。我拆过不少类似的课程作业包大多数问题不在算法而在数据管道和文档对不上这套资源的价值恰恰在于它把这两块都覆盖了。2. 爬虫与数据落库从请求构造到 SQLAlchemy 入库2.1 为什么选 requests SQLAlchemy 而不是直接存 CSV天气数据是典型的时间序列结构化数据字段固定、按天或按小时递增。很多同学第一反应是爬完直接to_csv跑一次没问题但一旦要增量更新、按城市筛选、做多表关联CSV 就会变成负担。这套资源用 SQLAlchemy 做 ORM 映射好处是表结构显式定义字段类型可控后续用 pandas 读取时直接read_sql就能接上建模流程。常见做法是定义一张weather表字段包括日期、最高温、最低温、天气状况、风向风力、AQI、PM2.5、PM10 等。重庆是山城湿度高、雾天多空气质量数据里 PM2.5 和 AQI 的波动比平原城市更值得分析这也是这个选题比一般「北京天气」更有区分度的地方。2.2 爬虫请求构造与分页处理下面这段是典型的请求构造逻辑我按资源里常见的写法整理成可直接套用的骨架import requests import time from sqlalchemy import create_engine, Column, Integer, String, Float, Date from sqlalchemy.orm import declarative_base, sessionmaker Base declarative_base() class WeatherRecord(Base): __tablename__ chongqing_weather id Column(Integer, primary_keyTrue, autoincrementTrue) date Column(Date, nullableFalse) high_temp Column(Float) low_temp Column(Float) weather Column(String(50)) wind Column(String(50)) aqi Column(Integer) pm25 Column(Float) pm10 Column(Float) engine create_engine(sqlite:///chongqing_weather.db, echoFalse) Base.metadata.create_all(engine) Session sessionmaker(bindengine) def fetch_page(year, month): url https://example-weather-site.com/history params {city: chongqing, year: year, month: month} headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)} resp requests.get(url, paramsparams, headersheaders, timeout10) resp.raise_for_status() return resp.json() def save_records(records): session Session() for item in records: row WeatherRecord( dateitem[date], high_tempitem[high], low_tempitem[low], weatheritem[weather], winditem[wind], aqiitem.get(aqi), pm25item.get(pm25), pm10item.get(pm10) ) session.add(row) session.commit() session.close()逻辑说明WeatherRecord类把表结构写死在代码里避免字段漂移fetch_page用params传参而不是拼 URL方便改年份月份save_records每次 commit 一批不要一条一条 commit否则写入速度会慢到让你怀疑人生。参数上timeout10是必须的天气站点响应不稳定不设超时容易卡死User-Agent要带否则部分站点直接返回 403。2.3 增量抓取与去重策略爬历史天气最怕重复入库。常见做法是在date字段上加唯一约束或者入库前先查一次def upsert_record(session, item): exists session.query(WeatherRecord).filter_by(dateitem[date]).first() if exists: exists.high_temp item[high] exists.low_temp item[low] exists.aqi item.get(aqi) else: session.add(WeatherRecord(**item)) session.commit()这段逻辑适合按月补抓的场景。如果你一次抓一整年建议先按月份分页每抓完一个月就 commit 一次中间加time.sleep(1)别把对方站点打挂。重庆天气数据在夏季常有强对流部分日期数据可能缺失入库时nullableTrue的字段要允许空值否则整批插入会失败。3. 天气质量分析从特征工程到机器学习建模3.1 特征怎么构造才有分析价值原始天气数据只有日期和几个数值字段直接丢给模型效果一般。这套资源里常见的特征构造包括把日期拆成月份、季度、是否周末把天气状况做 one-hot 编码用滑动窗口算前 3 天 AQI 均值构造温度日较差最高温减最低温。重庆夏天闷热、冬天湿冷温度日较差和湿度相关特征对 AQI 预测的贡献往往比单纯看温度更大。import pandas as pd df pd.read_sql(SELECT * FROM chongqing_weather, engine) df[date] pd.to_datetime(df[date]) df[month] df[date].dt.month df[quarter] df[date].dt.quarter df[temp_range] df[high_temp] - df[low_temp] df[aqi_lag3] df[aqi].shift(3) df[aqi_ma7] df[aqi].rolling(window7).mean() df df.dropna()shift(3)取前 3 天 AQIrolling(7).mean()取 7 天滑动均值这两个特征在时间序列预测里很常用。注意dropna()会丢掉前几行如果数据量本来就少可以改用fillna(methodbfill)补。3.2 模型选择与评估指标课程作业里常见的模型是线性回归、决策树、随机森林。如果目标是预测 AQI 数值用回归如果是分档优、良、轻度污染用分类。这套资源一般会给出随机森林的 baseline因为它在小数据集上不容易过拟合且能输出特征重要性。from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split from sklearn.metrics import mean_absolute_error, r2_score features [high_temp, low_temp, temp_range, month, aqi_lag3, aqi_ma7] X df[features] y df[aqi] X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) model RandomForestRegressor(n_estimators100, max_depth8, random_state42) model.fit(X_train, y_train) pred model.predict(X_test) print(MAE:, mean_absolute_error(y_test, pred)) print(R2:, r2_score(y_test, pred))n_estimators100是常见起点max_depth8控制树深防止过拟合。评估时 MAE 比 MSE 更直观R2 看整体拟合。如果 R2 低于 0.5先检查特征里有没有泄漏比如把当天 AQI 本身当特征再检查数据量是否太少。3.3 可视化与文档说明的对应关系资源里的文档说明通常会要求画出 AQI 随时间变化曲线、特征重要性条形图、预测值与真实值对比图。用 matplotlib 就能出import matplotlib.pyplot as plt plt.figure(figsize(12, 4)) plt.plot(df[date], df[aqi], labelAQI) plt.plot(df[date], df[aqi_ma7], label7-day MA, linestyle--) plt.legend() plt.title(Chongqing AQI Trend) plt.tight_layout() plt.savefig(aqi_trend.png, dpi150)文档里如果写了「分析重庆空气质量季节性变化」这张图就是直接证据。注意dpi150保证截图清晰课程报告里图片糊了会被扣分。4. 避坑与常见问题排查4.1 爬虫返回空数据或 403现象请求状态码 200但解析出来是空列表。原因站点对无User-Agent或高频请求做了限制。解决补全headers加time.sleep(1)必要时换用requests.Session()保持会话。4.2 SQLAlchemy 入库报字段类型错误现象sqlite3.InterfaceError: Error binding parameter。原因爬下来的数值字段混入了--或空字符串。解决入库前做类型转换float(x) if x not in (, --) else None。4.3 模型 R2 为负数现象测试集 R2 小于 0。原因特征和标签没有实际关系或者训练集测试集划分时时间顺序被打乱。解决时间序列数据不要用随机划分改用按时间切分前 80% 训练后 20% 测试。4.4 文档说明与代码不一致现象文档里写的字段名和代码里对不上。原因资源包更新过但文档没同步。解决以代码为准跑一遍df.columns看实际字段再回改文档。4.5 中文乱码现象图表标题或 CSV 里中文变方块。原因matplotlib 默认字体不支持中文。解决plt.rcParams[font.sans-serif] [SimHei]Windows 下一般可用。5. 进阶技巧把这份作业包改成能写进简历的项目如果你只想交作业前面几章够用了。但如果你想让它变成简历上能讲的东西我一般会做三件事。第一把 SQLite 换成 MySQL 或 PostgreSQL用create_engine(mysqlpymysql://...)接上这样能讲「数据持久化选型」。第二把随机森林换成 XGBoost 或 LightGBM加一段GridSearchCV调参哪怕提升不大面试时能讲清楚为什么换。第三加一个简单的 Flask 接口把预测结果暴露成/predict?date2024-06-01这样项目就从「课程作业」变成「有服务端的小系统」。from flask import Flask, request, jsonify import joblib app Flask(__name__) model joblib.load(rf_model.pkl) app.route(/predict, methods[GET]) def predict(): features [[ float(request.args.get(high_temp)), float(request.args.get(low_temp)), float(request.args.get(temp_range)), int(request.args.get(month)), float(request.args.get(aqi_lag3)), float(request.args.get(aqi_ma7)) ]] result model.predict(features)[0] return jsonify({predicted_aqi: round(result, 2)}) if __name__ __main__: app.run(debugTrue)这段代码的关键是joblib.load把训练好的模型序列化后直接加载不用每次启动都重新训练。参数通过request.args拿方便浏览器直接测。注意debugTrue只在本机用部署时要关掉。验证方法很简单拿最近 7 天的真实数据跑一遍看预测 AQI 和实际值差多少。如果 MAE 在 15 以内说明模型基本可用超过 30回去检查特征里有没有把当天信息泄漏进去。从那以后我每次拿到这种课程作业包都强制先跑一遍数据管道确认爬虫能出数、入库不报错、模型能出图再去看文档写了什么。顺序反了后面全是返工。希望帮到你。本文还有配套的精品资源点击获取
返回列表