【问题标题】:Apply Custom Function to Pandas Groupby using Rolling 12 Month Window使用滚动 12 个月窗口将自定义函数应用于 Pandas Group
【发布时间】:2017-10-31 16:13:28
【问题描述】:

我有以下数据框,这是一个示例:

Area    Num Month   Year    Type    Result
AA      1   Jan     2015    A       1
AA      1   Feb     2015    A       2
AA      1   Mar     2015    A       3
AA      1   Apr     2015    A       4
AA      1   May     2015    A       5
AA      1   Jun     2015    A       6
AA      1   Jul     2015    A       7
AA      1   Aug     2015    A       8
AA      1   Sep     2015    A       9
AA      1   Oct     2015    A       10
AA      1   Nov     2015    A       11
AA      1   Dec     2015    A       12
BB      2   Jan     2015    B       1
BB      2   Feb     2015    B       2
BB      2   Mar     2015    B       3
BB      2   Apr     2015    B       4
BB      2   May     2015    B       5
BB      2   Jun     2015    B       6
BB      2   Jul     2015    B       7
BB      2   Aug     2015    B       8
BB      2   Sep     2015    B       9
BB      2   Oct     2015    B       10
BB      2   Nov     2015    B       11
BB      2   Dec     2015    B       12

我需要按列分组:AreaNumTypeYear 并计算每个组的第 90 个百分位数。每个Area 都有多个NumType

我的预期输出是:

我需要为每个组计算前 12 个月的 12 个月百分位值,并将输出粘贴到下个月。

例如: 计算具有 {Area:AA,Num:1,Year:2015,Type:A} 的组的第 90 个百分位值并将其分配给 {Area:AA,Num:1,Year:2016,Type:A,Month:Jan }。

Area    Num Month   Year    Type    Result
AA      1   Jan     2016    A       10.9
AA      1   Feb     2016    A       10.99

现在对于新组(二月){Area:AA,Num:1,Year:2016,Type:A,Month:Feb} 应该计算 2015 年 2 月到 2016 年 1 月 Result columnn 的第 90 个百分位数的值,依此类推开。

我正在寻找单独计算百分位数和分组依据的解决方案,但我不知道如何在这个移动窗口上计算百分位数。

【问题讨论】:

  • (对不起,这更像是一个评论,但我还没有足够的代表发表评论。)你知道pandasrolling函数吗? (如果是这样,您可以发布您尝试过的任何代码吗?)我认为rolling 会让您走上正轨。

标签: python pandas function group-by rolling-computation


【解决方案1】:
df2 = df.assign(date=pd.to_datetime(df.Year.astype(str).add("-").add(df.Month.astype(str)).add("-").add(str(1))))
df2 = df2.set_index('date')
df2.groupby(['Area','Num','Type'])['Result'].rolling(12,min_periods=3).quantile(.9).reset_index()

输出:

   Area  Num Type       date  Result
0    AA    1    A 2015-01-01     NaN
1    AA    1    A 2015-02-01     NaN
2    AA    1    A 2015-03-01     2.0
3    AA    1    A 2015-04-01     3.0
4    AA    1    A 2015-05-01     4.0
5    AA    1    A 2015-06-01     5.0
6    AA    1    A 2015-07-01     6.0
7    AA    1    A 2015-08-01     7.0
8    AA    1    A 2015-09-01     8.0
9    AA    1    A 2015-10-01     9.0
10   AA    1    A 2015-11-01    10.0
11   AA    1    A 2015-12-01    10.0
12   BB    2    B 2015-01-01     NaN
13   BB    2    B 2015-02-01     NaN
14   BB    2    B 2015-03-01     2.0
15   BB    2    B 2015-04-01     3.0
16   BB    2    B 2015-05-01     4.0
17   BB    2    B 2015-06-01     5.0
18   BB    2    B 2015-07-01     6.0
19   BB    2    B 2015-08-01     7.0
20   BB    2    B 2015-09-01     8.0
21   BB    2    B 2015-10-01     9.0
22   BB    2    B 2015-11-01    10.0
23   BB    2    B 2015-12-01    10.0

【讨论】:

  • 感谢您的回复。如果我有每月数据,这将起作用。如果您按天记录而不是按月记录,有没有办法选择前一年?
  • 如果上述问题具有误导性,我深表歉意。
  • df2.groupby(['Area','Num','Type'])['Result'].resample('MS').rolling(12, min_periods=3).quantile( .9)
  • 您可以做很多相同的事情,创建一个 datetimeindex,然后按您想要的组进行分组,接下来使用 resample 将 datetimeindex 获取到月份的频率,然后使用滚动 12 个周期时间。
  • df2.groupby(['Area','Num','Type'])['Result'].resample('MS').‌​rolling(12, min_periods=3)。 quantile(.9) 没有给我预期的结果。我的预期结果 1. 需要为 12 个月的移动窗口计算结果列的第 90 个百分位数。月份记录的含义不统一,没有365天的期限。您能否介绍一下如何修复移动的 12 个月窗口。例如 2015 年 1 月 - 2015 年 12 月,2015 年 2 月 - 2016 年 1 月,并计算每个窗口的第 90 个百分位数。谢谢。
猜你喜欢
  • 1970-01-01
  • 2015-08-28
  • 1970-01-01
  • 2018-12-13
  • 2023-04-09
  • 1970-01-01
  • 2021-07-21
  • 2019-09-12
  • 2018-02-09
相关资源
最近更新 更多