Pandas DataFrame Transpose和Matrix Multiplication

时间:2017-05-29 01:50:16

标签: pandas numpy matrix dataframe

我正在寻找一种在数据帧中对两组列执行矩阵乘法的方法。需要对一组列进行转置,然后与另一组进行相乘。然后我需要得到结果矩阵并用标量矩阵做一个元素明智的产品并加起来。以下是一个例子:

测试数据:

import pandas as pd
import numpy as np
dftest = pd.DataFrame(data=[['A',0.18,0.25,0.36,0.21,0,0.16,0.16,0.64,0.04,0,0],['B',0,0,0.5,0.5,0,0,0,0.25,0.75,0,0]],columns = ['Ticker','f1','f2','f3','f4','f5','p1','p2','p3','p4','p5','multiplier'])

使用Tickers的数据启动数据帧。 f1到f5表示一组类别,p1到p5表示另一组。

 dftest
    Out[276]: 
      Ticker    f1    f2    f3    f4  f5    p1    p2    p3    p4  p5  multiplier
    0      A  0.18  0.25  0.36  0.21   0  0.16  0.16  0.64  0.04   0           0
    1      B  0.00  0.00  0.50  0.50   0  0.00  0.00  0.25  0.75   0           0

对于每一行,我需要转置列p1到p5,然后将它们乘以列f1到f5。我想我已经在下面找到了解决方案。

dftest.groupby('Ticker')['f1','f2','f3','f4','f5','p1','p2','p3','p4','p5'].apply(lambda x: x[['p1','p2','p3','p4','p5']].T.dot(x[['f1','f2','f3','f4','f5']]))
Out[408]: 
               f1    f2      f3      f4   f5
Ticker                                      
A      p1  0.0288  0.04  0.0576  0.0336  0.0
       p2  0.0288  0.04  0.0576  0.0336  0.0
       p3  0.1152  0.16  0.2304  0.1344  0.0
       p4  0.0072  0.01  0.0144  0.0084  0.0
       p5  0.0000  0.00  0.0000  0.0000  0.0
B      p1  0.0000  0.00  0.0000  0.0000  0.0
       p2  0.0000  0.00  0.0000  0.0000  0.0
       p3  0.0000  0.00  0.1250  0.1250  0.0
       p4  0.0000  0.00  0.3750  0.3750  0.0
       p5  0.0000  0.00  0.0000  0.0000  0.0

接下来,我需要将上述矩阵的元素明智产品与另一个DataFrame中的另一个5x5矩阵进行比较,然后将列或行相加(无论哪种方式都得到相同的结果)。如果我将上述声明扩展如下,我得到了我想要的结果。

dftest.groupby('Ticker')['f1','f2','f3','f4','f5','p1','p2','p3','p4','p5'].apply(lambda x: pd.DataFrame(m.values * x[['p1','p2','p3','p4','p5']].T.dot(x[['f1','f2','f3','f4','f5']]).values, columns = m.columns, index = m.index).sum().sum())
Out[409]: 
Ticker
A    2.7476
B    1.6250
dtype: float64

我认为到目前为止一切顺利。很高兴知道一个更好,更快的方法来做到这一点。接下来的问题就是我陷入困境的地方。

我该怎么做并更新"乘数"我的原始dataFrame上的列?

如果我尝试执行以下操作:

dftest['multiplier']=dftest.groupby('Ticker')['f1','f2','f3','f4','f5','p1','p2','p3','p4','p5'].apply(lambda x: pd.DataFrame(m.values * x[['p1','p2','p3','p4','p5']].T.dot(x[['f1','f2','f3','f4','f5']]).values, columns = m.columns, index = m.index).sum().sum())

我在乘数列中得到了NaN。

dftest
Out[407]: 
  Ticker    f1    f2    f3    f4  f5    p1    p2    p3    p4  p5  multiplier
0      A  0.18  0.25  0.36  0.21   0  0.16  0.16  0.64  0.04   0         NaN
1      B  0.00  0.00  0.50  0.50   0  0.00  0.00  0.25  0.75   0         NaN

我怀疑它与索引以及分组后的所有索引是否都转换回原始数据帧有关。第二,我是否需要一个分组声明?由于它是逐行解决方案,我不能在没有分组或按索引分组的情况下这样做吗?有什么建议吗?

我需要在不逐行迭代的情况下执行此操作,因为整个代码将由于我必须进行的一些优化而迭代。因此,我需要运行整个过程,查看结果,如果它们超出某些约束条件,则计算新的f1到f5和p1到p5并再次运行整个过程。

我之前发布了一个问题,但这是令人困惑的,所以这是第二次尝试。希望它有意义。

提前感谢您的帮助。

0 个答案:

没有答案