【问题标题】:Pandas rolling slope on groupby objects熊猫在 groupby 对象上滚动斜坡
【发布时间】:2021-03-04 16:31:45
【问题描述】:

我想估计分组数据帧的滚动斜率。

假设我有以下df:

           Date   tags   weight
22   2004-05-12    a    0.000081
23   2004-05-13    a    0.000073
24   2004-05-14    a    0.000085
25   2004-05-17    a    0.000089
26   2004-05-18    b    0.000034
27   2004-05-19    b    0.000048

......

1000   2004-05-20    b    0.000034
1001   2004-05-21    b    0.000037
1002   2004-05-24    c    0.000043
1003   2004-05-25    c    0.000038
1004   2004-05-26    c    0.000029

如何计算 10 个日期和每个组的滚动斜率?

我试过了:

from scipy.stats import linregress
df['rolling_slope'] = df.groupby('tags').rolling(window=10,
                               min_periods=2).apply(lambda v: linregress(v.Date, v.weight))

但我似乎无法将该功能应用于系列

【问题讨论】:

  • 我不认为你可以回归到 v.tags 这是字符串。
  • 抱歉,我的意思是v.Date。帖子已编辑,ty

标签: python-3.x pandas dataframe pandas-groupby


【解决方案1】:

试试:

df['rolling_slope'] = (df.groupby('tags')['weight']
   .rolling(window=10, min_period=2)
   .apply(lambda v: linregress(np.arange(len(v)), v).slope )
   .reset_index(level=0, drop=True)
)

但这只是在行数上滚动,而不是真正回顾10 days。还有一个选项rolling('10D'),但您需要将date 设置为索引。

【讨论】:

  • 谢谢,真的很有帮助!我也对在以天为单位的固定窗口上滚动的选项感兴趣。所以,我将date 设置为索引并尝试选项rolling('10D')。然而,线性回归的结果与第一个选项不同,尽管在此处介绍的特定情况下应该是相同的。我应该在linregress函数中修改np.arange(len(v))吗?
  • 好的,抱歉,您的解决方案也适用于 rolling('10D')。我没有注意到它给出了第二行的斜率,而第一个选项给出了第 10 行的斜率。非常感谢,真的很有帮助!我特别在寻找一种方法来滚动以天而不是范围表示的固定寡妇。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
  • 2019-02-24
  • 2019-07-27
  • 2023-03-16
  • 1970-01-01
  • 2016-10-22
相关资源
最近更新 更多