Pandas数据帧将逻辑应用于列计算

2024-05-20 18:21:59 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我有一个巨大的数据帧,结构如下:

    ticker  calendar-date     last-update   Assets    Ebitda  .....
0   a       2001-06-30        2001-09-14    110       1000    .....
1   a       2001-09-30        2002-01-22    0         -8      .....
2   a       2001-09-30        2002-02-01    0         800     .....
3   a       2001-12-30        2002-03-06    120       0       .....
4   b       2001-06-30        2001-09-18    110       0       .....
5   b       2001-06-30        2001-09-27    110       30      .....
6   b       2001-09-30        2002-01-08    140       35      .....
7   b       2001-12-30        2002-03-08    120       40      .....
..

我想要的是针对每一行代码:为每一行创建新的列,其中包含自上一个日历日期(t-1)和最后一个日历日期(t-2)的资产和息税折旧及摊销前利润的变化百分比。在

但问题来了:

1)如您所见,日历日期(按股票代码)并不总是唯一值,因为同一日历日期可能有更多的最后更新,但我总是希望更改自上一个日历日期,而不是从上次更新。在

2)存在值为0的行,在这种情况下,我希望使用上一次观察到的值来计算百分比变化。如果我只有一个股票,这将是容易的,我将只是填写价值,但由于我有许多股票,我不能安全地执行这个操作,因为我可以把股票价格从股票代码'a'填充到股票代码'b',这不是我想要的

我想这可以通过创建一个if语句来处理数据异常的函数来解决,或者在pandas中有一个很好的方法来处理这个问题。。。可能是多重索引??事实上,我不知道如何完成这项任务,有人能帮忙吗?在

谢谢


Tags: 数据代码dateupdate资产结构calendar股票
1条回答
网友
1楼 · 发布于 2024-05-20 18:21:59

第1步
sort_values以确保以后操作的正确顺序

icols = ['ticker', 'calendar-date', 'last-update']
df.sort_values(icols, inplace=True)

第2步
groupby'ticker'和{}零和前向填充

^{pr2}$

注意:第一个'Ebitda''b',因为没有任何东西可以转发填充。在

第3步
groupby['ticker', 'calendar-date']并获取最后一列。因为我们在上面排序,最后一行将是最近更新的行。

d2 = d1.groupby(icols[:2])[vcols].last()

第4步
groupby,这一次只通过'ticker',它在d2的索引中,取pct_change

d3 = d2.groupby(level='ticker').pct_change()

第5步
join返回df

df.join(d3, on=icols[:2], rsuffix='_pct')

  ticker calendar-date last-update  Assets  Ebitda  Assets_pct  Ebitda_pct
0      a    2001-06-30  2001-09-14     110    1000         NaN         NaN
1      a    2001-09-30  2002-01-22       0      -8    0.000000   -0.200000
2      a    2001-09-30  2002-02-01       0     800    0.000000   -0.200000
3      a    2001-12-30  2002-03-06     120       0    0.090909    0.000000
4      b    2001-06-30  2001-09-18     110       0         NaN         NaN
5      b    2001-06-30  2001-09-27     110      30         NaN         NaN
6      b    2001-09-30  2002-01-08     140      35    0.272727    0.166667
7      b    2001-12-30  2002-03-08     120      40   -0.142857    0.142857

相关问题 更多 >