在Python中,计算某些列依赖于其他列和以前的值的表最有效的方法是什么?
我正在开发一个模型,并使用Pandas数据帧作为输入,每一行代表一个给定id的周期。我需要计算一些列(这将是模型的输出)。问题是一列是另一列的函数(D=F(A,固定输入)A是bt-1(前一周期B的值),B是A-D。因此,这里的问题是,每一列都相互依赖,而我发现解决这一问题的唯一方法是使用itertuples()迭代行,但这种方法太慢了。我想知道是否有一种更有效的方法可以做到这一点,也许不用迭代 这将是简化的初始表(有更多的列和操作) 所需的输出将是:在Python中,计算某些列依赖于其他列和以前的值的表最有效的方法是什么?,python,pandas,performance,dataframe,loops,Python,Pandas,Performance,Dataframe,Loops,我正在开发一个模型,并使用Pandas数据帧作为输入,每一行代表一个给定id的周期。我需要计算一些列(这将是模型的输出)。问题是一列是另一列的函数(D=F(A,固定输入)A是bt-1(前一周期B的值),B是A-D。因此,这里的问题是,每一列都相互依赖,而我发现解决这一问题的唯一方法是使用itertuples()迭代行,但这种方法太慢了。我想知道是否有一种更有效的方法可以做到这一点,也许不用迭代 这将是简化的初始表(有更多的列和操作) 所需的输出将是: Id Period M
Id Period MoneyInitial MoneyBoP Money_EoP Money_Paid
0 0001 1 1000 1000 900 -100
1 0001 2 1000 900 850 -50
2 0001 3 1000 850 700 -150
3 0001 4 1000 700 600 -100
4 0001 5 1000 600 450 -150
5 0001 6 1000 450 300 -150
6 0001 7 1000 150 50 -100
7 0001 8 1000 50 0 -50
- 对于每个合同的第1期,MoneyBoP等于MoneyInitial,其余为前一期的MoneyEOP
- Money_Payed是一个函数,它采用MoneyBoP和其他输入(已在初始表格中计算)进行计算
- Money\u EoP是MoneyBoP+Money\u Paid
Id Period MoneyInitial MoneyBoP Money_EoP Money_Paid
0 0001 1 1000 1000 900 -100
1 0001 2 1000 900 850 -50
2 0001 3 1000 850 700 -150
3 0001 4 1000 700 600 -100
4 0001 5 1000 600 450 -150
5 0001 6 1000 450 300 -150
6 0001 7 1000 150 50 -100
7 0001 8 1000 50 0 -50
看起来所有的值都可以在知道周期数和初始值的情况下进行计算
#Some function to calculate MoneyPaid from BoP
def MoneyPaid(BoP):
return round(-BoP * .1, 2)
#Calculate
def Calculate_Data(start, n):
d = [] # {'BoP' : [], 'EoP' : [], 'MP' : []}
for i in range(0, n):
bop = start
mp = MoneyPaid(bop)
start = start + mp
d.append((bop,start,mp))
return pd.DataFrame(d)
df[['MoneyBoP','Money_EoP','Money_Paid']] = Calculate_Data(df.iloc[0]['MoneyInitial'], len(df))
其结果是
Id Period MoneyInitial MoneyBoP Money_EoP Money_Paid
0 1 1 1000 1000.00 900.00 -100.00
1 1 2 1000 900.00 810.00 -90.00
2 1 3 1000 810.00 729.00 -81.00
3 1 4 1000 729.00 656.10 -72.90
4 1 5 1000 656.10 590.49 -65.61
5 1 6 1000 590.49 531.44 -59.05
6 1 7 1000 531.44 478.30 -53.14
7 1 8 1000 478.30 430.47 -47.83
你尝试了什么?我用itertuples对表进行了迭代,这实际上是可行的,但速度太慢了。也许我可以对ID进行迭代(获得具有相同ID的所有行)为每个ID并行循环?但这里的问题是Money_Paid是一个需要每个周期MoneyBoP的函数抱歉,我错过了。我已经用一种可能的方法更新了答案。