对时间序列索引数据帧的每一列应用调整矩阵



我不熟悉应用矩阵计算,并且在尝试将以下复杂性因素应用于数据帧中的每个数据点时,我的速度并不快(以下值都是abof变量值(。我已经尝试了df.apply()np.dot()np.matrix()的各种组合,但找不到一种方法(更不用说快速方法了!(来获得我需要的输出。

要应用的矩阵:

0.6   0.3   0.1  (=1.0)
|Low  |Med  |High
------------------
0.2   |Low  |1.1  |1.4  |2.0
0.4   |Med  |0.8  |1.0  |1.4
0.4   |High |0.6  |0.8  |1.1
(=1.0)

。所以我尝试应用的计算如下(如果datapoint是 500,调整后的结果将是 454(:

(<datapoint> * (0.2 * 0.6 * 1.1) + (0.2 * 0.3 * 1.4) + (0.2 * 0.1 * 2.0))
+(<datapoint> * (0.4 * 0.6 * 0.8) + (0.4 * 0.3 * 1.0) + (0.4 * 0.1 * 1.4))
+(<datapoint> * (0.4 * 0.6 * 0.6) + (0.4 * 0.3 * 0.8) + (0.4 * 0.1 * 1.1))

要应用的矩阵的数据帧

要应用此矩阵的数据帧具有多级列。每一列都是一个独立的序列,它跨数据帧的时间序列索引运行(用NaN填充的空数据点(。

以下代码生成我正在试验的测试数据帧:

element=[]
role=[]
#Generate the Series'
element1_part1= pd.Series(abs(np.random.randn(5)), index=pd.date_range('01-01-2018',periods=5,freq='D'))
element.append('Element 1')
role.append('Part1')
element1_part2= pd.Series(abs(np.random.randn(4)), index=pd.date_range('01-02-2018',periods=4,freq='D'))
element.append('Element 1')
role.append('Part2')
element2_part1= pd.Series(abs(np.random.randn(2)), index=pd.date_range('01-04-2018',periods=2,freq='D'))
element.append('Element 2')
role.append('Part1')
element2_part2= pd.Series(abs(np.random.randn(2)),  index=pd.date_range('01-02-2018',periods=2,freq='D'))
element.append('Element 2')
role.append('Part2')
element3 = pd.Series(abs(np.random.randn(4)), index=pd.date_range('01-02-2018',periods=4,freq='D'))
element.append('Element 3')
role.append('Only Part')

#Zip the multi-level columns to Tuples
arrays=[element,role]
tuples = list(zip(*arrays))
#Concatenate the Series' and define timeseries
elements=pd.concat([element1_part1, element1_part2, element2_part1, element2_part2, element3], axis=1)
dateseries=elements.index
elements.columns=pd.MultiIndex.from_tuples(tuples, names=['Level-1', 'Level-2'])

如果我正确理解了这个问题,您需要一个元素操作来更新elements数据框:

(<datapoint> * [(0.2 * 0.6 * 1.1) + (0.2 * 0.3 * 1.4) + (0.2 * 0.1 * 2.0)])
+(<datapoint> * [(0.4 * 0.6 * 0.8) + (0.4 * 0.3 * 1.0) + (0.4 * 0.1 * 1.4)])
+(<datapoint> * [(0.4 * 0.6 * 0.6) + (0.4 * 0.3 * 0.8) + (0.4 * 0.1 * 1.1)])

对于所有<datapoint>,此操作的形式为 (带x = <datapoint>(:

[x * (a + b + c)] + [x * (d + e + f)] + [x * (g + h + i)] 
= x * (a + ... + i)
= Cx # for some constant C

这意味着您只需要计算标量值C

row_val = np.array([0.2, 0.4, 0.4])
col_val = np.array([0.6, 0.3, 0.1])
mat_val = np.matrix([[1.1, 1.4, 2.0], 
[0.8, 1.0, 1.4], 
[0.6, 0.8, 1.1]])
apply_mat = np.multiply(np.outer(row_val, col_val), mat_val)
apply_vec = np.sum(apply_mat, axis=1)
C = np.sum(apply_vec)
# 0.908

或"手工":

print(((0.2 * 0.6 * 1.1) + (0.2 * 0.3 * 1.4) + (0.2 * 0.1 * 2.0)) +
((0.4 * 0.6 * 0.8) + (0.4 * 0.3 * 1.0) + (0.4 * 0.1 * 1.4)) +
((0.4 * 0.6 * 0.6) + (0.4 * 0.3 * 0.8) + (0.4 * 0.1 * 1.1)))
# 0.908

C的此值与示例数据点和预期输出匹配:

0.908 * 500 = 454.0

现在您可以使用mul()

elements.mul(C)

对于您的示例数据,这是输出:

Level-1    Element 1           Element 2           Element 3
Level-2        Part1     Part2     Part1     Part2 Only Part
2018-01-01  2.169116       NaN       NaN       NaN       NaN
2018-01-02  0.620286  1.645149       NaN  1.173356  0.277663
2018-01-03  0.782959  1.677798       NaN  0.557048  1.220138
2018-01-04  0.206314  0.773896  0.629524       NaN  0.572183
2018-01-05  1.209667  0.542614  0.666525       NaN  0.579032

最新更新