将移动平均列添加到每个索引类别变量的数据框

Posted

技术标签:

【中文标题】将移动平均列添加到每个索引类别变量的数据框【英文标题】:Adding moving average column to dataframe per indexed category variable 【发布时间】:2018-04-21 18:20:36 【问题描述】:

我有一个 pandas 数据帧时间序列权重,用于 100 多个按“short_id”命名的尺度。我无法找出为每个秤的重量数据应用移动过滤器以去除异常值的最佳方法。

以下是数据示例:

Out[159]:
    published_at        short_id weight
0   2017-11-08 16:03:36 INT16   50.35
1   2017-11-08 16:02:43 INT1    45.71
2   2017-11-08 16:02:10 NOT11   35.52
3   2017-11-08 16:01:07 INT7    50.03
4   2017-11-08 16:00:23 INT3    47.04

将数据帧转换为每个“short_id”的字典并为每个字典项应用移动过滤器没有成功,也没有将数据从“long”转换为“宽”格式(使用 pandas.pivot_table)。

似乎可以在一行中使用 groupy.by then .apply 滚动功能:

  df['MovingFilt'] = df.groupby('short_id')['weight'].apply(pd.rolling(6).median())

但收到错误:TypeError: incompatible index of inserted column with frame index...这是因为有时某些秤会同时存在权重数据,但通常不会。

这是解决问题的最佳方法吗?:

为每个 'short_id' 创建新的数据帧然后使用似乎不够 Pythonic,尽管它运行良好

INT16['MovingFilt'] = pd.Series.rolling(INT16['weight'], window=6, center=True).median()

【问题讨论】:

【参考方案1】:

错误是因为你写错了groupby

df['MovingFilt'] = df.groupby('short_id')['weight'].rolling(6).median().values

【讨论】:

谢谢,我添加了缺少的括号并更新了帖子。我怀疑问题在于有时重叠的时间戳

以上是关于将移动平均列添加到每个索引类别变量的数据框的主要内容,如果未能解决你的问题,请参考以下文章

编写一个 R 脚本来计算数据框中的平均值

火花指数移动平均线

两个数据帧的数组列的平均值并在pyspark中找到最大索引

计算 Pandas 数据框中的平均真实范围列 [重复]

将具有不同索引的数据框添加到时间序列

使用子查询将价格列与类别的平均价格进行比较