我正在尝试使用Python从FRED:https://fred.stlouisfed.org/series/LABSHPUSA156NRUG中重建一个时间序列图。然而,我无法得到一个清晰的数字,其中的时间序列被覆盖的面积图代表衰退条。
我对python非常陌生,所以很难找到我的尝试不起作用的一个简单原因。
我尝试过这两种方法。
我的第一次尝试是这样的:
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()“路由
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低谷。
发布于 2021-01-29 09:14:05
使用FRED提供的数据进行劳动数据和衰退数据以及对代码的轻微调整,我想我得到了您想要的结果:
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)
发布于 2022-01-16 15:42:22
看来奥克斯博尔斯的答案有问题,所以我想提供一个替代方案。衰退数据是月度数据,而劳动力市场数据是年度数据:为了解决这一差异,我将年度数据重新整理为月度数据,用简单的平均值进行插值,合并数据并绘制图表。随着数据在相同的日期合并,奇怪的视觉伪影消失。
为了了解Oxbowerce方法的问题,让我们为一个更小的数据样本创建一个图。使用奥克斯博尔斯的代码,但在2007-2009年放大:

也许有一个pandas的解决方案,可以在不同的频率上无缝地绘制数据,而没有上面的奇怪的伪影,但我不知道,所以我走了很长的路,重新整理数据。
每月重采样
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:

绘制衰退地区的代码:
# 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()https://datascience.stackexchange.com/questions/88588
复制相似问题