繁体   English   中英

在 matplotlib 中制作移动平均时间序列线图的任何解决方法?

[英]Any workaround to make moving average time series line plot in matplotlib?

我想了解冠状病毒大流行如何影响肉类加工厂等供应链行业。 我按县级检索了 NYT covid 数据和食品机构的统计数据,因此我想了解在主要食品加工厂所在的县中,covid 病例是如何激增的。 为此,我找到了正确的数据,并能够使其准备好渲染一个漂亮的时间序列图表。 但是,我发现为此获取正确的绘图数据存在问题,因为结果图没有获得预期的输出。 这是我到目前为止尝试过的:

我的尝试

这是我对这个要点感兴趣的最终聚合的 covid 时间序列数据。 这是我目前的尝试:

import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
import seaborn as sns
from datetime import timedelta, datetime

df = pd.read_csv("https://gist.githubusercontent.com/jerry-shad/7eb2dd4ac75034fcb50ff5549f2e5e21/raw/477c07446a8715f043c9b1ba703a03b2f913bdbf/covid_tsdf.csv")
df.drop(['Unnamed: 0', 'fips', 'non-fed-slaughter', 'fed-slaughter', 'total-slaughter', 'mcd-asl'], axis=1, inplace=True)
for ct in df['county_state'].unique():
    dd = df.groupby([ct, 'date', 'est'])['num-emp'].sum().unstack().reset_index()
    p = sns.lineplot('date', 'values', data=dd, hue='packer', markers=markers, style='cats', ax=axes[j, 0])
    p.set_xlim(data.date.min() - timedelta(days=60), data.date.max() + timedelta(days=60))
    plt.legend(bbox_to_anchor=(1.04, 0.5), loc="center left", borderaxespad=0)

但看起来我在上面做了错误的聚合,这种尝试不起作用。 我的意图基本上是,如果一家公司有多个机构(又名est ),那么我需要计算其num-emp总和:员工人数,然后得到新# of new_deaths / num-emp的比率。 基本上我想以某种近似的方式跟踪公司的员工是否受到covid的影响。 我不太确定在 python 中使用matplotlib执行此操作的正确方法是什么。 任何人都可以建议可能的更正以使其正确吗? 任何的想法?

第二次尝试

我从最近的 covid19 相关帖子中获得了一些灵感,所以这是尝试在matplotlib做我想做的事情的另一种方式。 我还使用自定义绘图辅助函数以这种方式聚合数据:

df = pd.read_csv("https://gist.githubusercontent.com/jerry-shad/7eb2dd4ac75034fcb50ff5549f2e5e21/raw/477c07446a8715f043c9b1ba703a03b2f913bdbf/covid_tsdf.csv")
ds_states = df.groupby('county_state').sum().rename({'county_state': 'location'})
ds_states['mortality'] = ds_states['deaths'] / ds_states['popestimate2019'] * 1_000_000
ds_states['daily_mortality'] = ds_states['new_deaths'] / ds_states['popestimate2019'] * 1_000_000
ds_states['daily_mortality7'] = ds_states['daily_mortality'].rolling({'time': 7}).mean()

然后这是我想出的绘图辅助函数:

def subplots(*args, tick_right=True, **kwargs):
    f, ax = plt.subplots(*args, **kwargs)

    if tick_right:
        ax.yaxis.tick_right()
        ax.yaxis.set_label_position("right")
    ax.yaxis.grid(color="lightgrey", linewidth=0.5)
    ax.xaxis.grid(color="lightgrey", linewidth=0.5)
    ax.xaxis.set_tick_params(labelsize=14)
    return f, ax

 _, ax1 = subplots(subplot_kw={'xlim': XLIM})
ax1.set(title=f'US covid tracking in meat processing plants by county - Linear scale')
ax2 = ax1.twinx()

但我又被困在这里如何做到这一点。 我的基本目标基本上是有多少肉类加工公司受到新冠病毒的影响,因为如果其工人感染了新冠病毒,公司的业绩就会下降。 我想制作能够直观地提供此类信息的 eda。 任何人都可以建议使用matplotlib执行此操作的可能方法吗? 我愿意接受任何可行的 eda 尝试,使这个问题更现实或更有意义。

期望的输出

我正在考虑使 eda 输出如下所示:

在此处输入图片说明

我想看到的是,按县级划分,每家公司的业绩如何因新冠肺炎而有所不同。 任何人都可以指出我以实现可能的 eda 输出吗? 谢谢

更新

因为我想制作什么样的 od eda 在我的脑海中并不是很可靠,所以我愿意听取任何适合我上面提出的问题的上下文的任何可能的 eda。 提前致谢!

我们仅绘制了一个州的爆发次数和新爆发次数的移动平均值。 该过程包括将移动平均列添加到为特定状态提取的数据框中并绘制两轴图。

ct = 'Maricopa_Arizona'
dd = df[df['county_state'] == ct].groupby(['county_state', 'date', 'est'])[['cases','new_cases']].sum().unstack().reset_index()
dd.columns= ['county_state','date', 'cases', 'new_cases']
dd['date'] = pd.to_datetime(dd['date'])
dd['rol7'] = dd[['date','new_cases']].rolling(7).mean()

dd.tail()
county_state    date    cases   new_cases   exp7    rol7
216 Maricopa_Arizona    2020-08-29  133389.0    403.0   306.746942  243.428571
217 Maricopa_Arizona    2020-08-30  133641.0    252.0   293.060207  264.857143
218 Maricopa_Arizona    2020-08-31  133728.0    87.0    241.545155  252.285714
219 Maricopa_Arizona    2020-09-01  134004.0    276.0   250.158866  244.857143
220 Maricopa_Arizona    2020-09-02  134346.0    342.0   273.119150  273.142857

fig = plt.figure(figsize=(8,6),dpi=144)
ax = fig.add_subplot(111)

colors = sns.color_palette()
ax2 = ax.twinx()

ax = sns.lineplot('date', 'rol7', data=dd, color=colors[1], ax=ax)
ax2 = sns.lineplot('date', 'cases', data=dd, color=colors[0], ax=ax2)

ax.set_xlim(dd.date.min(), dd.date.max())
fig.legend(['rolling7','cases'],loc="upper left", bbox_to_anchor=(0.01, 0.95), bbox_transform=ax.transAxes)
ax.grid(axis='both', lw=0.5)

locator = mdates.AutoDateLocator()
ax.xaxis.set_major_locator(locator)

fig.autofmt_xdate(rotation=45)
ax.set(title=f'US covid tracking in meat processing plants by county - Linear scale')
plt.show()

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM