2017-02-14 10 views
0

は、データフレームの各行に対して(コードのように)式の値を計算する必要があります。 現在のコードは機能しますが、計算に時間がかかりすぎます。 は同じものを実装するためのより速い方法を必要とします。前の行の値に基づいて行の値を計算する方が速く、pandasデータフレーム

コード:データフレームで

num =0 
den = 0  
for i in range(1,2000): 
    p1 = p[i] 
    t1 = tx[i] 
    num = num * pow(numpy.e,-1*t1) + p1 
    den = den * pow(numpy.e,-1*t1) + 1 
    t["s"][i] = num/den 

すべての値が約2000行に対して80secのテイクコード上記のfloatデータ型 です。 実際のデータフレームは100万行以上あります

をお勧めします。 ありがとう!

答えて

0

tはあなたが評価する必要がある唯一の変数である場合は、これは十分だろうpow(numpy.e, -t1)

num = 0 
den = 0  
for i in range(1,2000): 
    p1 = p[i] 
    #t1 = tx[i] 
    num += p1 
    den += 1 
    t["s"][i] = num/den 

を必要としません。

EDIT:

def mytest(a, b): 
    t = [] 
    num, den = 0, 0 
    for i in range(1, 2000): 
     num = num * pow(np.e, -b[i]) + a[i] 
     den = den * pow(np.e, -b[i]) + 1 
     t.append(num/den) 
    return t 

def mytest2(a, b): 
    t = [] 
    num, den = 0, 0 
    neck = pow(np.e, -b) # bottle neck 
    for i in range(1, 2000): 
     num = num * neck[i] + a[i] 
     den = den * neck[i] + 1 
     t.append(num/den) 
    return t 

出力:

%timeit mytest(random.rand(2000), random.rand(2000)) 
100 loops, best of 3: 3.26 ms per loop 
%timeit mytest2(random.rand(2000), random.rand(2000)) 
100 loops, best of 3: 1.54 ms per loop 

残念ながら、私はあなたの(巨大な)80秒を再現することはできません。あなたは別の場所で修正する必要があります。

+0

申し訳ありません。コードを更新しました – Rishi

+0

ありがとうございました!私のコードでは、時間がかかりました。リストに保存してデータフレームに追加することができます。方法はより速く動作します。 – Rishi

関連する問題