簡體   English   中英

熊貓/ Python建模時間序列,具有不同輸入的組

[英]Pandas/Python Modeling Time-Series, Groups with Different Inputs

我正在嘗試為未來幾年的資產組建模不同的方案。 這是我在Excel中非常繁瑣的工作,但是我想利用我用Pandas建立的大型數據庫。

例:

annual_group_cost = 0.02

df1:

year  group  x_count  y_count  value
2018   a       2        5      109000
2019   a       0        4      nan
2020   a       3        0      nan
2018   b       0        0      55000
2019   b       1        0      nan
2020   b       1        0      nan
2018   c       5        1      500000
2019   c       3        0      nan
2020   c       2        5      nan

df2:

group  x_benefit  y_cost  individual_avg  starting_value
a       0.2        0.72     1000            109000
b       0.15       0.75     20000           55000
c       0.15       0.70     20000           500000

我想更新df1中的值,方法是取上一年的值(或起始值),然后加上x收益,y成本和年度成本。 我假設這需要一個功能來完成,但是我不知道一種有效的方法來處理它。

我想要的最終輸出是:

df1:

year  group  x_count  y_count  value
2018   a       2        5      103620
2019   a       0        4      98667.3
2020   a       3        0      97294.248
2018   b       0        0      53900
2019   b       1        0      56822
2020   b       1        0      59685.56
2018   c       5        1      495000
2019   c       3        0      497100
2020   c       2        5      420158

我通過使用以下方法實現了這一點:

starting_value-(starting_value*annual_group_cost)+(x_count*(individual_avg*x_benefit))-(y_count*(individual_avg*y_cost))

由於后續的新值取決於先前計算的新值,因此這將需要涉及一個for循環(即使在幕后使用例如apply ):

for i in range(1, len(df1)):
    if np.isnan(df1.loc[i, 'value']):
        df1.loc[i, 'value'] = df1.loc[i-1, 'value'] #your logic here

您應該將兩個表合並在一起,然后對數據系列執行功能

hold = df_1.merge(df_2, on=['group']).fillna(0)

x = (hold.x_count*(hold.individual_avg*hold.x_benefit))
y = (hold.y_count*(hold.individual_avg*hold.y_cost))

for year in hold.year.unique():
    start = hold.loc[hold.year == year, 'starting_value']
    hold.loc[hold.year == year, 'value'] = (start-(start*annual_group_cost)+x-y)
    if year != hold.year.max():
       hold.loc[hold.year == year + 1, 'starting_value'] = hold.loc[hold.year == year, 'value'].values

hold.drop(['x_benefit', 'y_cost', 'individual_avg', 'starting_value'],axis=1)

會給你

   year group  x_count  y_count       value
0  2018     a        2        5    103620.0
1  2019     a        0        4     98667.6
2  2020     a        3        0    97294.25
3  2018     b        0        0     53900.0
4  2019     b        1        0     55822.0
5  2020     b        1        0    57705.56
6  2018     c        5        1    491000.0
7  2019     c        3        0    490180.0
8  2020     c        2        5    416376.4

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM