首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >叠加线状图和面积图:在时间序列中添加衰退条

叠加线状图和面积图:在时间序列中添加衰退条
EN

Data Science用户
提问于 2021-01-28 02:17:05
回答 2查看 1.2K关注 0票数 1

我正在尝试使用Python从FRED:https://fred.stlouisfed.org/series/LABSHPUSA156NRUG中重建一个时间序列图。然而,我无法得到一个清晰的数字,其中的时间序列被覆盖的面积图代表衰退条。

我对python非常陌生,所以很难找到我的尝试不起作用的一个简单原因。

我尝试过这两种方法。

我的第一次尝试是这样的:

代码语言:javascript
复制
fig, ax = plt.subplots()
ls_data.plot.line(ax=ax, figsize=(8,5), x='Date', color=blue)
rec_data.plot.area(ax=ax, figsize=(8,5), x='Date', alpha=0.5, color=gray)
plt.ylim(0.59,0.65)

并产生以下令人困惑的混乱:

我的第二次尝试是"ax2 = ax1.twinx()“路由

代码语言:javascript
复制
fig, ax1 = plt.subplots()
ax2 = ax1.twinx()

ls_data.plot.line(figsize=(8,5), x='Date', color=blue)
rec_data.plot.area(figsize=(8,5), x='Date', alpha=0.5, color=gray)

然而,这却产生了两个不同的数字。

一个可能的问题是,劳动力份额的x值是在个别年份绘制的,而经济衰退的x值是在几个月内绘制的。但是根据第二次尝试,看起来这些图形应该能很好地覆盖起来,但是我很容易得到与我第一次尝试中相同的结果。经济衰退数据的转变能否提供一个解决办法?

编辑:经济衰退日期的数据可以在这里找到。https://fred.stlouisfed.org/series/USREC#:~:text=For%20daily%20data%2C%20the%20recession,%20个月%20%20%20低谷

EN

回答 2

Data Science用户

回答已采纳

发布于 2021-01-29 09:14:05

使用FRED提供的数据进行劳动数据衰退数据以及对代码的轻微调整,我想我得到了您想要的结果:

代码语言:javascript
复制
import pandas as pd
import matplotlib.pyplot as plt

# read in data
rec_data = pd.read_csv("USREC.csv")
ls_data = pd.read_csv("LABSHPUSA156NRUG.csv")

# make sure date columns are actual dates
rec_data["DATE"] = pd.to_datetime(rec_data["DATE"])
ls_data["DATE"] = pd.to_datetime(ls_data["DATE"])

# create plot
fig, ax = plt.subplots()
ls_data.plot.line(ax=ax, figsize=(8, 5), x='DATE', color="blue")
rec_data.plot.area(ax=ax, figsize=(8, 5), x='DATE', alpha=0.5, color="gray")
plt.xlim("1950-01-01", "2020-01-01")
plt.ylim(0.58, 0.65)
票数 2
EN

Data Science用户

发布于 2022-01-16 15:42:22

看来奥克斯博尔斯的答案有问题,所以我想提供一个替代方案。衰退数据是月度数据,而劳动力市场数据是年度数据:为了解决这一差异,我将年度数据重新整理为月度数据,用简单的平均值进行插值,合并数据并绘制图表。随着数据在相同的日期合并,奇怪的视觉伪影消失。

1.问题

为了了解Oxbowerce方法的问题,让我们为一个更小的数据样本创建一个图。使用奥克斯博尔斯的代码,但在2007-2009年放大:

衰退线不是垂直的!

2.一个解决方案

也许有一个pandas的解决方案,可以在不同的频率上无缝地绘制数据,而没有上面的奇怪的伪影,但我不知道,所以我走了很长的路,重新整理数据。

2a:前向填充“.ffill()”

每月重采样

代码语言:javascript
复制
dy = df.set_index('DATE').resample('M').ffill().reset_index()
d1 = pd.merge(dr, dy, left_index=True, right_index=True, suffixes=("", "_y")).drop(labels='DATE_y', axis=1)

中间产物:

如今,劳动力市场的数据似乎参差不齐。所以我们插值。

'.mean().interpolate('linear')' 2b:

2b:每月重采样# interpolate data | MS='Month Start', default is M=ME='Month End' di = df.set_index('DATE').resample('1MS').mean().interpolate('linear').reset_index() d2 = pd.merge(dr, di, left_index=True, right_index=True, suffixes=("", "_y")).drop(labels='DATE_y', axis=1)

最终产品:

绘制衰退地区的代码:

代码语言:javascript
复制
# convenience function
def plot_series(ax, df, index, cols, area, **kwargs):
    # convert area variable to boolean
    df[area] = df[area].astype(int).astype(bool)
    # set up an index based on date
    df = df.set_index(keys=index, drop=False)
    # line plot
    df.plot(ax=ax, x=index, y=cols, **kwargs)
    # extract limits
    y1, y2 = ax.get_ylim()
    ax.fill_between(df[index].index, y1=y1, y2=y2, where=df[area], facecolor='grey', alpha=0.4)
    return ax

# plot resampled data with method='ffill'
f, ax = plt.subplots()
plot_series(ax, d1, index='DATE', cols='LABSHPUSA156NRUG', area='USREC')
ax.grid(True)
plt.show()

# plot resampled data with .mean().interpolate('linear')
f, ax = plt.subplots()
plot_series(ax, d2, index='DATE', cols='LABSHPUSA156NRUG', area='USREC')
ax.grid(True)
plt.show()
票数 0
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/88588

复制
相关文章

相似问题

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