按日期对数据框应用权重
Apply a weight to a dataframe by date
我有一个 DataFrame
是 Date
indexed
并且有几个 columns
像这样:
XLY UA
Date
2017-04-01 0.023991 0.060656
2017-05-01 0.010993 -0.081401
2017-06-01 -0.015596 0.130679
2017-07-01 0.019302 -0.101686
2017-08-01 -0.018608 -0.166207
2017-09-01 0.004684 -0.005298
2017-10-01 0.021203 -0.232357
2017-11-01 0.050658 0.034692
2017-12-01 0.021107 0.116513
2018-01-01 0.092411 -0.035285
2018-02-01 -0.034691 0.171206
...
2022-03-01 0.079468 0.039667
我有 python
dictionary
个权重
weights = {2022: 6, 2021: 5, 2020: 4, 2019: 3, 2018: 2, 2017: 1}
有没有办法将这些权重 apply
分配给 Dataframe
的每个 row
,例如,row
2022-03-01
将是 0.079468 * 6
和 .039667 * 6
等等对于 2022 年的所有行,当它到达 2021 年时,它将应用 5 *
,等等
我知道我可以 loop
做到这一点。我正在寻找 functional
简洁版。
在 axis=0
上使用 mul
:
weights = {2022: 6, 2021: 5, 2020: 4, 2019: 3, 2018: 2, 2017: 1}
cols = ['XLY', 'UA']
df[cols] = df[cols].mul(df.index.year.map(weights), axis=0)
print(df)
# Output
XLY UA
Date
2017-04-01 0.023991 0.060656
2017-05-01 0.010993 -0.081401
2017-06-01 -0.015596 0.130679
2017-07-01 0.019302 -0.101686
2017-08-01 -0.018608 -0.166207
2017-09-01 0.004684 -0.005298
2017-10-01 0.021203 -0.232357
2017-11-01 0.050658 0.034692
2017-12-01 0.021107 0.116513
2018-01-01 0.184822 -0.070570
2018-02-01 -0.069382 0.342412
2022-03-01 0.476808 0.238002
我会这样做:
col_weights = np.array([weights[dt.year] for dt in df.index.get_level_values(0)])
df.loc[:, "XLY"] = df["XLY"] * col_weights
df.loc[:, "UA"] = df["UA"] * col_weights
第一行创建一个权重数组映射 index.year 到权重字典。
下一行对每一列应用权重。
我有一个 DataFrame
是 Date
indexed
并且有几个 columns
像这样:
XLY UA
Date
2017-04-01 0.023991 0.060656
2017-05-01 0.010993 -0.081401
2017-06-01 -0.015596 0.130679
2017-07-01 0.019302 -0.101686
2017-08-01 -0.018608 -0.166207
2017-09-01 0.004684 -0.005298
2017-10-01 0.021203 -0.232357
2017-11-01 0.050658 0.034692
2017-12-01 0.021107 0.116513
2018-01-01 0.092411 -0.035285
2018-02-01 -0.034691 0.171206
...
2022-03-01 0.079468 0.039667
我有 python
dictionary
个权重
weights = {2022: 6, 2021: 5, 2020: 4, 2019: 3, 2018: 2, 2017: 1}
有没有办法将这些权重 apply
分配给 Dataframe
的每个 row
,例如,row
2022-03-01
将是 0.079468 * 6
和 .039667 * 6
等等对于 2022 年的所有行,当它到达 2021 年时,它将应用 5 *
,等等
我知道我可以 loop
做到这一点。我正在寻找 functional
简洁版。
在 axis=0
上使用 mul
:
weights = {2022: 6, 2021: 5, 2020: 4, 2019: 3, 2018: 2, 2017: 1}
cols = ['XLY', 'UA']
df[cols] = df[cols].mul(df.index.year.map(weights), axis=0)
print(df)
# Output
XLY UA
Date
2017-04-01 0.023991 0.060656
2017-05-01 0.010993 -0.081401
2017-06-01 -0.015596 0.130679
2017-07-01 0.019302 -0.101686
2017-08-01 -0.018608 -0.166207
2017-09-01 0.004684 -0.005298
2017-10-01 0.021203 -0.232357
2017-11-01 0.050658 0.034692
2017-12-01 0.021107 0.116513
2018-01-01 0.184822 -0.070570
2018-02-01 -0.069382 0.342412
2022-03-01 0.476808 0.238002
我会这样做:
col_weights = np.array([weights[dt.year] for dt in df.index.get_level_values(0)])
df.loc[:, "XLY"] = df["XLY"] * col_weights
df.loc[:, "UA"] = df["UA"] * col_weights
第一行创建一个权重数组映射 index.year 到权重字典。 下一行对每一列应用权重。