熊猫重新取样没有加起来

时间:2013-02-07 09:05:51

标签: python pandas

我有一个大熊猫数据框,其中包含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)

我不明白为什么会这样。我做错了什么或这是一个错误吗?

我刚刚意识到,如果我用0代替NaN,我就没有问题了。

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)

但是我想重新取样而不用Na填充NaN。这可能吗? 感谢

1 个答案:

答案 0 :(得分:3)

您看到此行为的原因是how=first从每列获取第一个非na值。这就是为什么用0填充NA会让你得到正确的答案。要获得所需的行为而不填写NA,您可以将自定义函数传递给how,只需将第一个条目传递给第一个条目,无论它是否为NA:

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)