簡體   English   中英

大熊貓滾動適用於自定義函數

[英]pandas rolling apply on a custom function

我想滾動應用 pandas.rank 。 我嘗試使用 pandas.rolling.apply 但不幸的是滾動不適用於“等級”。

有辦法嗎?

df = pd.DataFrame(np.random.randn(10, 3))

def my_rank(x):
   return x.rank(pct=True)

df.rolling(3).apply(my_rank)

代碼:

def my_rank(x):
   return pd.Series(x).rank(pct=True).iloc[-1]

df.rolling(3).apply(my_rank)

輸出:

          0         1         2
0       NaN       NaN       NaN
1       NaN       NaN       NaN
2  0.666667  0.333333  0.666667
3  1.000000  0.333333  1.000000
4  0.666667  1.000000  0.333333
5  0.333333  0.666667  0.666667
6  1.000000  0.333333  0.666667
7  0.333333  0.333333  1.000000
8  1.000000  0.666667  1.000000
9  0.666667  1.000000  0.666667

解釋:

您的代碼(順便說一句,偉大的最小可復制示例!)引發了以下錯誤: AttributeError: 'numpy.ndarray' object has no attribute 'rank' 這意味着my_rank函數中的x將作為 numpy 數組傳遞,而不是my_rank系列。 所以首先我更新了return x.rank...return pd.Series(x).rank..

然后我得到以下錯誤: TypeError: cannot convert the series to <class 'float'>這是有道理的,因為pd.Series.rank需要一系列 n 數字並返回一個(排名)系列的 n 數字。 但是由於我們不是在一個系列上調用 rank 一次,而是在一個系列的滾動窗口上重復調用,所以我們只需要一個數字作為每個滾動計算的輸出。 因此iloc[-1]

暫無
暫無

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

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