作为一项任务,我正在确定2008年美国经济衰退的第一季度。我使用的Excel数据可以在这里下载:gdplev.xls。我怎样才能改进这个熊猫代码,使它更加地道或优化呢?
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()发布于 2019-02-15 13:01:11
您的函数做了太多的事情:读取Excel文件、过滤必要的行以及计算"recession_start“。我的建议是把前两个都拿出来。
此外,供应季度和GDP作为单独的对象(pd.Series)的功能,而不是DataFrame。像这样,您将从函数中删除硬编码字符串,更重要的是,您将去掉您现在应该得到的SettingWithCopyWarning:
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。
然后,该函数将如下所示:
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值也是有意义的。
https://codereview.stackexchange.com/questions/213500
复制相似问题