我目前正在研究各种未来曲线。每个截止日期都有一个可用的期货曲线列表。我的最终目标是提取截止日期每个人的到期日值。下面是我的数据帧的一个例子
asOfDate maturityDate value
0 2017-10-02 2017-10-01 406.8
1 2017-10-02 2017-11-01 406.8
2 2017-10-02 2017-12-01 398.3
3 2017-10-02 2018-01-01 398.3
4 2017-10-02 2018-02-01 390.2
5 2017-10-02 2018-03-01 390.2
6 2017-10-02 2018-04-01 380.5
7 2017-10-02 2018-05-01 380.5
8 2017-10-02 2018-06-01 385.0
9 2017-10-02 2018-07-01 385.0
10 2017-10-02 2018-08-01 385.0
11 2017-10-02 2018-09-01 385.0
12 2017-10-02 2018-10-01 383.2
13 2017-10-02 2018-11-01 383.2
14 2017-10-03 2017-10-01 410.4
15 2017-10-03 2017-11-01 410.4
16 2017-10-03 2017-12-01 400.8
17 2017-10-03 2018-01-01 400.8
18 2017-10-03 2018-02-01 392.5
19 2017-10-03 2018-03-01 392.5
最终目标是每个到期日期相对于每个截止日期最接近的值的列表。因此,给定上述数据集,所需的输出将是
asOfDate maturityDate value
0 2017-10-02 2017-10-01 406.8
14 2017-10-03 2017-10-01 410.4
考虑到合同在2017-10-02接近asOfDate是2017-10-01,而2017-10-03最接近的是同一合同。
我的想法是,到目前为止,我可以为每个人进行某种类型的分组,这是我迄今为止测试的
df_lumber[df_lumber['maturityDate']==df_lumber.groupby(['asOfDate'])['maturityDate'].apply(min)]
我正在尝试匹配当前的到期日,以匹配每个截止日期的最小到期日,理论上应该是我想要的。
OP离所需输出不远。
首先,确保两列都是datetime
和pandas.to_datetime
df['asOfDate'] = pd.to_datetime(df['asOfDate'])
df['maturityDate'] = pd.to_datetime(df['maturityDate'])
然后,这将完成的工作
df[df["maturityDate"] == df.groupby("asOfDate")["maturityDate"].transform(min)]
[Out]:
asOfDate maturityDate value
0 2017-10-02 2017-10-01 406.8
14 2017-10-03 2017-10-01 410.4
备注:
一种是按
asOfDate
和pandas.DataFrame.groupby
分组。对于每个组,使用
.transform('min')
来获得列maturityDate
的最小值。