我有一个数据框“X”,如下所示:
ticker | date | close |
A | 2002-01-02 | 20 |
A | 2002-01-11 | 10 |
...
A | 2003-01-11 | 15 |
...
C | 2002-01-31 | 40 |
C | 2002-02-01 | 50 |
...
C | 2003-02-01 | 56 |
另一个数据框'Y'看起来像:
ticker | date | annual weight |
A | 2002-03-31 | 0.2 |
A | 2003-02-11 | 0.5 |
...
C | 2002-01-31 | 0.6 |
C | 2003-02-01 | 1.2 |
...
我想将'Y'中的'年度权重'(按年份而不是完整日期,因为它们不均匀)乘以'X'中的'close',以获得'X'中的新列,称为'权重' *关闭'因为每个股票代码每年只有1年的重量。
此外,X包含Y的所有日期值,但Y仅包含几个日期值X。
那么我遇到的问题是尝试合并这样:
X = X.merge(Y, on = ['ticker', 'date'])
然后进行乘法
X['weight*close'] = Y[['annual weight'].multiply(X['close'], axis=Index)
无法正常工作,因为它试图合并“日期”,它只能在X和Y中找到日期,然后丢弃X中不在Y中的值 - 但我想要全部。
如何将所有值保留在X中并仅按年份进行乘法?
答案 0 :(得分:0)
您可以重新取样数据框以对齐日期。首先,将数据列转换为DateTime
,如果它们还不是DateTime
:
X.date = pd.to_datetime(X.date)
Y.date = pd.to_datetime(Y.date)
然后,通过自动收报机进行分组并重新取样。我使用均值进行重新采样,您可能希望使用sum
或任何其他聚合函数。
X_resampled = X.set_index('date').groupby('ticker').resample('1Y').mean()
Y_resampled = Y.set_index('date').groupby('ticker').resample('1Y').mean()
最后,找到产品:
X_resampled['close'] * Y_resampled['annual weight']
#ticker date
#A 2002-12-31 3.0
# 2003-12-31 7.5
#C 2002-12-31 27.0
# 2003-12-31 67.2