2017-09-25 76 views
0

我已经建立了一种财务预测模型。这是非常漫长的,我不确定我会用它来做什么样的功能。基本上我需要根据前一年计算本年度的预计支出,然后重新列出清单的优先顺序,以便在上一财年购买的东西降到最低。我试图计算30年。我知道这可以通过一个循环来完成,但是,可用于支出的预算每年都会发生变化。对于熊猫数据框可以调整的迭代函数?

这里是我试图达到的数据帧的例子:

Budget_Y1 = 400.00 
    Budget_Y2 = 300.00 

    DF1 
Part   RankY1  CostY1  SpendY1 RankY2 CostY2 SpendY2 

Transmission  1   400  400   4   0  0 
Tires    2   200  0   1  200  200 
Windshield  3   100  0   2  100  100 
Wipers   4   20  0   3   20  0 

我的数据最终要复杂得多此,涉及数百万行。

现在我计算每年单独基于上一年,以便我可以轻松地更改每年可用预算,以运行不同的资金情况。

我的问题是有一个函数(或函数的类型),可以计算每年基于上一年与每年不同的预算,所以我不需要手代码的所有计算?

我在寻找一个发电机做这样的事情或其他一些功能?基本上它会类似于amoritzation计算器的种类。

现在我用这个代码,一遍又年过三十出来让每年的成本,因为预算每年是不同的:

df1.loc[(df1['RankY2']<4), 'CostY2'] = df1['CostY1'] 

    df1['Spend_Y2']= np.where((df1.Cost_Y2.cumsum(
            <=budget_Y2), df1.Cost_Y2 ,0) 

    ...Repeat some other calculations... 

    ...do new priority calculation... 

    df1 = df1.sort_values('RankY3', ascending = False) 

编辑的一个更明显的例子。

+0

每年的数据结构是什么? – GiantsLoveDeathMetal

+0

一个简单的数值例子将有助于带来更好的可重现代码 – chrisckwong821

+0

@GiantsLoveDeathMetal我编辑了这个例子,它是一个熊猫数据框。这有帮助吗? – EEPBAH

回答

1

对于你想达到的目标还很不清楚。

这是在你的函数的循环,但:

def budget_calculations(df, year_budget): 
    df.loc[(df['RankY2']<4), 'CostY2'] = df['CostY1'] 

    df['Spend_Y2'] = np.where((df.Cost_Y2.cumsum(<=year_budget), df.Cost_Y2, 0) 

    return df.sort_values('RankY3', ascending = False) 


for budget in budget_list: 
    df = budget_calculation(df, budget) 

这将通过budget_list(例如[100, 250, 300])和输出新pd.DataFrame迭代到下一次迭代中使用。

如果要计算每个迭代的预算:

# iterate 30 times 
for n in range(30): 
    budget = calculate_budget(df, budget) 

而且已经calculate_budget return下一年的预算。

最后,你可以同时返回的项目和预算,像这样:

budget_each_year = [] 
for n in range(30): 
    df, budget = calculate_year(df, budget) 
    budget_each_year.append(budget) 

这将创建预算的各个版本中的列表。