Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中,计算某些列依赖于其他列和以前的值的表最有效的方法是什么?_Python_Pandas_Performance_Dataframe_Loops - Fatal编程技术网

在Python中,计算某些列依赖于其他列和以前的值的表最有效的方法是什么?

在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

我正在开发一个模型,并使用Pandas数据帧作为输入,每一行代表一个给定id的周期。我需要计算一些列(这将是模型的输出)。问题是一列是另一列的函数(D=F(A,固定输入)A是bt-1(前一周期B的值),B是A-D。因此,这里的问题是,每一列都相互依赖,而我发现解决这一问题的唯一方法是使用itertuples()迭代行,但这种方法太慢了。我想知道是否有一种更有效的方法可以做到这一点,也许不用迭代

这将是简化的初始表(有更多的列和操作)

所需的输出将是:

         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的函数抱歉,我错过了。我已经用一种可能的方法更新了答案。