如何让Pandas仅计算最后M个数据点的滚动均值?
解决方案
核心思路
滚动计算最后M行的均值时,每个窗口最多需要往前追溯lookback-1行数据。因此只需提取原DataFrame的最后M + lookback - 1行,在这个子集上执行滚动均值计算,最后截取结果的最后M行即可。这样只会处理少量数据,避免遍历全部10亿行。
Pandas 实现代码
# 提取需要的子集:最后M + lookback -1行 subset_df = df.tail(M + lookback - 1) # 计算滚动均值 rolling_result = subset_df.rolling(window=lookback).mean() # 只保留最后M行的结果 final_result = rolling_result.tail(M)
为什么这能节省时间?
- 原操作需要对N行逐行计算,时间复杂度为O(N);优化后仅处理
M + lookback -1行,时间复杂度降至O(M)(M远小于N)。 - Pandas的
rolling内部是优化过的C实现,比自行编写Python循环效率高得多,完全满足你不想手写滚动函数的需求。
注意事项
- 如果
lookback大于M,比如M=5、lookback=10,那么M + lookback -1 =14,提取最后14行后计算滚动均值,结果的前lookback-1行会是NaN,最后M行就是你需要的有效结果。 - 若原DataFrame是按时间排序的,确保
tail()取到的是正确的最后M行数据。
内容的提问来源于stack exchange,提问作者Jackson Tale
相关产品推荐
相关产品推荐

