हालाँकि इस प्रश्न को पूछे जाने में कुछ समय हो गया है, मैं अपना उत्तर इस उम्मीद से दूंगा कि यह किसी की मदद करता है।
अस्वीकरण: मुझे पता है कि यह समाधान मानक नहीं है , लेकिन मुझे लगता है कि यह अच्छी तरह से काम करता है।
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']
3.2 एस d 114 एमएस प्रति लूप (मतलब dev एसटीडी। 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 82 64.4 एमएस प्रति लूप (मतलब dev एसटीडी। 7 रन का देवता, 1 लूप प्रत्येक)
तो औसतन 0.57 गुना तेज।
A
औरB
?