在 Jupyter Notebook 中读取 CSV 并生成无聚合的 3 期滚动窗口
滚动窗口保留原始值的实现方案
无需执行sum、mean等聚合操作、仅提取固定大小滚动窗口的原始数据,有三种常用实现,处理大文件优先推荐numpy方案。
方法1:numpy 滑动窗口(大文件首选,性能最高)
NumPy 1.20+ 内置的sliding_window_view基于数组步长实现,不会额外复制全量数据,内存占用极低,处理GB级CSV也有明显性能优势,输出直接是结构化的窗口数组。
示例代码:
import numpy as np import pandas as pd # 替换为你的CSV读取代码和实际目标列名 df = pd.read_csv("你的数据文件.csv") window_size = 3 # 生成滚动窗口,返回二维numpy数组,每一行对应一个窗口 windows = np.sliding_window_view(df["目标列名"].to_numpy(), window_shape=window_size)
针对1~10的样例数据,输出结果为:
array([[ 1, 2, 3], [ 2, 3, 4], [ 3, 4, 5], [ 4, 5, 6], [ 5, 6, 7], [ 6, 7, 8], [ 7, 8, 9], [ 8, 9, 10]])
如果需要嵌套列表格式,调用windows.tolist()即可直接得到[[1,2,3], [2,3,4], ...]格式的结果。
如果需要和原DataFrame索引对齐(前2个不足窗口大小的位置补空值),可以再转成Series:
# 前 window_size-1 个位置补空值 window_series = pd.Series( [np.nan] * (window_size - 1) + windows.tolist(), index=df.index )
方法2:pandas 原生 rolling(需要和原表索引对齐时用)
用pandas的滚动窗口对象配合apply直接返回窗口内的原始值即可,不需要执行聚合计算。一定要加raw=True参数,直接传入numpy数组减少类型转换开销,比默认模式快数倍。
window_size = 3 # 针对单列Series生成窗口 window_series = df["目标列名"].rolling(window=window_size).apply( lambda x: x.astype(int).tolist(), raw=True ) # 去掉前面不足窗口长度的空值 valid_windows = window_series.dropna().tolist()
输出格式和numpy方案一致,默认右对齐窗口,和需要的窗口顺序完全匹配。
方法3:纯Python原生实现(无高版本依赖时用)
如果不想依赖高版本NumPy,数据量不算极大的情况下可以用内置函数zip实现,写法简洁无额外依赖:
data = df["目标列名"].tolist() window_size = 3 windows = [ list(window) for window in zip(*(data[i:] for i in range(window_size))) ]
注意事项
- 大文件优先选第一种numpy方案,避免逐窗口执行Python函数的性能损耗
- pandas rolling默认取右对齐窗口(第k行对应包含第k个元素的窗口),如果需要左对齐、中心对齐可以调整
center参数 - 如果窗口大小超过数据总长度,三种方案都会自动返回空结果,不需要额外判空
内容的提问来源于stack exchange,提问作者NJM
相关产品推荐
相关产品推荐

