Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 每年合并并乘以2个数据帧_Python_Pandas_Dataframe_Merge - Fatal编程技术网

Python 每年合并并乘以2个数据帧

Python 每年合并并乘以2个数据帧,python,pandas,dataframe,merge,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 |

我有一个数据帧“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    |
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”看起来像:

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    |
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”中的“结束”,得到“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中,并仅按年份进行乘法?

您可以对数据帧重新采样以对齐日期。首先,将数据列转换为
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

您可以发布预期的输出吗?只需在这两个数据框中创建年份变量并合并它们。我成功地为两个数据框创建了一个年份变量以合并,但X有1700000多行,Y有27000多行,我认为这是由于绝对的容量给了我一个内存错误。