首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用熊猫发现美国GDP数据中的衰退

利用熊猫发现美国GDP数据中的衰退
EN

Code Review用户
提问于 2019-02-15 07:05:36
回答 1查看 1.4K关注 0票数 2

作为一项任务,我正在确定2008年美国经济衰退的第一季度。我使用的Excel数据可以在这里下载:gdplev.xls。我怎样才能改进这个熊猫代码,使它更加地道或优化呢?

代码语言:javascript
复制
def get_recession_start():
    '''Returns the year and quarter of the recession start time as a 
    string value in a format such as 2005q3'''
    GDP_df = pd.read_excel("gdplev.xls", 
                           names=["Quarter", "GDP in 2009 dollars"], 
                           parse_cols = "E,G", 
                           skiprows = 7)
    GDP_df = GDP_df.query("Quarter >= '2000q1'")
    GDP_df["Growth"] = GDP_df["GDP in 2009 dollars"].pct_change()
    GDP_df = GDP_df.reset_index(drop=True)
    # recession defined as two consecutive quarters of negative growth
    GDP_df["Recession"] = (GDP_df.Growth < 0) & (GDP_df.Growth.shift(-1) < 0) 
    return GDP_df.iloc[GDP_df["Recession"].idxmax()]["Quarter"]
get_recession_start()
EN

回答 1

Code Review用户

回答已采纳

发布于 2019-02-15 13:01:11

您的函数做了太多的事情:读取Excel文件、过滤必要的行以及计算"recession_start“。我的建议是把前两个都拿出来。

此外,供应季度和GDP作为单独的对象(pd.Series)的功能,而不是DataFrame。像这样,您将从函数中删除硬编码字符串,更重要的是,您将去掉您现在应该得到的SettingWithCopyWarning

代码语言:javascript
复制
df = pd.read_excel('gdplev.xls',
                   names=['Quarter', 'GDP in 2009 dollars'],
                   usecols='E,G',
                   skiprows=7)
mask = df['Quarter'] >= '2000q1'
print(get_recession_start(quarters=df.loc[mask, 'Quarter'],
                          gdps=df.loc[mask, 'GDP in 2009 dollars']))

请注意,我使用的是usecols而不是parse_cols,因为它是不推荐的。此外,我删除了df.query,以支持布尔掩蔽和.loc

然后,该函数将如下所示:

代码语言:javascript
复制
def get_recession_start(quarters: pd.Series,
                        gdps: pd.Series) -> str:
    """
    Returns the year and quarter of the recession start time
    as a string value in a format such as 2005q3
    """
    growth = gdps.pct_change()
    recession = (growth < 0) & (growth.shift(-1) < 0)
    recession = recession.reset_index(drop=True)
    return quarters.iloc[recession.idxmax()]

这里,我还使用三重双引号作为docstring和类型提示。这看上去干净多了。

也许,只返回recession.idxmax()索引并在函数之外获得相应的quarters值也是有意义的。

票数 3
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/213500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档