gpt4 book ai didi

python - Pandas 数据框中的前填充和后填充缺失组值

转载 作者:行者123 更新时间:2023-12-05 00:09:50 25 4
gpt4 key购买 nike

我有一个按组和日期时间组织的数据框,并带有相应的值列。您可以将值 col 视为 Assets A、B、C 等(组 col)的值。我正在尝试计算每个日期每个组的总 yield /损失。在第一次进入之前,对应的值为 0。例如,在 12/31/2019 和 1/1/2020 0:00 之间,A 的值从 -43 变为 19。因此,A 在两者之间的利润日期应该是 19-(-43) = 62。

我可以通过以下方式实现这一结果:

df.groupby([time_index, group]).sum().groupby(group).diff().groupby(group).cumsum()

但是,当一个组不再被标记或在一个组第一次被记录之前的日期时,此代码不处理。例如,D 组的第一个条目是 1/3/2020 0:00 at -13。这意味着在 12/31/2020 和 1/3/2020 0:00 之间,D 组的损失为 -13-0=-13(0,因为 1/3/2020 0:00 是第一个 D 条目)。

另外,假设一个组不再被记录(即它已被出售)——例如,A组在1/1/2020 9:00之后,该值应为“前填充”并取最后记录的A组值并填写到以后的日期。这样,A 在 1/3/2020 18:00 和 12/31/2019 之间的增益为 123 - (-43) = 166。

为了最大限度地发挥上述代码的作用,我希望回填(下图中的蓝色)和前填充(下图中的绿色)给定的数据帧。组应在首次列出之前回填为 0。组应在最后一次列出后作为最后记录的值进行“前置填充”。

这里是我想要完成的图画:

df a1

以下是我试图通过的示例数据帧和一个简单的测试用例:

import pandas as pd
from pandas import Timestamp
from pandas.util.testing import assert_frame_equal

df = pd.DataFrame({
'datetime': {
0: Timestamp('2019-12-31 00:00:00'),
1: Timestamp('2019-12-31 00:00:00'),
2: Timestamp('2020-01-01 00:00:00'),
3: Timestamp('2020-01-01 00:00:00'),
4: Timestamp('2020-01-01 09:00:00'),
5: Timestamp('2020-01-01 09:00:00'),
6: Timestamp('2020-01-02 00:00:00'),
7: Timestamp('2020-01-02 00:00:00'),
8: Timestamp('2020-01-02 00:00:00'),
9: Timestamp('2020-01-03 00:00:00'),
10: Timestamp('2020-01-03 00:00:00'),
11: Timestamp('2020-01-03 00:00:00'),
12: Timestamp('2020-01-03 18:00:00'),
13: Timestamp('2020-01-03 18:00:00'),
14: Timestamp('2020-01-03 18:00:00')
},
'group': {
0: 'A', 1: 'B', 2: 'A', 3: 'B', 4: 'A', 5: 'B', 6: 'A', 7: 'B',
8: 'C', 9: 'B', 10: 'C', 11: 'D', 12: 'B', 13: 'C', 14: 'D'
},
'value': {
0: -43, 1: -34, 2: 19, 3: -118, 4: -144, 5: -93, 6: 123, 7: -159,
8: -48, 9: 63, 10: -9, 11: -13, 12: -131, 13: 3, 14: -61
}
})

a1 = pd.DataFrame({
'datetime': {
0: Timestamp('2019-12-31 00:00:00'),
1: Timestamp('2019-12-31 00:00:00'),
2: Timestamp('2019-12-31 00:00:00'),
3: Timestamp('2019-12-31 00:00:00'),
4: Timestamp('2020-01-01 00:00:00'),
5: Timestamp('2020-01-01 00:00:00'),
6: Timestamp('2020-01-01 00:00:00'),
7: Timestamp('2020-01-01 00:00:00'),
8: Timestamp('2020-01-01 09:00:00'),
9: Timestamp('2020-01-01 09:00:00'),
10: Timestamp('2020-01-01 09:00:00'),
11: Timestamp('2020-01-01 09:00:00'),
12: Timestamp('2020-01-02 00:00:00'),
13: Timestamp('2020-01-02 00:00:00'),
14: Timestamp('2020-01-02 00:00:00'),
15: Timestamp('2020-01-02 00:00:00'),
16: Timestamp('2020-01-03 00:00:00'),
17: Timestamp('2020-01-03 00:00:00'),
18: Timestamp('2020-01-03 00:00:00'),
19: Timestamp('2020-01-03 00:00:00'),
20: Timestamp('2020-01-03 18:00:00'),
21: Timestamp('2020-01-03 18:00:00'),
22: Timestamp('2020-01-03 18:00:00'),
23: Timestamp('2020-01-03 18:00:00')
},
'group': {
0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'A', 5: 'B', 6: 'C', 7: 'D',
8: 'A', 9: 'B', 10: 'C', 11: 'D', 12: 'A', 13: 'B', 14: 'C', 15: 'D',
16: 'A', 17: 'B', 18: 'C', 19: 'D', 20: 'A', 21: 'B', 22: 'C', 23: 'D'
},
'value': {
0: -43, 1: -34, 2: 0, 3: 0, 4: 19, 5: -118, 6: 0, 7: 0, 8: -144,
9: -93, 10: 0, 11: 0, 12: 123, 13: -159, 14: -48, 15: 0, 16: 123,
17: 63, 18: -9, 19: -13, 20: 123, 21: -131, 22: 3, 23: -61
}
})

time_index = 'datetime'
group = 'group'
value_col = 'value'

def backfill_frontfill(df):
raise NotImplementedError

my_result = backfill_frontfill(df)

assert_frame_equal(myresult, a1)

最佳答案

  • 使用 pivot将值分隔成列
  • 使用 interpolate用于前填充
  • 使用 fillna用于回填中的零
  • 使用 stack 返回原始格式并修复列

  • def backfill_frontfill(df):
    return df\
    .pivot(index="datetime", columns="group", values="value")\
    .interpolate()\
    .fillna(0)\
    .stack().reset_index().rename({0: "value"}, axis='columns')

    关于python - Pandas 数据框中的前填充和后填充缺失组值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59862968/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com