转发填充到特定的日期时间索引 - 如果日期时间索引出现在其他列表中
Forward fill to a specific datetime index - if the datetime index occurs in other list
我正在尝试通过日期时间索引覆盖产品 df 中预先计算的权重。我的挑战是只覆盖某个日期(在另一个 df 中列出)然后再做一次。数据示例:
data = {'Product 1 Weight':['0', '.15', '.19', '.2','.21','.25','.252','.255'],
'Product 2 Weight':['0', '0', '0', '0','0','0','0','0'],
'Product 3 Weight':['0', '0', '0', '0','0','.5','.551','.561']}
df = pd.DataFrame(data, index =['2020-04-01',
'2020-04-02',
'2020-04-03',
'2020-04-06',
'2020-04-07',
'2020-04-08',
'2020-04-09',
'2020-04-10'])
rebalances= pd.DataFrame({'Rebalance':['2020-04-02',
'2020-04-08',
'2020-04-10']})
在这个例子中,我想用 2020-04-02 的值覆盖 2020-04-02 到 2020-04-07 的所有产品的值。然后我想用 2020-04-08 的值覆盖 2020-04-08 到 2020-04-09 的所有产品的值,依此类推。重新平衡 df 会给我停止覆盖并开始另一个覆盖的日期。因此,我想要的最终输出看起来像:
data = {'Product 1 Weight':['0', '.15', '.15', '.15','.15','.25','.25','.255'],
'Product 2 Weight':['0', '0', '0', '0','0','0','0','0'],
'Product 3 Weight':['0', '0', '0', '0','0','.5','.5','.561']}
df = pd.DataFrame(data, index =['2020-04-01',
'2020-04-02',
'2020-04-03',
'2020-04-06',
'2020-04-07',
'2020-04-08',
'2020-04-09',
'2020-04-10'])
可能看起来完全随机,但对我当前的项目非常有用。
我们可以 mask
Product
中的值,例如在 Rebalance
列中不存在相应 index
的列,然后 ffill
向前填充和覆盖屏蔽值。
m = df.index.to_series().isin(rebalances['Rebalance'])
out = df.mask(~m).ffill().fillna(df)
>>> out
Product 1 Weight Product 2 Weight Product 3 Weight
2020-04-01 0 0 0
2020-04-02 .15 0 0
2020-04-03 .15 0 0
2020-04-06 .15 0 0
2020-04-07 .15 0 0
2020-04-08 .25 0 .5
2020-04-09 .25 0 .5
2020-04-10 .255 0 .561
我正在尝试通过日期时间索引覆盖产品 df 中预先计算的权重。我的挑战是只覆盖某个日期(在另一个 df 中列出)然后再做一次。数据示例:
data = {'Product 1 Weight':['0', '.15', '.19', '.2','.21','.25','.252','.255'],
'Product 2 Weight':['0', '0', '0', '0','0','0','0','0'],
'Product 3 Weight':['0', '0', '0', '0','0','.5','.551','.561']}
df = pd.DataFrame(data, index =['2020-04-01',
'2020-04-02',
'2020-04-03',
'2020-04-06',
'2020-04-07',
'2020-04-08',
'2020-04-09',
'2020-04-10'])
rebalances= pd.DataFrame({'Rebalance':['2020-04-02',
'2020-04-08',
'2020-04-10']})
在这个例子中,我想用 2020-04-02 的值覆盖 2020-04-02 到 2020-04-07 的所有产品的值。然后我想用 2020-04-08 的值覆盖 2020-04-08 到 2020-04-09 的所有产品的值,依此类推。重新平衡 df 会给我停止覆盖并开始另一个覆盖的日期。因此,我想要的最终输出看起来像:
data = {'Product 1 Weight':['0', '.15', '.15', '.15','.15','.25','.25','.255'],
'Product 2 Weight':['0', '0', '0', '0','0','0','0','0'],
'Product 3 Weight':['0', '0', '0', '0','0','.5','.5','.561']}
df = pd.DataFrame(data, index =['2020-04-01',
'2020-04-02',
'2020-04-03',
'2020-04-06',
'2020-04-07',
'2020-04-08',
'2020-04-09',
'2020-04-10'])
可能看起来完全随机,但对我当前的项目非常有用。
我们可以 mask
Product
中的值,例如在 Rebalance
列中不存在相应 index
的列,然后 ffill
向前填充和覆盖屏蔽值。
m = df.index.to_series().isin(rebalances['Rebalance'])
out = df.mask(~m).ffill().fillna(df)
>>> out
Product 1 Weight Product 2 Weight Product 3 Weight
2020-04-01 0 0 0
2020-04-02 .15 0 0
2020-04-03 .15 0 0
2020-04-06 .15 0 0
2020-04-07 .15 0 0
2020-04-08 .25 0 .5
2020-04-09 .25 0 .5
2020-04-10 .255 0 .561