首页 > 解决方案 > 我如何创建一个函数来在 GDP 数据框中找到衰退开始和衰退底部的时期。(给出了衰退的定义。)

问题描述

我有一个由 State 和 RegionName 组成的数据框作为索引和列,按顺序描述一年的季度和那一年。例如,2000q3 表示 2000 年的第三季度。单元格中的值是该地区在该特定时期的 GDP 值。

State        RegionName   2000q1     2000q2     2000q3     2000q4      2001q1    ..........
NewYork      NewYork     
California   Los Angeles  207066.67  214466.67  220966.67  226166.67   233000.00 ..........
Illilois     Chicago      138400.00  143633.33  147866.67  152133.33   156933.33 ..........
Pennsylvania Philadelphia 53000.00   53633.33   54133.33    54700.00    55333.33 .......... 
...........  ..........   ........   .......    .......    .........   ......... ..........

我需要为每一行编写一个函数:对于每一行,即每个区域,我需要找到衰退开始的四分之一和衰退底部,并将它们放在名为“Rec_start”和“Rec_bottom”的新列中。

衰退:衰退的定义是从 GDP 连续两个季度下降开始,到 GDP 连续两个季度增长结束。衰退也可能连续两个季度以上下降,但衰退必须以连续两个季度的增长结束。

衰退底部:衰退底部是衰退中GDP最低的季度。

例如:a>a+1>a+2>a+3>a+4并且a+4<a+5<a+6对应的时期a+1是 RECESSION START,因为从这里开始 GDP 开始下降。a+4指向衰退底部并a+6指出衰退结束,因为它完成了连续两个季度的增长。

比率 = GDP(衰退开始前的季度)/GDP(衰退底部的季度)这是我试图编写的代码:

col=df.columns.tolist()
df=df.apply(ratio,axis=1,colo=col)  

def ratio(row,colum):

    for i in range(1,len(colo)-3):
        if(row[colum[i]]<row[colum[i-1]]) and (row[colum[i]]>row[colum[i+1]]) and (row[colum[i+1]]<row[colum[i+2]]) and (row[colum[i+2]]<row[colum[i+3]]):
          # Checking the condition for Recession
            for j in range(1,i):
                if row[colum[i-1-j]]>row[colum[i-j]]: 
                    continue  #Now tracing back to where Recession started
                else: 
                    if row[colum[i-1-j]]<row[colum[i-j]]:
                        row['Rec_start']=row[colum[i-j+1]] #Recession start
                        row['Rec_bottom']=row[colum[i+1]]  #Recession bottom
                    break
            break 
    return (row) 

我使用 for 循环创建了自己的函数,并使用 pd.Apply 方法将其应用于每一行,但我得到了错误的比率值。有人可以帮助我制作一个可以执行我上面提到的任务的正确功能吗?如果这个问题有什么不清楚的,请问我。

提前致谢!

标签: pythonpandas

解决方案


你可以这样做。

输入

St  Rg  12q1    12q2    12q3    12q4    12q5    12q6    12q7    12q8    12q9    12q10
xy  xy  20        21      19    18        16    14        12    13        14    15
ab  ab  45        46      47    48        45    44        45    46        43    47
de  de  100       99      98    66        55    44        22    11        12    13
ef  ef  45        44      46    47        42    41        40    44        43    45

代码

a = df.set_index(['St','Rg']).diff(axis=1)
a[a<0]=-1
a[a>=0]=1
a[a==1]=0
a[a==-1]=1
a[~(a.shift(axis=1)==1)&~(a.shift(-1,axis=1)==1)]=0
rs = a.idxmax(axis=1, skipna=True).reset_index(name='Rec_strt')
rb = a.gt(0).cumsum(axis=1).idxmax(axis=1).reset_index(name='Rec_btm')
pd.merge(pd.merge(df,rs,on=['St','Rg']),rb,on=['St','Rg'])

输出

St  Rg  12q1    12q2    12q3    12q4    12q5    12q6    12q7    12q8    12q9    12q10   Rec_strt    Rec_btm
xy  xy  20      21      19      18      16      14      12      13      14      15          12q3    12q7
ab  ab  45      46      47      48      45      44      45      46      43      47          12q5    12q6
de  de  100     99      98      66      55      44      22      11      12      13          12q2    12q8
ef  ef  45      44      46      47      42      41      40      44      43      45          12q5    12q7


推荐阅读