7

私は Python と Pandas ライブラリを初めて使用するので、これが些細な質問である場合は申し訳ありません。N 日間のローリング ウィンドウで Timeseries をランク付けしようとしています。ランク関数があることは知っていますが、この関数は時系列全体でデータをランク付けします。ローリングランク関数が見つからないようです。これが私がやろうとしていることの例です:

           A

01-01-2013 100
02-01-2013 85
03-01-2013 110
04-01-2013 60
05-01-2013 20
06-01-2013 40

3 日間のローリング ウィンドウでデータをランク付けしたい場合、答えは次のようになります。

           Ranked_A

01-01-2013 NaN
02-01-2013 Nan
03-01-2013 1
04-01-2013 3
05-01-2013 3
06-01-2013 2

これを行うことができるPythonの組み込み関数はありますか? なにか提案を?どうもありがとう。

4

2 に答える 2

6

Pandas組み込みのランク メソッド(昇順オプションなどの追加のセマンティクスを使用) を使用する場合は、その単純な関数ラッパーを作成できます。

def rank(array):
    s = pd.Series(array)
    return s.rank(ascending=False)[len(s)-1]

これは、カスタム ローリング ウィンドウ関数として使用できます。

pd.rolling_apply(df['A'], 3, rank)

出力する

Date
01-01-2013   NaN
02-01-2013   NaN
03-01-2013     1
04-01-2013     3
05-01-2013     3
06-01-2013     2

df( Rutgerの回答のデータ構造を想定しています)

于 2013-01-21T15:52:58.517 に答える
3

Pandas では、rolling_window のカスタム関数を作成できます。その関数で numpy の argsort() を使用すると、ウィンドウ内のランクを取得できます。

import pandas as pd
import StringIO

testdata = StringIO.StringIO("""
Date,A
01-01-2013,100
02-01-2013,85
03-01-2013,110
04-01-2013,60
05-01-2013,20
06-01-2013,40""")

df = pd.read_csv(testdata, header=True, index_col=['Date'])

rollrank = lambda data: data.size - data.argsort().argsort()[-1]

df['rank'] = pd.rolling_apply(df, 3, rollrank)

print df

結果:

              A  rank
Date                 
01-01-2013  100   NaN
02-01-2013   85   NaN
03-01-2013  110     1
04-01-2013   60     3
05-01-2013   20     3
06-01-2013   40     2
于 2013-01-21T14:40:55.200 に答える