0

461株の終値を含むパンダデータフレームがあります。

In [43]: pdata
Out[43]: 
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 3418 entries, 2000-01-03 00:00:00 to 2013-02-06 00:00:00
Columns: 461 entries, AKM to ZIM
dtypes: float64(461)

過去130日間のリターンで株式をランク付けし、上位10人のパフォーマーを選択しています

In [44]: mom_ret = pdata.shift(1).pct_change(130)

In [45]: rank = mom_ret.rank(axis=1,ascending=False,method='first')

In [46]: rank[rank<=10]=1

In [47]: rank[rank>10]=0

行の合計をとると、予想どおり、すべて10になります。

In [48]: x=rank.groupby(rank.sum(axis=1))

In [49]: x.sum()
Out[49]: 
<class 'pandas.core.frame.DataFrame'>
Index: 1 entries, 10.0 to 10.0          # all rows sum to 10 as expected.
Columns: 461 entries, AKM to ZIM
dtypes: float64(461)

次に、以下のようにデータフレームをリサンプリングします

In [50]: port = rank.resample('20B', how='first')

In [51]: y=port.groupby(port.sum(axis=1))

しかし、行を合計すると、すべてが10になるわけではありませんか?

In [52]: y.sum()
Out[52]: 
<class 'pandas.core.frame.DataFrame'>
Index: 4 entries, 10.0 to 13.0          # 4 entries ranging between 10 and 13??
Columns: 461 entries, AKM to ZIM
dtypes: float64(461)

なぜこれが起こるのか分かりません。私は何か間違ったことをしましたか、それともこれはバグですか?

NaNを0に置き換えれば、問題はないことに気づきました。

In [67]: rank=rank.fillna(0)

In [68]: x=rank.groupby(rank.sum(axis=1))

In [69]: x.sum()
Out[69]: 
<class 'pandas.core.frame.DataFrame'>
Index: 2 entries, 0.0 to 10.0     # 2 entries, 0 and 10
Columns: 461 entries, AKM to ZIM
dtypes: float64(461)

In [70]: port = rank.resample('20B', how='first')

In [71]: y=port.groupby(port.sum(axis=1))

In [72]: y.sum()
Out[72]: 
<class 'pandas.core.frame.DataFrame'>
Index: 2 entries, 0.0 to 10.0    # 2 entries again, 0 and 10
Columns: 461 entries, AKM to ZIM
dtypes: float64(461)

しかし、NaNに0を入力せずにリサンプリングしたいのですが、それは可能ですか?ありがとう

4

1 に答える 1

3

この動作が見られる理由はhow=first、 が各列から na 以外の最初の値を取得するためです。これが、NA を 0 で埋めると正しい答えが得られる理由です。NA を埋めずに必要な動作を得るには、howNA かどうかに関係なく、カスタム関数を最初のエントリだけに渡すことができます。

In [47]: port = rank.resample('20B', how=lambda x: x.ix[0])

In [48]: y=port.groupby(port.sum(axis=1))

In [49]: y.sum()
Out[49]: 
<class 'pandas.core.frame.DataFrame'>
Index: 1 entries, 10.0 to 10.0
Columns: 461 entries, AKM to ZIM
dtypes: float64(461)
于 2013-02-08T17:07:41.453 に答える