按年度合并和乘以2个不均匀的Pandas数据帧

时间:2018-06-13 19:16:23

标签: python pandas dataframe merge

我有一个数据框“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中并仅按年份进行乘法?

1 个答案:

答案 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