在d之前和之后的定义时间段内聚集值

2024-09-28 01:25:46 发布

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

我有一个名称和令牌表,其中每个名称与一个唯一的令牌相关联,每个令牌有两个总成本。给出了代币的使用日期

    Token   Name  AggCost1  AggCost2        Date
0  token1  nameX        26        70  2019-01-01
1  token2  nameY       100       120  2018-11-11

从第一个表中的日期开始,我要在特定令牌使用前3个月(日期表示为-3mo)和使用后3个月(日期表示为+3mo)的时间间隔内,为出现在第一个表中的每个名称聚合下表中的第二个表中的Cost1和Cost2。在这个表中,名称和令牌之间的关系是一对多的

    Name        Date   Token  Cost1  Cost2
0  nameX  2018-10-03  tokenA      0     30
1  nameX  2018-12-12  tokenB     40     20
2  nameX  2019-01-01  token1     26     70
3  nameY  2018-09-01  tokenC    150    200
4  nameY  2018-07-04  tokenD     10     20
5  nameY  2019-01-01     NaN     50     50
6  nameY  2018-11-11  token2     50     20
7  nameY  2018-11-11  token2     50    100

下面是我想要输出的内容:

    Token   Name  AggCost1  AggCost2        Date        -3mo  -3moCost1  -3moCost2        +3mo  +3moCost1  +3moCost2
0  token1  nameX        26        70  2019-01-01  2018-10-01         40         50  2019-04-01          0          0
1  token2  nameY       100       120  2018-11-11  2018-08-11        150        200  2019-02-11         50         50

我很难生成这个中间表。我不知道如何根据第一个表中的Date将每个名称的行收集到-/+3个月的存储桶中

    Name        Date        -3mo  -3moCost1  -3moCost2        +3mo  +3moCost1  +3moCost2
0  nameX  2019-01-01  2018-10-01         40         50  2019-03-31          0          0
1  nameY  2018-11-11  2018-08-11        150        200  2019-02-11         50         50

Tags: name名称tokendate时间代币token2token1
1条回答
网友
1楼 · 发布于 2024-09-28 01:25:46

好吧,我可以拼凑一些东西。我已经分解了我在下面走的步骤

我的起始数据帧:

df1

    Token   Name  AggCost1  AggCost2      Date1
0  token1  nameX        26        70 2019-01-01
1  token2  nameY       100       120 2018-11-11

df2

    Name      Date2   Token  Cost1  Cost2
0  nameX 2018-10-03  tokenA      0     30
1  nameX 2018-12-12  tokenB     40     20
2  nameX 2019-01-01  token1     26     70
3  nameY 2018-09-01  tokenC    150    200
4  nameY 2018-07-04  tokenD     10     20
5  nameY 2019-01-01     NaN     50     50
6  nameY 2018-11-11  token2     50     20
7  nameY 2018-11-11  token2     50    100

使用DateOffset获取Date1前后三个月的日期

df1['-3mo'] = df1['Date1'] - pd.DateOffset(months=3)
df1['+3mo'] = df1['Date1'] + pd.DateOffset(months=3)

合并df1df2

df = pd.merge(df1, df2, how='left', on='Name')
  Token_x   Name  AggCost1  AggCost2      Date1       -3mo       +3mo      Date2 Token_y  Cost1  Cost2
0  token1  nameX        26        70 2019-01-01 2018-10-01 2019-04-01 2018-10-03  tokenA      0     30
1  token1  nameX        26        70 2019-01-01 2018-10-01 2019-04-01 2018-12-12  tokenB     40     20
2  token1  nameX        26        70 2019-01-01 2018-10-01 2019-04-01 2019-01-01  token1     26     70
3  token2  nameY       100       120 2018-11-11 2018-08-11 2019-02-11 2018-09-01  tokenC    150    200
4  token2  nameY       100       120 2018-11-11 2018-08-11 2019-02-11 2018-07-04  tokenD     10     20
5  token2  nameY       100       120 2018-11-11 2018-08-11 2019-02-11 2019-01-01     NaN     50     50
6  token2  nameY       100       120 2018-11-11 2018-08-11 2019-02-11 2018-11-11  token2     50     20
7  token2  nameY       100       120 2018-11-11 2018-08-11 2019-02-11 2018-11-11  token2     50    100

保留日期2在日期1之前3个月或之后3个月的持续时间内的行

df = df.loc[(df['Date2'] >= df['-3mo']) & (df['Date2'] < df['Date1']) 
       | (df['Date2'] > df['Date1']) & (df['Date2'] <= df['+3mo'])]

创建一个列,将行分割为-3mo或+3mo存储桶

df['3mo'] = np.where(df['Date2'] > df['Date1'], '+3', '-3')

使用新列获取Cost1和Cost2的聚合

df['3mo_Cost1'] = df.groupby(['3mo', 'Name'])['Cost1'].transform('sum')
df['3mo_Cost2'] = df.groupby(['3mo', 'Name'])['Cost2'].transform('sum')

将3mo\u Cost1和3mo\u Cost2分为两列

df['-3moCost1'] = np.where(df['3mo'] == '-3', df['3mo_Cost1'], 0)
df['+3moCost1'] = np.where(df['3mo'] == '+3', df['3mo_Cost1'], 0)
df['-3moCost2'] = np.where(df['3mo'] == '-3', df['3mo_Cost2'], 0)
df['+3moCost2'] = np.where(df['3mo'] == '+3', df['3mo_Cost2'], 0)

经过一些清洁后,这是最终输出:

  Token_x   Name  AggCost1  AggCost2      Date1       -3mo  -3moCost1  -3moCost2       +3mo  +3moCost1  +3moCost2
0  token1  nameX        26        70 2019-01-01 2018-10-01         40         50 2019-04-01          0          0
3  token2  nameY       100       120 2018-11-11 2018-08-11        150        200 2019-02-11          0          0
5  token2  nameY       100       120 2018-11-11 2018-08-11          0          0 2019-02-11         50         50

相关问题 更多 >

    热门问题