从零到上手的Python时序数据预测完整指南

 更新时间:2026年06月24日 08:22:06   作者:detayun  
时序预测是实际工作中最高频的需求之一,这篇文章针对时序预测任务提供了实用指南,重点解决实际应用中常见问题,文中的示例代码讲解详细,希望对大家有所帮助

为什么要写这篇

时序预测是实际工作中最高频的需求之一——销量预测、股价走势、服务器负载、电力消耗,本质都是同一个问题:根据过去,预测未来。

但很多人一上来就调模型,结果要么过拟合,要么数据泄漏,预测结果看着还行,上线就崩。

这篇文章不堆公式,重点讲怎么做才能真正跑通

一、时序预测的核心流程

原始数据 → 预处理 → 滑动窗口 → 模型训练 → 预测评估

看着简单,每个环节都有坑。

二、数据预处理:80%的问题出在这里

1. 缺失值处理

import pandas as pd

# 前向填充(适合连续数据,如传感器)
df['value'] = df['value'].ffill()

# 线性插值(适合有趋势的数据)
df['value'] = df['value'].interpolate(method='linear')

2. 归一化——最容易踩的坑

必须只用训练集fit,再transform测试集。

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
train_scaled = scaler.fit_transform(train[['value']])  # 只fit训练集
test_scaled = scaler.transform(test[['value']])        # 只transform

用全局数据fit,等于把未来信息泄漏进了训练过程,指标虚高,上线翻车。

3. 滑动窗口切分

把连续的时间序列切成 (样本, 历史步长, 特征数) 的格式:

import numpy as np

def create_sequences(data, seq_len):
    xs, ys = [], []
    for i in range(len(data) - seq_len):
        xs.append(data[i:i+seq_len])
        ys.append(data[i+seq_len])
    return np.array(xs), np.array(ys)

seq_len = 30  # 用过去30步预测下1步
X, y = create_sequences(train_scaled, seq_len)

三、模型选择:别一上来就Transformer

模型数据量要求序列长度推荐指数
LSTM小(<1万条)短(<200)⭐⭐⭐⭐
GRU同上同上⭐⭐⭐⭐
Informer中(1万~10万)长(>500)⭐⭐⭐⭐⭐
PatchTST中大任意⭐⭐⭐⭐⭐
N-BEATS中大任意⭐⭐⭐⭐

新手建议从LSTM开始,理解了循环结构再上Transformer。

四、完整实战代码(LSTM)

import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset

# ---- 模型定义 ----
class LSTMPredictor(nn.Module):
    def __init__(self, input_size, hidden_size, num_layers, output_size):
        super().__init__()
        self.lstm = nn.LSTM(input_size, hidden_size, num_layers,
                            batch_first=True, dropout=0.2)
        self.fc = nn.Linear(hidden_size, output_size)

    def forward(self, x):
        out, _ = self.lstm(x)
        out = self.fc(out[:, -1, :])  # 取最后一步输出
        return out

# ---- 训练 ----
model = LSTMPredictor(input_size=1, hidden_size=64,
                      num_layers=2, output_size=1)
criterion = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)

train_dataset = TensorDataset(
    torch.FloatTensor(X), torch.FloatTensor(y)
)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=False)  # 时序不能shuffle

for epoch in range(50):
    for batch_x, batch_y in train_loader:
        pred = model(batch_x)
        loss = criterion(pred, batch_y)
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

# ---- 预测 ----
model.eval()
with torch.no_grad():
    test_input = torch.FloatTensor(X_test)
    pred = model(test_input)
    pred_original = scaler.inverse_transform(pred.numpy())  # 反归一化

五、评估——别只看RMSE

from sklearn.metrics import mean_absolute_error, mean_absolute_percentage_error

mae = mean_absolute_error(y_true, y_pred)
mape = mean_absolute_percentage_error(y_true, y_pred)
rmse = np.sqrt(np.mean((y_true - y_pred) ** 2))

print(f"MAE: {mae:.2f}, RMSE: {rmse:.2f}, MAPE: {mape:.2%}")

但指标只是数字,一定要画图

import matplotlib.pyplot as plt

plt.figure(figsize=(12, 4))
plt.plot(y_true, label='真实值')
plt.plot(y_pred, label='预测值')
plt.legend()
plt.title('时序预测 vs 真实值')
plt.show()

六、三个最常见的坑

表现解决方式
数据泄漏训练指标很好,测试很差归一化只fit训练集,不shuffle
递归预测误差累积预测越远越离谱用多输出策略,一次预测N步
评估方式错误随机split导致未来信息混入按时间顺序切分,前80%训练后20%测试

时序预测不是调参比赛,是数据工程+模型选择+评估验证的综合能力。

先把数据处理对,再选合适的模型,最后用可视化验证结果——这三步做扎实,比换十个SOTA模型都管用。

如果你有具体场景(比如预测电商销量或服务器CPU),可以把数据特征告诉我,我帮你判断用哪个模型最合适。

到此这篇关于从零到上手的Python时序数据预测完整指南的文章就介绍到这了,更多相关Python时序数据预测内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python开发装包八种方法详解

    Python开发装包八种方法详解

    这篇文章主要为大家介绍了Python开发中装包的八种方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-10-10
  • Python实现从订阅源下载图片的方法

    Python实现从订阅源下载图片的方法

    这篇文章主要介绍了Python实现从订阅源下载图片的方法,涉及Python采集的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • 详解用Python调用百度地图正/逆地理编码API

    详解用Python调用百度地图正/逆地理编码API

    这篇文章主要介绍了详解用Python调用百度地图正/逆地理编码API,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Python中DrissionPage的示例代码

    Python中DrissionPage的示例代码

    DrissionPage是一款集成了Selenium和Requests功能的Python库,本文就来介绍一下DrissionPage的具体使用,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • python3用PyPDF2解析pdf文件,用正则匹配数据方式

    python3用PyPDF2解析pdf文件,用正则匹配数据方式

    这篇文章主要介绍了python3用PyPDF2解析pdf文件,用正则匹配数据方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Python-flask调用接口返回中文数据问题

    Python-flask调用接口返回中文数据问题

    这篇文章主要介绍了Python-flask调用接口返回中文数据问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • 浅谈Python数学建模之线性规划

    浅谈Python数学建模之线性规划

    线性规划是运筹学中研究较早、发展较快、应用广泛、方法较成熟的一个重要分支,它是辅助人们进行科学管理的一种数学方法。研究线性约束条件下线性目标函数的极值问题的数学理论和方法
    2021-06-06
  • Python中列表乘法和列表推导式的区别举例详解

    Python中列表乘法和列表推导式的区别举例详解

    在Python中列表是一种非常灵活和强大的数据结构,支持多种运算和操作,这篇文章主要介绍了Python中列表乘法和列表推导式区别的相关资料,文中通过代码就介绍的非常详细,需要的朋友可以参考下
    2025-04-04
  • python字符串中匹配数字的正则表达式

    python字符串中匹配数字的正则表达式

    正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。这篇文章主要介绍了python字符串中匹配数字的正则表达式 ,需要的朋友可以参考下
    2019-07-07
  • 详解如何使用Plotly和Dash进行数据可视化

    详解如何使用Plotly和Dash进行数据可视化

    数据可视化是数据分析中至关重要的一环,它能够帮助我们更直观地理解数据并发现隐藏的模式和趋势,本文将介绍如何使用Plotly和Dash进行数据可视化,感兴趣的可以了解下
    2024-04-04

最新评论