[英]What is the most efficient way to generate a serie from a recurrence relation in Python using pandas and numpy?
[英]Recurrence relation in Pandas
我有一個DataFrame, df
,在pandas中有系列df.A
和df.B
,我正在嘗試創建第三個系列, df.C
依賴於A和B以及之前的結果。 那是:
C[0]=A[0]
C[n]=A[n] + B[n]*C[n-1]
這樣做最有效的方法是什么? 理想情況下,我不必回到for
循環。
編輯
這是給定A和B的C的期望輸出。現在只需要弄清楚如何...
import pandas as pd
a = [ 2, 3,-8,-2, 1]
b = [ 1, 1, 4, 2, 1]
c = [ 2, 5,12,22,23]
df = pd.DataFrame({'A': a, 'B': b, 'C': c})
df
您可以使用令人討厭的累積產品和其他向量的拉鏈來對此進行矢量化。 但它不會最終節省你的時間。 事實上,它可能在數值上不穩定。
相反,你可以使用numba
加速你的循環。
from numba import njit
import numpy as np
import pandas as pd
@njit
def dynamic_alpha(a, b):
c = a.copy()
for i in range(1, len(a)):
c[i] = a[i] + b[i] * c[i - 1]
return c
df.assign(C=dynamic_alpha(df.A.values, df.B.values))
A B C
0 2 1 2
1 3 1 5
2 -8 4 12
3 -2 2 22
4 1 1 23
對於這個簡單的計算,這將與簡單計算一樣快
df.assign(C=np.arange(len(df)) ** 2 + 2)
df = pd.concat([df] * 10000)
%timeit df.assign(C=dynamic_alpha(df.A.values, df.B.values))
%timeit df.assign(C=np.arange(len(df)) ** 2 + 2)
337 µs ± 5.87 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 333 µs ± 20.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
試試這個:
C[0]=A[0] C=[A[i]+B[i]*C[i-1] for i in range(1,len(A))]
比循環快得多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.