假设我有一个具有多索引的数据帧,构造如下:

import numpy as np
import pandas as pd

ids = ['a', 'b', 'c']
hours = np.arange(24)
data = np.random.random((len(ids),len(hours)))

df = pd.concat([pd.DataFrame(index = [[id]*len(hours), hours], data = {'value':data[ind]}) for ind, id in enumerate(ids)])
df.index.names = ['ID', 'hour']

它看起来像这样:

            value
ID hour          
a  0     0.020479
   1     0.059987
   2     0.053100
   3     0.406198
   4     0.452231
          ...
c  19    0.150493
   20    0.617098
   21    0.377062
   22    0.196807
   23    0.954401

我想做的是 for each 站点获得一个新的24小时时间序列,但使用5小时滚动平均计算.

我知道我可以做df.rolling(5, center = True, on = 'hour')个小时,但问题是它没有考虑到小时是周期性的-即,0小时的滚动平均值应该是22、23、0、1和2小时的平均值.

做这件事的好方法是什么?

谢谢!

推荐答案

如果要考虑周期,请使用np.padnp.convolve:

import pandas as pd
import numpy as np

# A more comprehensive example
mi = pd.MultiIndex.from_product([['a'], np.arange(1, 25)], names=['ID', 'hour'])
df = pd.DataFrame({'value': np.arange(1, 25)}, index=mi)

def cycling_ma(x):
    return np.convolve(np.pad(x, 2, mode='wrap'), np.ones(5)/5, mode='valid')

df['ma'] = df.groupby('ID')['value'].transform(cycling_ma)

输出:

>>> df
         value    ma
ID hour
a  1         1  10.6  # (23 + 24 + 1 + 2 + 3) / 5 (23 and 24 -> pad from end)
   2         2   6.8
   3         3   3.0
   4         4   4.0
   5         5   5.0
   6         6   6.0
   7         7   7.0
   8         8   8.0
   9         9   9.0
   10       10  10.0
   11       11  11.0
   12       12  12.0
   13       13  13.0
   14       14  14.0
   15       15  15.0
   16       16  16.0
   17       17  17.0
   18       18  18.0
   19       19  19.0
   20       20  20.0
   21       21  21.0
   22       22  22.0
   23       23  18.2
   24       24  14.4  # (22 + 23 + 24 + 1 + 2) / 5 (1 and 2 -> pad from begin)

参考文献:How to calculate rolling / moving average using python + NumPy / SciPy?

Python相关问答推荐

如何确保Flask应用程序管理面板中的项目具有单击删除功能?

使用子字符串动态更新Python DataFrame中的列

如何将 map 数组组合到pyspark中每列的单个 map 中

如何使用函数正确索引收件箱?

如何对行使用分段/部分.diff()或.pct_change()?

如何获取Django REST框架中序列化器内部的外卡属性?

如果我已经使用了time,如何要求Python在12秒后执行另一个操作.sleep

由于瓶颈,Python代码执行太慢-寻求性能优化

Locust请求中的Python和参数

点到面的Y距离

由于NEP 50,向uint 8添加-256的代码是否会在numpy 2中失败?

使可滚动框架在tkinter环境中看起来自然

如何记录脚本输出

如何过滤包含2个指定子字符串的收件箱列名?

修复mypy错误-赋值中的类型不兼容(表达式具有类型xxx,变量具有类型yyy)

Python中绕y轴曲线的旋转

改进大型数据集的框架性能

mypy无法推断类型参数.List和Iterable的区别

计算分布的标准差

CommandeError:模块numba没有属性generated_jit''''