You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:09:02