2. 环境搭建与工具链:TensorFlow 2.x安装、Keras简介、Pandas与NumPy数据处理基础、Matplotlib可视化基础

好,咱们正式开始动手了。

做时间序列预测,说白了就是跟数据打交道。你想想看,没有趁手的工具,再牛的算法也跑不起来。这一章我带你搭好环境,把几个核心工具链捋一遍。嗯,这里要注意,版本问题是个大坑,我当年刚入行时就吃过这个亏。

2.1 TensorFlow 2.x 安装:别踩版本坑

TensorFlow 2.x 跟 1.x 差别很大。我个人习惯直接用 2.x,API 更简洁,跟 Keras 也深度绑定了。

安装命令很简单:

pip install tensorflow==2.10.0

为什么我推荐 2.10.0?因为这是最后一个原生支持 GPU 的 Windows 版本。之后的版本在 Windows 上装 GPU 支持,那叫一个折腾。我在项目中遇到过,有人装了 2.11 死活跑不了 GPU,最后回退到 2.10 才搞定。

验证安装:

import tensorflow as tf
print(tf.__version__)  # 输出应为 2.10.0
print(tf.config.list_physical_devices('GPU'))  # 看看有没有GPU
⚠️ 避坑指南: 我曾经在 conda 环境里装 TF,结果跟系统 Python 版本冲突了。建议用虚拟环境,比如 conda create -n tf_env python=3.9,干净又省心。

2.2 Keras 简介:高级 API 真香

Keras 现在是 TensorFlow 的官方高级 API。说白了,它就是帮你把底层那些复杂的计算图操作给封装好了。你只需要搭积木一样堆层就行。

举个例子,搭建一个简单的 LSTM 模型:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

model = Sequential([
    LSTM(50, activation='relu', input_shape=(10, 1)),
    Dense(1)
])
model.compile(optimizer='adam', loss='mse')

你看,几行代码就搞定了。我刚开始用 TF 1.x 时,写个 LSTM 要定义占位符、会话、变量初始化... 那叫一个痛苦。Keras 把这些都简化了,你只管关注模型结构本身。

💡 小技巧: 用 model.summary() 可以打印网络结构,方便检查参数数量。我每次搭完模型都会跑一下,确保层与层之间的维度对得上。

2.3 Pandas 与 NumPy:数据处理双雄

时间序列数据,90% 的时间都在做数据清洗和预处理。Pandas 和 NumPy 就是干这个的。

NumPy:数值计算的基础

NumPy 提供了多维数组对象,说白了就是矩阵运算。时间序列数据经常要转成数组喂给模型。

import numpy as np

# 创建一个时间序列数组
data = np.array([1.2, 2.3, 3.1, 4.5, 5.2])
print(data.shape)  # (5,)

# 重塑为 LSTM 需要的形状 [样本数, 时间步, 特征数]
data_reshaped = data.reshape((1, 5, 1))
print(data_reshaped.shape)  # (1, 5, 1)

Pandas:时间序列的瑞士军刀

Pandas 的 DataFrame 和 Series 天生就是为时间序列设计的。我处理过的项目里,90% 的数据源都是 CSV 文件,Pandas 读进来直接就能用。

import pandas as pd

# 读取时间序列数据
df = pd.read_csv('sensor_data.csv', parse_dates=['timestamp'], index_col='timestamp')
print(df.head())

# 处理缺失值
df = df.fillna(method='ffill')  # 用前一个值填充

# 重采样到小时级别
df_hourly = df.resample('H').mean()
🔑 核心要点: 时间序列分析中,索引必须是 datetime 类型。我见过太多人忘了 parse_dates,结果数据全是字符串,画图都画不出来。

常用 Pandas 操作一览:

操作 代码 说明
读取 CSV pd.read_csv() 记得加 parse_dates
查看前几行 df.head() 快速检查数据
缺失值处理 df.fillna() / df.dropna() 千万别直接删,先想想
滑动窗口 df.rolling(window=5).mean() 做平滑用的
时间偏移 df.shift(1) 生成滞后特征

2.4 Matplotlib 可视化基础:一眼看出问题

数据好不好,画个图就知道了。Matplotlib 是 Python 最经典的可视化库,虽然有人说它丑,但胜在灵活。

import matplotlib.pyplot as plt

# 设置中文字体,不然会乱码
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# 画个时间序列图
plt.figure(figsize=(12, 4))
plt.plot(df.index, df['value'], color='blue', linewidth=1)
plt.title('传感器数据时间序列')
plt.xlabel('时间')
plt.ylabel('数值')
plt.grid(True, alpha=0.3)
plt.show()

为什么我强调要画图?因为肉眼能看出很多统计指标看不出的问题。比如突然的尖峰、长期趋势、季节性波动。我在项目中遇到过,数据看起来统计指标都正常,一画图发现中间有段全是零值,原来是传感器坏了。

💡 实用技巧: 画多个子图对比不同时间段:
fig, axes = plt.subplots(2, 1, figsize=(12, 6))
上面放原始数据,下面放差分后的数据,一眼就能看出平稳性。

2.5 整合起来:一个完整的数据预处理流程

好了,工具都介绍完了。咱们来个实战演练,把整个流程串起来。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

# 1. 生成模拟数据
dates = pd.date_range('2023-01-01', periods=1000, freq='H')
data = np.sin(np.linspace(0, 20*np.pi, 1000)) + np.random.normal(0, 0.1, 1000)
df = pd.DataFrame({'timestamp': dates, 'value': data})
df.set_index('timestamp', inplace=True)

# 2. 可视化原始数据
plt.figure(figsize=(12, 4))
plt.plot(df.index, df['value'])
plt.title('原始时间序列数据')
plt.show()

# 3. 创建滑动窗口样本
def create_sequences(data, seq_length):
    xs, ys = [], []
    for i in range(len(data) - seq_length):
        x = data[i:i+seq_length]
        y = data[i+seq_length]
        xs.append(x)
        ys.append(y)
    return np.array(xs), np.array(ys)

seq_length = 10
X, y = create_sequences(df['value'].values, seq_length)

# 4. 重塑为 LSTM 输入格式 [样本, 时间步, 特征]
X = X.reshape((X.shape[0], X.shape[1], 1))

# 5. 搭建模型
model = Sequential([
    LSTM(50, activation='relu', input_shape=(seq_length, 1)),
    Dense(1)
])
model.compile(optimizer='adam', loss='mse')

print('数据准备完成,模型已搭建,可以开始训练了!')
🎯 总结一下: 环境搭建不是一次性的。我建议你每开始一个新项目,都重新创建一个干净的虚拟环境。这样依赖不会乱,出了问题也好排查。工具链就这些,TensorFlow 负责模型,Keras 简化开发,Pandas 和 NumPy 处理数据,Matplotlib 帮你发现问题。把这几个玩熟了,时间序列分析就成功了一半。

嗯,下一章咱们就开始讲数据预处理的具体技巧了。到时候会深入讲滑动窗口、归一化、训练集验证集划分这些实战内容。准备好了吗?