【发布时间】:2019-04-25 13:33:12
【问题描述】:
我有两个 DF,我想用它们来计算以下内容:
w(ti,ti)*a(ti)^2 + w(tj,tj)*b(sj,tj)^2 + 2*w(si,tj)*a(ti)*b(tj)
上面使用了两个术语(a,b)。 w 是权重 df,其中 i 和 j 是属于 a 和 b 的 Tn 索引的索引和列空间。
设置 - 编辑动态 W
import pandas as pd
import numpy as np
I = ['i'+ str(i) for i in range(4)]
Q = ['q' + str(i) for i in range(5)]
T = ['t' + str(i) for i in range(3)]
n = 100
df1 = pd.DataFrame({'I': [I[np.random.randint(len(I))] for i in range(n)],
'Q': [Q[np.random.randint(len(Q))] for i in range(n)],
'Tn': [T[np.random.randint(len(T))] for i in range(n)],
'V': np.random.rand(n)}).groupby(['I','Q','Tn']).sum()
df1.head(5)
I Q Tn V
i0 q0 t0 1.626799
t2 1.725374
q1 t0 2.155340
t1 0.479741
t2 1.039178
w = np.random.randn(len(T),len(T))
w = (w*w.T)/2
np.fill_diagonal(w,1)
W = pd.DataFrame(w, columns = T, index = T)
W
t0 t1 t2
t0 1.000000 0.029174 -0.045754
t1 0.029174 1.000000 0.233330
t2 -0.045754 0.233330 1.000000
实际上,我想使用 df1 中的索引 Tn 来为每个 I 和 Q 使用上述等式。
上例中df1.loc['i0','q0'] 的最终结果应该是:
W(t0,t0) * V(t0)^2
+ W(t2,t2) * V(t2)^2
+ 2 * W(t0,t2) * V(t0) * V(t2)
=
1.0 * 1.626799**2
+ 1.0 * 1.725374**2
+ (-0.045754) * 1.626799 * 1.725374
上例中df1.loc['i0','q1'] 的最终结果应该是:
W(t0,t0) * V(t0)^2
+ W(t1,t1) * V(t1)^2
+ W(t2,t2) * V(t2)^2
+ 2 * W(t0,t1) * V(t0) * V(t1)
+ 2 * W(t0,t2) * V(t0) * V(t2)
+ 2 * W(t2,t1) * V(t1) * V(t2)
=
1.0 * 2.155340**2
+ 1.0 * 0.479741**2
+ 1.0 * 1.039178**2
+ 0.029174 * 2.155340 * 0.479741 * 1
+ (-0.045754) * 2.155340 * 1.039178 * 1
+ 0.233330 * 0.479741 * 1.039178 * 1
此模式将根据每个 Q 中的 tn 项的数量重复,因此它应该足够健壮,可以根据需要处理尽可能多的 Tn 项(在示例中我使用 3,但它可能多达 100 个或更多) .
然后应将每个结果保存在带有Index = [I, Q] 的新 DF 中
当n 值增加时,该解决方案也不应该比 excel 慢。
提前致谢
【问题讨论】:
-
你的方程意味着值'w'对于所有三个项都是相同的,但它们不是。也许您应该重命名它们并描述它们与 df1 indices 的关系或派生方式。让您的读者更轻松。
-
df1.loc['i0','q0'有三个Tn。它是如何工作的? -
W不应该是对称的吗?如果不是,对于您给出的示例,我怎么知道在W.loc['t3','t4']和W.loc['t4','t3']之间使用哪个因素,因为您使用的是第一个因素,但为什么呢? -
我已将问题更改为与 cmets 对应
标签: python numpy dataframe multi-index quadratic