简介这份Python源码项目围绕流感时间序列预测展开整合ARIMA、SARIMA、LSTM与Transformer等多类模型面向计算机相关专业正在做课程设计、期末大作业或需要项目实战练习的学习者帮助其完成从数据平稳性检验、差分处理到模型估计、残差分析与多模型对比的完整建模流程。资源包共25个文件包含7个py脚本、7个csv数据集、4个xls表格、2个ipynb笔记本及5个zip压缩文件整体约4.93MB脚本与笔记本对应建模各阶段数据文件支撑训练与验证结构清晰便于按模块查阅。目前已有387人学习下载可作为高分项目参考。读者可据此掌握时间序列预测的完整赛题方案理解ARIMA与深度学习模型的组合思路、评估对比方法及排错要点适合作为课程设计模板或实战练习素材。1. 从一份 98 分课设拆开看流感时间序列预测到底在预测什么流感数据不是股票也不是电商销量它有两个很讨厌的性质强季节性北半球冬春高发和强噪声上报延迟、就诊行为变化。ILINet.csv 这类数据通常按周采样一条曲线里同时混着趋势、年周期和随机扰动。直接丢给 LSTM 让它端到端学往往在验证集上看着还行一到真实外推就崩。这份源码的价值不在于模型多花哨而在于它把 ARIMA 这条统计基线、LSTM 这条深度基线、Transformer 这条注意力基线放在同一条流水线上对比并且把平稳性检验、差分、ACF/PACF 定阶这些老派但必要的步骤单独拆成脚本。适合正在做课程设计、期末大作业或者想拿一个完整时间序列项目练手的人。目录结构里1_1_Stationarity_differencing.py到5_forecast.py是 ARIMA 主线lstm-flu.ipynb和sarima _v3.ipynb是两条对照线4_compare.py负责把结果拉到一起。下面按数据怎么变成可建模的序列 → ARIMA 怎么定阶 → LSTM/Transformer 怎么搭 → 怎么对比和排错的顺序拆。2. 数据预处理与平稳性检验差分、ADF、ACF/PACF 三件套2.1 ILINet.csv 的字段与建模目标拿到data/ILINet.csv先别急着画图先确认列名和采样频率。CDC 的 ILINet 数据一般包含DATE、% WEIGHTED ILI、%UNWEIGHTED ILI、AGE 0-4等列建模通常选% WEIGHTED ILI作为目标序列因为它按人口加权比未加权更稳定。加载时把日期列解析成索引并强制按周频率重采样避免中间缺周导致差分错位。import pandas as pd import numpy as np # 读取 ILINet 数据跳过表头里的说明行不同年份文件行数不同按实际调整 df pd.read_csv(data/ILINet.csv, skiprows1) df.columns [c.strip() for c in df.columns] # 只保留全国汇总行避免各州数据混入 df df[df[REGION TYPE] National].copy() df[DATE] pd.to_datetime(df[DATE]) df df.set_index(DATE).sort_index() # 目标序列加权 ILI 百分比 ts df[% WEIGHTED ILI].astype(float) ts ts.asfreq(W) # 强制周频率 ts ts.interpolate() # 少量缺周用线性插值补 print(ts.head(), ts.shape)skiprows1是因为原始 CSV 第一行常是元信息REGION TYPE National过滤掉州级行否则同一周会有几十条记录差分后完全没意义asfreq(W)把不规则日期对齐到周interpolate()只补少量缺口缺口太多要回头查数据源而不是硬插。2.2 平稳性检验ADF 与差分次数ARIMA 的d参数来自差分次数而差分次数要靠 ADF 检验说话。1_2_Stationarity_ADF.py做的就是这件事对原序列做 ADF若 p 值大于 0.05 就差分一次再检验直到平稳。常见做法是同时看 ADF 统计量和 p 值p 小于 0.05 且统计量小于 1% 临界值才算稳。from statsmodels.tsa.stattools import adfuller def adf_report(series, name): result adfuller(series.dropna(), autolagAIC) print(f{name}: ADF{result[0]:.4f}, p{result[1]:.4f}, flags{result[2]}, crit{result[4]}) adf_report(ts, 原始序列) adf_report(ts.diff(1), 一阶差分) adf_report(ts.diff(1).diff(1), 二阶差分)autolagAIC让 statsmodels 自动选滞后阶数比手写固定 lag 稳。流感序列一般一阶差分就够二阶差分容易过差分把信号差没。如果一阶差分后 p 值仍大先怀疑是不是有异常年份比如某年上报口径变了而不是无脑加d。2.3 ACF/PACF 定阶与2_estimate_pq.py的用法差分平稳后用 ACF 看 MA 阶数qPACF 看 AR 阶数p。1_3_Stationarity_ACF_PACF.py画图2_estimate_pq.py则用 AIC/BIC 网格搜索兜底。经验上 ACF 截尾在 lag k 则 q≈kPACF 截尾在 lag k 则 p≈k但流感数据拖尾常见所以网格搜索更靠谱。参数含义判断依据流感数据常见取值pAR 阶数PACF 截尾位置1~3d差分次数ADF 检验1qMA 阶数ACF 截尾位置1~2P,D,Q,s季节项年周期 s52P1,D0,Q1import itertools, warnings from statsmodels.tsa.statespace.sarimax import SARIMAX warnings.filterwarnings(ignore) best None for p, q in itertools.product(range(3), range(3)): try: m SARIMAX(ts, order(p, 1, q), seasonal_order(1, 0, 1, 52), enforce_stationarityFalse).fit(dispFalse) if best is None or m.aic best[0]: best (m.aic, p, q) except Exception: continue print(best AIC/p/q:, best)s52对应周数据的年周期这是流感预测的关键漏掉季节项模型基本废掉。enforce_stationarityFalse在网格搜索阶段能加快拟合但最终模型建议打开。搜索范围别开太大p、q 各到 3 已经够再大容易过拟合且拟合时间爆炸。提示ADF 检验对异常值敏感先画一眼原始曲线把明显的数据断点或口径变化年份标出来再决定是否截断训练区间。3. ARIMA/SARIMA 建模与残差诊断从3_residual.py看模型是否合格3.1 SARIMA 拟合与预测区间定好阶后用SARIMAX拟合完整模型5_forecast.py负责外推。预测时一定要拿get_forecast而不是predict因为前者带置信区间后者只给点估计。流感预测里区间比点值更有用评审老师也爱看。model SARIMAX(ts, order(1, 1, 1), seasonal_order(1, 0, 1, 52), enforce_stationarityTrue, enforce_invertibilityTrue) res model.fit(dispFalse) # 外推 12 周带 95% 置信区间 fc res.get_forecast(steps12) mean fc.predicted_mean ci fc.conf_int(alpha0.05) print(mean.head())steps12是预测周数按作业要求调整conf_int(alpha0.05)给 95% 区间。注意 SARIMA 长期外推区间会迅速变宽这是模型诚实的地方不要为了图好看把区间裁掉。3.2 残差诊断Ljung-Box 与残差正态性3_residual.py的核心是验证残差是不是白噪声。如果残差还有自相关说明模型没榨干信息。常用 Ljung-Box 检验p 值大于 0.05 才接受残差无自相关。from statsmodels.stats.diagnostic import acorr_ljungbox import scipy.stats as st lb acorr_ljungbox(res.resid, lags[10, 20], return_dfTrue) print(lb) # 残差正态性 stat, p st.normaltest(res.resid.dropna()) print(normaltest p:, p)lags[10,20]覆盖短中期自相关normaltest的 p 小于 0.05 说明残差非正态预测区间会偏但点预测仍可用。残差图里如果出现明显的周期性波动八成是季节项没定对回去调P、Q或s。3.3 常见报错与排查SARIMA 拟合最常见的两个坑一是LinAlgError: Singular matrix通常是差分过度或 p、q 太大导致矩阵奇异降阶即可二是收敛警告ConvergenceWarning可以换methodpowell或增大maxiter。另外s52时数据至少要两个完整年周期否则季节项估不出来这也是为什么流感数据一般从 2010 年之后取。4. LSTM 与 Transformer 对照实现lstm-flu.ipynb的滑窗与归一化4.1 滑窗构造与归一化LSTM 不吃原始序列要吃监督样本。lstm-flu.ipynb用滑动窗口把序列切成(样本数, 时间步, 特征数)。归一化必须只用训练集统计量否则验证集信息泄漏指标虚高。import numpy as np from sklearn.preprocessing import MinMaxScaler def make_windows(series, lookback12): X, y [], [] for i in range(len(series) - lookback): X.append(series[i:ilookback]) y.append(series[ilookback]) return np.array(X), np.array(y) split int(len(ts) * 0.8) train, test ts[:split], ts[split:] scaler MinMaxScaler() train_scaled scaler.fit_transform(train.values.reshape(-1, 1)).flatten() test_scaled scaler.transform(test.values.reshape(-1, 1)).flatten() X_train, y_train make_windows(train_scaled, lookback12) X_test, y_test make_windows(test_scaled, lookback12) X_train X_train.reshape(-1, 12, 1) X_test X_test.reshape(-1, 12, 1)lookback12表示用过去 12 周预测下一周正好覆盖一个季度fit_transform只在训练集上做测试集用transform这是时间序列里最容易写错的一行。reshape(-1,12,1)把二维样本变成 LSTM 需要的三维张量。4.2 LSTM 网络结构与训练参数from tensorflow.keras import layers, models model models.Sequential([ layers.LSTM(64, return_sequencesTrue, input_shape(12, 1)), layers.LSTM(32), layers.Dropout(0.2), layers.Dense(1) ]) model.compile(optimizeradam, lossmse) history model.fit(X_train, y_train, epochs50, batch_size16, validation_split0.1, verbose0)两层 LSTM 第一层return_sequencesTrue才能接第二层Dropout(0.2)抑制过拟合epochs50配合validation_split0.1观察早停。如果验证 loss 先降后升说明过拟合减层或加 dropout。4.3 Transformer 分支的位置编码与注意力Transformer 分支的关键是位置编码因为自注意力本身无序。transformer相关热词里问得最多的就是位置信息怎么算这里用标准正弦编码。import tensorflow as tf class PositionalEncoding(layers.Layer): def __init__(self, d_model): super().__init__() self.d_model d_model def call(self, x): seq_len tf.shape(x)[1] pos tf.range(seq_len, dtypetf.float32)[:, tf.newaxis] i tf.range(self.d_model, dtypetf.float32)[tf.newaxis, :] angle pos / tf.pow(10000.0, (2 * (i // 2)) / self.d_model) angle tf.where(i % 2 0, tf.sin(angle), tf.cos(angle)) return x angle[tf.newaxis, :, :]d_model是嵌入维度i // 2保证 sin/cos 成对出现。加完位置编码再进多头注意力。Transformer 在小样本周数据上不一定赢 LSTM它的优势在长依赖但流感序列长度有限所以4_compare.py里三者差距往往不大这本身就是个值得写进报告的结论。5. 多模型对比与结果复现4_compare.py的指标口径与踩坑5.1 统一评估口径对比 ARIMA、LSTM、Transformer 时最容易犯的错是各算各的指标。4_compare.py应该把三者预测值对齐到同一测试区间再统一算 MAE、RMSE、MAPE。from sklearn.metrics import mean_absolute_error, mean_squared_error def evaluate(y_true, y_pred, name): mae mean_absolute_error(y_true, y_pred) rmse np.sqrt(mean_squared_error(y_true, y_pred)) mape np.mean(np.abs((y_true - y_pred) / (y_true 1e-8))) * 100 print(f{name}: MAE{mae:.4f}, RMSE{rmse:.4f}, MAPE{mape:.2f}%) return mae, rmse, mape1e-8防止除零流感序列里偶尔有接近 0 的周。MAPE 在低值周会偏大报告里最好同时给 MAE 和 RMSE别只报 MAPE。5.2 反归一化与对齐LSTM/Transformer 输出是归一化后的值必须用同一个 scaler 反变换回原始量纲才能和 ARIMA 比。ARIMA 预测的是原始序列不需要反变换。对齐时注意 LSTM 的测试样本比原始测试段少lookback个点切片要对应。pred_lstm model.predict(X_test).flatten() pred_lstm_inv scaler.inverse_transform(pred_lstm.reshape(-1, 1)).flatten() y_test_inv scaler.inverse_transform(y_test.reshape(-1, 1)).flatten() # ARIMA 预测对齐到同一区间 arima_pred mean.values[:len(y_test_inv)] evaluate(y_test_inv, pred_lstm_inv, LSTM) evaluate(y_test_inv, arima_pred, SARIMA)5.3 复现环境与依赖vscode python环境配置是高频搜索词这份源码建议 Python 3.8~3.10核心依赖pandas、statsmodels、scikit-learn、tensorflow。statsmodels 和 tensorflow 对 numpy 版本敏感建议先建虚拟环境再装避免numpy.dtype size changed这类二进制不兼容报错。跑之前按1_1到5_forecast的顺序执行notebook 单独跑最后用4_compare.py汇总。注意如果 LSTM 指标好得离谱先查归一化是不是在全量数据上 fit 的这是时间序列作业里最隐蔽的泄漏。6. 进阶技巧用残差混合模型把 ARIMA 和 LSTM 串起来单模型各有短板ARIMA 抓线性季节LSTM 抓非线性残差。一个在课设里能加分的做法是混合建模——先用 SARIMA 拟合拿到残差再用 LSTM 去学残差里的非线性结构最后把两部分预测相加。3_residual.py已经把残差算出来了直接复用。# SARIMA 残差作为 LSTM 的新目标 resid res.resid.dropna().values scaler_r MinMaxScaler() resid_scaled scaler_r.fit_transform(resid.reshape(-1, 1)).flatten() Xr, yr make_windows(resid_scaled, lookback12) Xr Xr.reshape(-1, 12, 1) resid_model models.Sequential([ layers.LSTM(32, input_shape(12, 1)), layers.Dense(1) ]) resid_model.compile(optimizeradam, lossmse) resid_model.fit(Xr, yr, epochs30, batch_size16, verbose0) # 最终预测 SARIMA 点预测 LSTM 残差预测 resid_pred scaler_r.inverse_transform( resid_model.predict(Xr[-12:].reshape(-1, 12, 1)).reshape(-1, 1) ).flatten() final mean.values[:len(resid_pred)] resid_predresid是 SARIMA 没解释掉的部分LSTM 在这里只学残差任务更简单收敛更快。final把线性和非线性预测叠加通常比任一单模型稳。验证时仍用同一测试区间算 MAE/RMSE和4_compare.py里的单模型结果并排写进报告。另一个实用技巧是给 LSTM 输入加外生特征比如把AGE 0-4、AGE 65的 ILI 分列作为多变量输入input_shape从(12,1)改成(12,k)往往比调网络结构更有效。最后所有随机种子固定tf.random.set_seed(42)、np.random.seed(42)否则每次跑出来的对比表都不一样答辩时会被追问。本文还有配套的精品资源点击获取
企业数字化 ERP 产品动态
相关推荐
基于YOLOv5的路面桥梁裂缝检测项目实战解析 简介:基于PythonYolov5的路面桥梁裂缝检测识别资源,是一套可直接运行的毕业设计工程,面向计算机视觉、智能交通检测方向的学生与开发者,解决道路及桥梁表面裂缝快速检测问题。源码由作者毕业设计整理而来,经测试运行成… · 2026/9/23 2:40:21
2026最新bootcamp3.1面试通关:3个坑帮你搞定复制代码报错 2026最新bootcamp3.1面试通关:3个坑帮你搞定复制代码报错 刚把GitHub上那篇热帖的代码复制下来,运行直接报错?别慌,这种“复制即崩”的情况在2026最新的bootcamp3.1项目中极其常见。很多初学者盯着满屏红字发呆,不… · 2026/9/23 2:40:21
3个惨痛教训:搞懂cctv视频解码,图解原理让你少加班 3个惨痛教训:搞懂cctv视频解码,图解原理让你少加班 看了一堆教程还是不会写项目?是不是感觉视频流一到手里就崩?别慌,今天用图解原理拆解 cctv视频 处理中的死穴。 坑的现象:画面撕裂与音画不同步… · 2026/9/23 2:40:21
D3DHook源码解析:从vtable替换到透视矩阵修改实践 简介:这是一份用 C 编写的 Direct3D 钩子源码,主要解决游戏中透视功能的实现问题。程序通过拦截 D3D 渲染的关键函数,在运行时修改视图矩阵或投影矩阵,从而获得类似透视的视觉效果;适合具备一定 C 与图形学基础、正学习… · 2026/9/23 5:37:23
XML解析技术全解析:从基础到高性能优化 1. XML解析技术全景解读XML作为企业级数据交换的事实标准,其解析技术栈的深度掌握是每个中高级开发者必备的硬核技能。不同于JSON这类轻量级数据格式,XML的Schema验证、命名空间处理以及DOM树操作等特性,使其在金融、电信等传统行业的核心系统… · 2026/9/23 5:37:10
网页视频没声音?3步搞定API兼容,从入门到精通 网页视频没声音?3步搞定API兼容,从入门到精通 版本升级后 API 全变了,是不是让你抓狂?刚部署好的视频页面,用户反馈没声音,你检查了一遍又一遍,代码逻辑没问题,浏览器控制台也没报错,但就是听不见动静。别急,这种“静默失败”在 Web… · 2026/9/23 5:37:10
钢结构别墅施工流程动画制作与应用指南 1. 项目概述钢结构别墅作为现代建筑工业化的重要产物,正在改变传统住宅建造模式。这种采用预制构件现场组装的建筑方式,相比传统混凝土结构具有施工周期短、材料可回收、抗震性能好等显著优势。而施工流程动画作为直观展示技术方案的有效工具,… · 2026/9/23 5:37:10
3个实战项目搞定市场部营销方案,告别只会抄代码的尴尬 3个实战项目搞定市场部营销方案,告别只会抄代码的尴尬 你是不是也陷入过这种死循环:Python语法背得滚瓜烂熟,LeetCode刷了几百题,结果真让你做一个市场部营销方案相关的落地项目,脑子一片空白?别慌,这其实是绝大多数初级开发者的通病。… · 2026/9/23 5:37:04
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29