Python如何为DataFrame的每个rolling滚动窗口绘制Histogram直方图
滚动窗口直方图实现方案
核心思路
pandas提供的rolling对象本身支持迭代,也可以通过apply()传入自定义处理逻辑,你可以直接在每个窗口的回调中完成直方图的计算、绘制操作,完全匹配你预期的实现逻辑。
可运行完整代码
import matplotlib.pyplot as plt import numpy as np import pandas as pd # 生成测试数据 x = np.linspace(-10, 10, 1000) y = np.sin(x) df = pd.DataFrame(y, columns=['WaveData']) window_size = 14 # 方案1:只计算每个窗口的直方图统计值,不需要绘图 hist_results = [] for idx, window in enumerate(df.WaveData.rolling(window_size)): # 跳过长度不足的初始窗口 if len(window) < window_size: hist_results.append(None) continue n, edges = np.histogram(window, bins=25) hist_results.append((n, edges)) # 可以把结果存入DataFrame df['window_hist_stats'] = hist_results # 方案2:为每个符合长度的窗口绘制直方图 for idx, window in enumerate(df.WaveData.rolling(window_size)): if len(window) < window_size: continue plt.figure(figsize=(6,4)) plt.hist(window, bins=25, edgecolor='black') plt.title(f'滚动窗口 {idx} 直方图(窗口大小={window_size})') plt.xlabel('WaveData取值') plt.ylabel('频数') # 如需保存图片替换为下面两行,避免大量弹窗 # plt.savefig(f'hist_window_{idx}.png') # plt.close() plt.show()
注意事项
- 如果只需要统计值不需要绘图,使用
np.histogram即可,不需要调用matplotlib接口,运行效率更高 - 若窗口总量较大,建议将绘图结果保存为本地图片,不要逐个
plt.show()弹出,避免内存占用过高 - 你也可以通过
rolling.apply()方法替代for循环实现逻辑,适合仅需要返回单个统计值存入DataFrame的场景
内容的提问来源于stack exchange,提问作者maximus
相关产品推荐
相关产品推荐

