যদিও এই প্রশ্নটি জিজ্ঞাসা করার পরে অনেক সময় হয়ে গেছে, আমি কারওর সাহায্যের আশায় আমার উত্তর পোস্ট করব।
দাবি অস্বীকার: আমি জানি এই সমাধানটি মান নয় , তবে আমি মনে করি এটি ভালভাবে কাজ করে।
import pandas as pd
import numpy as np
data = np.array([[10, 2, 10, 10],
[10, 3, 60, 100],
[np.nan] * 4,
[10, 22, 280, 250]]).T
idx = pd.date_range('20150131', end='20150203')
df = pd.DataFrame(data=data, columns=list('ABCD'), index=idx)
df
A B C D
=================================
2015-01-31 10 10 NaN 10
2015-02-01 2 3 NaN 22
2015-02-02 10 60 NaN 280
2015-02-03 10 100 NaN 250
def calculate(mul, add):
global value
value = value * mul + add
return value
value = df.loc['2015-01-31', 'D']
df.loc['2015-01-31', 'C'] = value
df.loc['2015-02-01':, 'C'] = df.loc['2015-02-01':].apply(lambda row: calculate(*row[['A', 'B']]), axis=1)
df
A B C D
=================================
2015-01-31 10 10 10 10
2015-02-01 2 3 23 22
2015-02-02 10 60 290 280
2015-02-03 10 100 3000 250
সুতরাং মূলত আমরা apply
পান্ডাস থেকে একটি এবং একটি বিশ্বব্যাপী ভেরিয়েবলের সহায়তা ব্যবহার করি যা পূর্ববর্তী গণনা করা মানটিকে ট্র্যাক করে।
একটি for
লুপের সাথে সময়ের তুলনা :
data = np.random.random(size=(1000, 4))
idx = pd.date_range('20150131', end='20171026')
df = pd.DataFrame(data=data, columns=list('ABCD'), index=idx)
df.C = np.nan
df.loc['2015-01-31', 'C'] = df.loc['2015-01-31', 'D']
%%timeit
for i in df.loc['2015-02-01':].index.date:
df.loc[i, 'C'] = df.loc[(i - pd.DateOffset(days=1)).date(), 'C'] * df.loc[i, 'A'] + df.loc[i, 'B']
৩.২ এস 2 ১১৪ এমএস প্রতি লুপ (অর্থাত্ ± স্ট্যান্ড ডেভেল 7 রান, প্রতি 1 টি লুপ)
data = np.random.random(size=(1000, 4))
idx = pd.date_range('20150131', end='20171026')
df = pd.DataFrame(data=data, columns=list('ABCD'), index=idx)
df.C = np.nan
def calculate(mul, add):
global value
value = value * mul + add
return value
value = df.loc['2015-01-31', 'D']
df.loc['2015-01-31', 'C'] = value
%%timeit
df.loc['2015-02-01':, 'C'] = df.loc['2015-02-01':].apply(lambda row: calculate(*row[['A', 'B']]), axis=1)
প্রতি লুপটিতে 1.82 s ± 64.4 এমএস (7 runs রানের গড় ± স্ট্যান্ড। ডিভ। প্রতিটি লুপ প্রতিটি)
সুতরাং গড়ে 0.57 গুণ দ্রুত।
A
এবংB
?