来源 | 「Practical Python Data Visualization A Fast Track Approach To Learning Data Visualization With Python」
作者 | Ashwin Pajankar
译者 | Liangchu
校对 | gongyouliu
编辑 | auroral-L
全文共2541字,预计阅读时间15分钟。
第九章 处理COVID-19数据
目录
一、疫情COVID-19和数据集
1、COVID-19数据的数据源
二、可视化COVID-19数据
❤总结
第八章「Pandas入门」介绍了SciPy数据科学库——pandas的基础知识。你学习了系列(series)和数据帧(dataframe)这两种数据结构的基础知识,并且学会了可视化数据帧和系列中的数据。
这一章是你在前面几章中所习得的所有知识的终点。在本章中,我们将检索真实数据并将其可视化。在本章结束时,你应该熟悉了真实数据集的可视化步骤。
一、疫情COVID-19和数据集
在写这本书的时候,世界正面临着一场前所未有的自然灾害——一种由severe acute respiratory syndrome coronavirus 2(SARS-CoV-2)引起的疫情(一种在各大洲传播的传染病)以及由此产生的冠状病毒COVID-19。这种病毒来自同一个病毒家族(冠状病毒),这些病毒可导致像普通感冒的非致命性疾病,以及像非典和MERS这样的更致命的疾病。这些病毒引起哺乳动物和人类呼吸道感染,如果不及时治疗,可能致命。
1.COVID-19数据的数据源
许多组织正在全世界范围内跟踪COVID-19病例,并定期更新其网站和网络服务上的数据,其中最著名的组织是约翰霍普金斯大学(https://coronavirus.jhu.edu/map.html)和World-O-Meter (https://www.worldometers.info/coronavirus/)。这些是COVID-19非常可靠的数据来源,他们非常频繁地更新其统计数据(至少每24小时更新一次),以便下游系统获得最新的数据。
我们可以使用Python中的自定义库检索这些数据,可以在https://ahmednafies.github.io/covid/找到像这样的库。它可以从约翰霍普金斯大学和World-O-Meter检索数据。要安装它,请为此章创建一个新笔记本,并在代码单元中运行以下命令:
!pip3 install covid
接下来,按如下方式导入库:
from covid import Covid
你可以使用以下代码获取数据:
covid=Covid()
默认情况下,它从约翰霍普金斯大学获取数据。你也可以明确地指定数据源:
covid = Covid(source="john_hopkins")
要从World-O-Meter获取数据,请更改源值:
covid = Covid(source="worldometers")
可以使用以下命令显示所有数据:
covid.get_data()
它将返回一个字典列表,如图(9-1)所示:
我们可以确定数据来源,如下:
covid.source
该案例输出如下所示:
'worldometers'
你还可以按国家名称检索,如下所示:
covid.get_status_by_country_name("italy")
结果如图(9-2)所示:
你也可以按国家/地区ID检索数据(此函数仅对Johns Hopkins数据源有效),代码如下:
covid.get_status_by_country_id(115)
要检索受COVID-19疫情影响的国家列表,请使用以下语法:
covid.list_countries()
它返回如图(9-3)所示的列表:
现有确诊病例的总数如下所示:
covid.get_total_active_cases()
确诊病例总数如下:
covid.get_total_confirmed_cases()
治愈病例总数如下:
covid.get_total_recovered()
死亡总人数如下:
covid.get_total_deaths()
运行这些语句就可以得到输出。
二、可视化COVID-19数据
现在你可以将上述所有数据转换为一个pandas数据帧,如下所示:
import pandas as pd
df = pd.DataFrame(covid.get_data())
print(df)
输出如图(9-4)所示:
使用以下代码对数据进行排序:
sorted = df.sort_values(by=['confirmed'], ascending=False)
这些数据包含了所有大陆和整个世界的累积数据。我们可以排除以下地区的数据:
excluded = sorted[~sorted.country.isin(['Europe', 'South America', 'Asia', 'World', 'North America', 'Africa'])]
前10个国家可检索如下:
top10 = excluded.head(10)
print(top10)
输出如图(9-5)所示:
现在我们可以将数据提取到变量中,如下所示:
x = top10.country
y1 = top10.confirmed
y2 = top10.active
y3 = top10.deaths
y4 = top10.recovered
接下来将它可视化。导入Matplotlib并使用以下命令在笔记本上启用打印:
%matplotlib inline
import matplotlib.pyplot as plt
创建一个简单的线形图,如下所示:
plt.plot(x, y1)
plt.xticks(rotation=90)
plt.show()
结果如图(9-6)所示:
我们可以将之显示为条形图:
plt.bar(x, y1)
plt.xticks(rotation=90)
plt.show()
结果如图(9-7)所示:
使用以下代码创建多行图:
plt.plot(x, y1, label='Confirmed')
plt.plot(x, y2, label='Active')
plt.plot(x, y3, label='Deaths')
plt.plot(x, y4, label='Recovered')
plt.legend(loc='upper right')
plt.xticks(rotation=90)
plt.show()
输出如图(9-8)所示:
我们可以用更简洁的代码和更好的格式重写前面的示例,如下所示:
labels = ['Confirmed', 'Active', 'Deaths', 'Recovered']
plt.plot(x, y1, x, y2, x, y3, x, y4)
plt.legend(labels, loc='upper right')
plt.xticks(rotation=90)
plt.grid()
plt.show()
结果如图(9-9)所示:
我们可以用垂直多条形图显示数据,如下所示:
df2 = pd.DataFrame([y1, y2, y3, y4])
df2.plot.bar();
plt.legend(x, loc='upper center')
plt.xticks(rotation=90)
plt.grid()
plt.show()
如图(9-10)显示了输出:
我们可以用垂直堆叠条形图显示数据,如下所示:
df2.plot.bar(stacked=True);
plt.legend(x, loc='upper center')
plt.xticks(rotation=90)
plt.grid()
plt.show()
如图(9-11)显示了输出:
我们可以创建水平条形图,如下所示:
df2.plot.barh();
plt.legend(x, loc='upper right')
plt.xticks(rotation=90)
plt.grid()
plt.show()
如图(9-12)显示了输出:
接下来,使用以下代码创建水平堆叠条形图:
df2.plot.barh(stacked=True);
plt.legend(x, loc='upper right')
plt.xticks(rotation=90)
plt.grid()
plt.show()
输出如图(9-13)所示:
我们甚至可以使用面积图来可视化这些数据。默认情况下,面积图是堆叠的。我们可以创建如下:
df2.plot.area();
plt.legend(x, loc='upper right')
plt.xticks(rotation=90)
plt.grid()
plt.show()
输出如图(9-14)所示:
你甚至可以创建重叠(非堆叠)面积图,如下所示:
df2.plot.area(stacked=False);
plt.legend(x, loc='upper right')
plt.xticks(rotation=90)
plt.grid()
plt.show()
输出如图(9-15)所示:
若要创建点的大小与数据大小成比例的散点图,请使用以下代码:
factor=0.0001
plt.scatter(x, y1, s=y1*factor);
plt.scatter(x, y2, s=y2*factor);
plt.scatter(x, y3, s=y3*factor);
plt.scatter(x, y4, s=y4*factor);
plt.legend(labels, loc='upper right')
plt.xticks(rotation=90)
plt.grid()
plt.show()
输出如图(9-16)所示:
最后,你可以使用以下代码创建一个漂亮的饼图:
plt.pie(y1, labels=x)
plt.title('Confirmed Cases')
plt.show()
输出如图(9-17)所示:
❤总结
在本章中,你学习了如何通过各种在线源检索COVID-19数据并将数据转换为数据帧,你还学习了如何准备各种类型的可视化,以图形方式表示COVID-19数据。
现在我们使用真实的数据与案例结束了我们的数据可视化之旅。我希望你能喜欢阅读和演示这本书中的例子,就像我喜欢编写它们一样。数据可视化是一个非常广阔的领域,有许多其他的Python库可以用于数据可视化,例如ggplot、plotly和seaborn,这些库提供了高级的数据可视化功能,可以满足你的业务和科学可视化需求。