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

标签 python matplotlib data-visualization

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

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的影响。我不太确定使用 matplotlib 执行此操作的正确方法是什么在 python 中。任何人都可以建议可能的更正以使其正确吗?任何的想法?
第二次尝试
我从最近的 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()
但我又被困在这里如何做到这一点。我的基本目标基本上是有多少肉类加工公司受到新冠病毒的影响,因为如果其 worker 感染了新冠病毒,公司的业绩就会下降。我想制作能够直观地提供此类信息的 eda。任何人都可以通过 matplotlib 提出可能的方法吗? ?我愿意接受任何可行的 eda 尝试,使这个问题更现实或更有意义。
所需的输出
我正在考虑使 eda 输出如下所示:
enter image description here
我想看到的是,按县级划分,每家公司的业绩如何因新冠肺炎而有所不同。任何人都可以指出我以实现可能的 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()
enter image description here

关于python - 在 matplotlib 中制作移动平均时间序列线图的任何解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63822959/

相关文章:

python - 你如何比较 2 个列表并返回差异? (python 中的差异函数不返回我需要的东西)

python - 操作错误 - 没有这样的表 - Django,mptt

python - 如何在 matplotlib 中的曲线末端放置一个箭头?

python - 在Python中一起绘制imshow和线图

python - 如何配置y轴以减少零并节省空间?

Python、flask 和创建双语言应用程序

python - 使用 Python 对 GAE 查询字符串进行 URL 编码

python - 动态过度绘制

python - 如何在 matplotlib 中添加标记样式列表?

javascript - 根据单元格值对表格单元格进行颜色缩放