1. 引言
新冠病毒自2019年底首次在中国湖北省武汉市爆发以来,迅速蔓延至全球。病毒的传播速度非常快,许多国家和地区都已经采取了各种措施,以遏制病毒的传播。在这个过程中,数据是至关重要的。了解病例数量、死亡人数、治愈人数等信息,对于评估疫情和采取有效的措施至关重要。本文将介绍如何使用Python 3来监控新冠病毒的疫情,并显示病例数量、死亡人数和治愈人数。
2. 环境准备
在开始之前,请确保您的计算机上安装了Python 3和一些必要的库。我们将使用以下库:
requests : 一个用于发送HTTP请求的库。
bs4: 一个用于从HTML和XML文件中提取数据的库。
matplotlib : 一个用于创建图表的库。
pandas : 一个用于处理和分析数据的库。
您可以使用以下命令安装它们:
!pip install requests
!pip install bs4
!pip install matplotlib
!pip install pandas
3. 获取数据
我们将使用一个网站来获取数据,这个网站提供了病例数量、死亡人数和治愈人数的最新统计数据。我们可以从网站上的HTML代码中提取这些数据。
使用Python发送HTTP请求并获取网页:
import requests
url = 'https://covid19.who.int/'
r = requests.get(url)
html_content = r.text
print(html_content)
将网页的HTML代码保存到一个HTML文件中,以便我们可以获得它所需的数据:
with open('covid19.html', 'w', encoding='utf-8') as f:
f.write(html_content)
4. 解析数据
现在,我们需要从HTML代码中提取疫情数据。我们将使用Python中的BeautifulSoup库来解析HTML代码。
首先,我们需要打开HTML文件并将其传递给BeautifulSoup库的构造函数:
from bs4 import BeautifulSoup
with open('covid19.html', 'r', encoding='utf-8') as f:
html_content = f.read()
soup = BeautifulSoup(html_content, 'html.parser')
print(soup.prettify())
现在,我们可以使用BeautifulSoup的find()和find_all()方法来查找特定标记,并提取数据。以下代码找到主要的表并获取其中的所有行:
table = soup.find('table', attrs={'class':'table table-bordered table-hover dataTable no-footer'})
rows = table.find_all('tr')
for row in rows:
print(row.text)
我们可以看到所有行的文本输出。现在,我们需要将每行的文本分割为单独的列,以便可以提取所需的数据。我们还需要删除每列中的换行符:
data = []
for row in rows:
cols = row.find_all('td')
cols = [col.text.strip() for col in cols]
data.append(cols)
print(data)
现在我们已经成功地提取了疫情数据,并将其保存到了一个2D列表中。下一步是将列表转换为DataFrame,这将使我们更容易处理和分析数据。
5. 处理数据
现在,我们需要将2D列表转换为DataFrame:
import pandas as pd
df = pd.DataFrame(data)
print(df)
这个DataFrame包含了表格中的所有数据,但该数据还没被清理。数据包括不需要的列和行,也包括额外的字符。我们需要清理这个数据集,使其更容易使用和分析。
首先,我们需要删除前3行和最后1行,因为它们只包含额外的字符:
df = df.iloc[3:-1]
print(df)
这个DataFrame现在只包含疫情数据,但我们仍然需要对列名进行一些调整。我们需要将列名从列表中提取,并重命名它们:
headers = []
for i in range(len(rows[0].find_all('th'))):
headers.append(rows[0].find_all('th')[i].text)
df.columns = headers
print(df)
现在我们已经重新命名了列,但有一个小问题:最后两列包含了需要删除的字符。我们需要删除这些字符并将这两列的数据转换为整数类型:
df['Total Deaths'] = df['Total Deaths'].map(lambda x: x.lstrip('±').replace(',', '')).astype(int)
df['Total Recovered'] = df['Total Recovered'].map(lambda x: x.replace(',', '')).astype(int)
print(df)
现在我们已经处理过数据了,并且有一个干净的DataFrame,可以方便地用于分析和可视化。
6. 可视化数据
现在我们将使用matplotlib库来创建一个简单的图表,显示每个国家的病例数量、死亡人数和治愈人数。
首先,我们需要选择3个列并创建一个新Dataframe:
cols = ['Name', 'Total Cases', 'Total Deaths', 'Total Recovered']
df2 = df[cols].sort_values('Total Cases', ascending=False).head(10)
print(df2)
现在我们有了一个包含前10个国家的新DataFrame,并且它们是按照病例数量排名的。接下来,我们将使用这个新DataFrame来创建一个图表。
以下是一个简单的散点图,它显示每个国家的病例数量和死亡人数。
import matplotlib.pyplot as plt
plt.scatter(df2['Total Cases'], df2['Total Deaths'])
plt.title('Total Cases vs Total Deaths')
plt.xlabel('Total Cases')
plt.ylabel('Total Deaths')
plt.show()
我们可以使用相同的数据来创建一个堆叠条形图,它显示每个国家的病例数量、死亡人数和治愈人数。
stacked_data = df2[['Total Cases', 'Total Deaths', 'Total Recovered']].apply(lambda x: x/x.sum(), axis=1)
stacked_data.plot(kind="barh", stacked=True)
plt.title("Top 10 Countries affected")
plt.xlabel("Proportion of cases")
plt.legend(loc="lower right")
plt.show()
我们可以看到,中国是最受影响的国家,其病例数量超过了其他国家。但许多国家的死亡率比例要高得多。
7. 总结
本文介绍了如何使用Python 3和一些流行的库来监控新冠病毒的疫情,并分析和可视化疫情数据。我们首先使用requests库从网站中获取数据,然后使用BeautifulSoup库解析HTML代码。接下来,我们将数据转换为Pandas DataFrame,清理数据并进行分析和可视化。最后,我们创建了一个简单的散点图和一个堆叠条形图来显示疫情数据。
Python和相关的库已经成为数据科学家、分析师和工程师的首选语言和工具之一。如今,Python在金融、医疗保健、教育和其他许多行业中都得到了广泛的应用。疫情作为当前全球最重要的问题之一,我们可以使用Python来监控和分析数据,并采取必要的措施。