python - 我如何创建一个函数来在 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 方法将其应用于每一行,但我得到了错误的比率值。有人可以帮助我制作一个可以执行我上面提到的任务的正确功能吗?如果这个问题有什么不清楚的,请问我。
提前致谢!
解决方案
你可以这样做。
输入
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
推荐阅读
- php - 如何在传递参数数据的 Ajax 代码中添加查询?
- google-bigquery - 如何解决biqquery中未声明的查询参数错误?
- c# - 如何使用 SFTP 向大型机提交/检索批处理作业
- javascript - 如何将多个 html 表单发送到同一文件/数据库中的不同谷歌工作表?我有一张谷歌表,总共有 3 张表
- angular - Promise 未处理的拒绝 | 康波多克 | 角
- javascript - 对数组进行排序并传递它后,React 钩子 useState/setState 不起作用
- api - PHP SOAP 传递参数 a:DeserializationFailed 错误
- python - 检查目标时出错:预期的 dense_6 有 4 个维度,但得到了形状为 (20116, 10) 的数组
- node.js - 将输入参数传递给节点 mssql 查询函数
- javascript - 图像未正确显示在 javascript 画布中