【问题标题】:How to use pandas groupby and shift together如何使用 pandas groupby 和 shift 一起
【发布时间】:2017-04-04 05:10:33
【问题描述】:

我确定我需要使用某种应用功能,但我正在努力创建一个来实现这一点的功能。我有一个包含股票代码和月度回报的数据框。我需要计算前 3 个月的回报。它的结构使得每个月都会有 500 行(加上这个数字),其中包含该月的所有股票和回报。我一直在尝试这样的事情,但它不起作用。

mr['Quarterly_Returns'] = mr.groupby('ticker')['monthly_returns'].apply(mr['monthly_returns']+mr['monthly_returns'].shift(-1)+mr['monthly_returns'].shift(-2)) 

还有建议?

【问题讨论】:

  • 您需要mr['Quarterly_Returns'] = mr.groupby('ticker')['monthly_returns'].apply(lambda x: x+x.shift(-1)+x.shift(-2)) 吗?
  • 我不这么认为。这似乎在“monthly_returns”列上给了我一个关键错误。不过我会调查的。
  • 对不起,我编辑评论。
  • 哇,就是这样。我需要了解有关应用功能的更多信息。太感谢了。如果你把它作为一个解决方案我也可以标记为正确!
  • 谢谢,我添加答案。

标签: python pandas group-by apply


【解决方案1】:

您需要lambda x,而在apply 中,列名使用x,因为仅适用于monthly_returns 列:

mr['Quarterly_Returns'] = mr.groupby('ticker')['monthly_returns']
                            .apply(lambda x: x+x.shift(-1)+x.shift(-2))

【讨论】:

    【解决方案2】:

    您也可以考虑使用rolling 函数。

    mr.groupby('ticker')['monthly_returns'].rolling(3).sum()

    一个更完整的例子:

    df=pd.concat([pd.DataFrame(index=pd.date_range('1/1/2016','12/31/2016',freq='M'),data={'ticker':x,'return':np.random.rand(12)}) for x in list('ABCD')])
    df.groupby('ticker')['return'].rolling(3).sum().unstack('ticker')
    
    ticker  A   B   C   D
    2016-01-31  NaN     NaN     NaN     NaN
    2016-02-29  NaN     NaN     NaN     NaN
    2016-03-31  2.062552    1.508062    1.317836    1.051874
    2016-04-30  1.727587    1.856383    1.308263    1.113360
    2016-05-31  1.602858    2.112790    1.533763    1.039221
    2016-06-30  1.716985    2.403718    1.850741    1.726469
    2016-07-31  1.828597    1.809054    1.543079    1.569896
    2016-08-31  2.003484    1.531877    1.376907    1.852235
    2016-09-30  1.854642    1.319289    1.438446    0.946304
    2016-10-31  1.308001    1.718987    1.764252    1.157938
    2016-11-30  0.962660    2.255580    1.489076    0.493370
    2016-12-31  0.949810    1.753511    1.321650    1.377429
    

    【讨论】:

    • 我对其进行了测试,但它返回了其他内容。
    • 你也可以查看-mr = pd.DataFrame({'ticker':np.random.choice(['a','b','c','d'], 20), 'monthly_returns': np.random.choice(1000, 20)})
    • 也许我很困惑,但在我看来,它确实做了正确的事情——计算每个股票代码的滚动总和。另一个解决方案将所有结果连接在一起,但我不确定我是否完全理解原因。
    • 是的,我也有同样的想法,所以我用样本测试它。我认为它与mr['Quarterly_Returns'] = mr.groupby('ticker')['monthly_returns'] .apply(lambda x: x+x.shift(1)+x.shift(2)) 相同
    猜你喜欢
    • 2017-08-25
    • 2020-09-25
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多