我不熟悉应用矩阵计算,并且在尝试将以下复杂因素应用于我的DataFrame中的每个数据点时,我无法快速获取(以下值均为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))
要应用此矩阵的DataFrame具有多级列。每列都是一个独立的系列,它跨越DataFrame的时间序列索引(填充了NaN
的空数据点)。
以下代码生成测试DataFrame,我正在尝试:
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'])
答案 0 :(得分:0)
如果我正确理解问题,您需要使用元素操作来更新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
或&#34;手工&#34;:
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