【问题标题】:Pandas groupby rolling quantile for groupPandas groupby 分组滚动分位数
【发布时间】:2019-08-05 23:18:56
【问题描述】:

我想要做的是获取一个数据集,该数据集包含几年内每分钟的 x 值,并创建一个“典型周”的数据,因此数据框具有 (60*24*7) = 10080 行.每行都有一些特定的分位数/百分位数,例如[0.1、0.25、0.5、0.75、0.9]。分位数是根据所有历史数据集中一周中该分钟的 x 值以及该分钟之前的五分钟和之后五分钟的 x 值计算得出的。

因此输出将是一周中的每一分钟,该分钟的 x 值,以及这些数据的值,包括百分位数计算之前和之后的分钟,例如

输入数据:

                                x    dow    hour  minute
               time                                     
2016-10-18 07:55:00     29.500000      0       7      55
2016-10-18 07:56:00     35.000000      0       7      56
2016-10-18 07:57:00     24.666667      0       7      57
2016-10-18 07:58:00     31.833333      0       7      58
2016-10-18 07:59:00     35.500000      0       7      59
2016-10-18 08:00:00     35.500000      0       8      00 
2016-10-18 08:01:00     33.500000      0       8      01
...                     ...          ...     ...     ...
2018-10-18 10:01:00     32.500000      6      10      01
2018-10-18 10:02:00     34.500000      6      10      02
2018-10-18 10:03:00     39.500000      6      10      03

输出数据:

dow    hour    minute    percentile1    percentile2    percentile3    percentile4    percentile5
3         4        58             25             28             33             44             50
...
...

我怎么能在 pandas 中实现这样的事情。这似乎是朝着正确方向迈出的一步,但我不确定滚动是否包括预期的前后分钟:

df.groupby([df.dow, df.hour, df.minute]).rolling(5).apply(pd.quantile, [0.25, 0.30, 0.50])

【问题讨论】:

  • 滚动分位数不允许像输入一样的列表,你只能做浮动

标签: python pandas pandas-groupby percentile rolling-computation


【解决方案1】:

你可以用

g=df.groupby(['dow', 'hour', 'minute'])['x']

s=pd.concat({y:g.apply(lambda x : x.rolling(5,min_periods=1).quantile(y)) for y in [0.25,0.30,0.50]},1)
s
Out[298]: 
        0.25       0.30       0.50
0  29.500000  29.500000  29.500000
1  35.000000  35.000000  35.000000
2  24.666667  24.666667  24.666667
3  31.833333  31.833333  31.833333
4  35.500000  35.500000  35.500000
5  33.500000  33.500000  33.500000

yourdf=pd.concat([df,s],axis=1)

【讨论】:

  • 谢谢@wen-ben 我会试一试,只是为了更好地理解,你将 min_periods 设置为 1 否则如果所有值都是 NaN,分位数将失败?
  • 谢谢,但据我了解,这仅适用于每个组内的滚动,但我希望所有组的相邻分钟值都进入分位数计算?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 2020-10-07
  • 2018-03-10
  • 2015-05-14
  • 2016-05-07
  • 2017-01-07
  • 2012-07-19
相关资源
最近更新 更多