簡體   English   中英

Pandas Q-cut:使用擴展窗口方法對數據進行分箱

[英]Pandas Q-cut: Binning Data using an Expanding Window Approach

這個問題有點類似於我在同一主題上發現的2018 年問題

我希望如果我以更簡單的方式提問,有人將能夠找出我目前面臨的問題的簡單解決方案:

我有一個名為“df”的時間序列數據框,其結構大致如下:

            V_1   V_2  V_3  V_4
1/1/2000    17    77   15   88
1/2/2000    85    78    6   59
1/3/2000    31    9    49   16
1/4/2000    81    55   28   33
1/5/2000    8     82   82   4
1/6/2000    89    87   57   62
1/7/2000    50    60   54   49
1/8/2000    65    84   29   26
1/9/2000    12    57   53   84
1/10/2000   6     27   70   56
1/11/2000   61    6    38   38
1/12/2000   22    8    82   58
1/13/2000   17    86   65   42
1/14/2000   9     27   42   86
1/15/2000   63    78   18   35
1/16/2000   73    13   51   61
1/17/2000   70    64   75   83

如果我想使用所有列來生成每日分位數,我會遵循以下方法:

quantiles =  df.apply(lambda x: pd.qcut(x, 5, duplicates='drop', labels=False), axis=0)

輸出如下所示:

           V_1  V_2 V_3 V_4
2000-01-01  1   3   0   4
2000-01-02  4   3   0   3
2000-01-03  2   0   2   0
2000-01-04  4   1   0   0
2000-01-05  0   4   4   0
2000-01-06  4   4   3   3
2000-01-07  2   2   3   2
2000-01-08  3   4   1   0
2000-01-09  0   2   2   4
2000-01-10  0   1   4   2
2000-01-11  2   0   1   1
2000-01-12  1   0   4   2
2000-01-13  1   4   3   1
2000-01-14  0   1   1   4
2000-01-15  3   3   0   1
2000-01-16  4   0   2   3
2000-01-17  3   2   4   4

我想做的事:

我想使用特定時間點之前和發生的觀察來生成“df”中數據的分位數。 希望包括在特定時刻發生的觀察。

例如:

  • 為了計算 2000 年 1 月 2 日的 bin,我只想使用 2000 年 1 月 1 日和 2 日的觀測值; 並且,日期之后沒有任何內容;
  • 為了計算 2000 年 1 月 3 日的 bin,我只想使用 2000 年 1 月 1 日、2 日和 3 日的觀測值; 並且,日期之后沒有任何內容;
  • 為了計算 2000 年 1 月 4 日的 bin,我只想使用 2000 年 1 月 1 日、2 日、3 日和 4 日的觀測值; 並且,日期之后沒有任何內容;
  • 為了計算 2000 年 1 月 5 日的 bin,我只想使用 2000 年 1 月 1 日、2 日、3 日、4 日和 5 日的觀測值; 並且,日期之后沒有任何內容;

否則,我想使用這種方法來計算“df”中所有數據點的箱。 也就是說,計算從 2000 年 1 月 1 日到 2000 年 1 月 17 日的 bin。

總之,我想做的是進行一個擴展窗口q-cut(如果有的話)。 在處理時間序列數據時,它有助於避免“前瞻”偏差。

下面的這個代碼塊是錯誤的,但它准確地說明了我想要完成的事情:

quantiles =  df.expanding().apply(lambda x: pd.qcut(x, 5, duplicates='drop', labels=False), axis=0)

有沒有人知道如何以比這更簡單的方式做到這一點

我是新手,所以對此持保留態度,但是當分解時,我相信您的問題是重復的,因為它需要簡單的日期時間索引切片在此處回答。

lt_jan_5 = df.loc[:'2000-01-05'].apply(lambda x: pd.qcut(x, 5, duplicates='drop', labels=False), axis=0)

print(lt_jan_5)

            V_1  V_2  V_3  V_4
2000-01-01    1    2    1    4
2000-01-02    4    3    0    3
2000-01-03    2    0    3    1
2000-01-04    3    1    2    2
2000-01-05    0    4    4    0

希望這有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM