从“pd.DataFrame” df 开始:〜
n v
0 1 0.0
1 2 0.0
2 3 0.0
3 4 0.0
4 5 0.0
5 6 0.0
我想将“v”列中的值相加,即通过将“v”列的前一个单元格与固定因子相乘来生成“v”列中的一个单元格,然后添加“n”列的当前单元格值。(请参阅下面的示例计算表)
## sample calculation table :~
n v[i] n + v[i-1] * fixed factor
1 1.0 = 1 + 0.0 * 0.5
2 2.5 = 2 + 1.0 * 0.5
3 4.25 = 3 + 2.5 * 0.5
4 6.125 = 4 + 4.25 * 0.5
5 8.0625 = 5 + 6.125 * 0.5
6 10.03125 = 6 + 8.063 * 0.5
通过逐行迭代来完成此操作(参见下面的 for 循环)。
然而,我认为矢量化方法(例如 cumsum 和 shift)可能更有效,但不知道如何实现;因为 cumsum 通过乘法变得复杂,从空列 v 开始,并且需要引用列的前一个单元格。
想知道如何使用矢量化方法来实现这一点吗?
重现我的代码:
df = pd.DataFrame({'n':[1,2,3,4,5,6]})
df['v'] = 0.0
def fnv(nu, vu):
return nu + vu * 0.5
for i in range(0, df.shape[0]):
df.v.at[i] = fnv(df.n.at[i], df.v.at[i-1] if i>0 else 0.0)
df (RESULTS) :~
n v
0 1 1.00
1 2 2.50
2 3 4.25
3 4 6.12
4 5 8.06
5 6 10.03
递归计算不可矢量化,为了提高性能使用numba:
解决方案比较,在真实数据中最佳测试:
由于
n
是变量,您无法轻松地对其进行矢量化(您可以使用矩阵运算,参见下文,但这将占用 O(n^2) 空间)。一个好的权衡可能是使用numba来加快操作:
输出:
矢量化方法
您可以使用方阵进行矢量化:
中间体:
你可以用 0.5 幂的核对列进行卷积,如果达到机器精度,则截断:
你需要将卷积变成一个
pandas
函数,但它应该很快,而不需要numba