【问题标题】:Pandas resample not adding up熊猫重新采样不加起来
【发布时间】:2013-01-22 17:26:42
【问题描述】:

我有一个 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)

我不明白为什么会发生这种情况。我做错了什么还是这是一个错误?

我刚刚意识到,如果我将 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)

但我想重新采样而不用 0 填充 NaN。这可能吗? 谢谢

【问题讨论】:

  • 你使用的是哪个熊猫版本?
  • 谢谢!是否可以包含一些示例数据(pdata 以便我们查看)?
  • 你可以在这里下载数据:

标签: python pandas


【解决方案1】:

您看到此行为的原因是因为 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)

【讨论】:

  • 好的,我明白了。谢谢你的帮助。太好了。
猜你喜欢
  • 2021-06-01
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 2019-07-04
  • 1970-01-01
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多