数据集
本篇的数据来源 https://www.kaggle.com/gpreda/covid-world-vaccination-progress
主要信息:
国家 - 这是提供疫苗接种信息的国家;
国家ISO代码 - 国家的ISO代码;
日期 - 数据输入日期;对于某些日期,我们只有每日接种疫苗,对于其他日期,只有(累计)总数;
疫苗接种总数 - 这是该国疫苗接种总数的绝对值;
接种的总人数 - 根据免疫方案的不同,一个人将接种一种或多种(通常为2种)疫苗;在某一时刻,接种数量可能大于人数;
已完全接种疫苗的总人数 - 这是根据免疫计划(通常为2次)接受整套免疫接种的人数;在某个特定时刻,可能会有一定数量的人接种了该疫苗,而另外一部分(较小的)人接种了该计划中的所有疫苗;
每日疫苗接种(原始) - 对于特定数据输入,该日期/国家的疫苗接种数量;
每日疫苗接种 - 对于某些数据输入,该日期/国家的疫苗接种数量;
截至该国日期为止的总疫苗接种量/接种人数与总人口之间的百分率(百分比);
总人数每百接种疫苗 - 人口免疫,总人口达在国内的日期之间的比例(百分比);
人每百全接种总数 - 人口完全免疫,总人口达在国内的日期之间的比例(百分比);
每天的疫苗接种次数 - 该天和该国家/地区的每日疫苗接种次数;
每百万日接种量 - 该国当前日期的接种数量与总人口之间的比率(ppm);
该国使用的疫苗 - 该国使用的疫苗总数(最新);
来源名称 - 信息来源(国家主管部门,国际组织,地方组织等);
来源网站 - 信息来源网站;
需求
这个数据集是最新的新冠疫苗接种统计,可能由于某些原因,导致数据集中的许多具体信息缺失。在经过一番的浏览之后,我观察到该国使用的疫苗一列相对来说数据完整性较高。所以就借这列,对所有疫苗类型各国家的使用情况做统计,了解目前使用最为广泛的疫苗类型。
主要思路就是:
- 提取出国家、该国使用的疫苗两列有效列
- 对提取的数据进行去重,因为需要的是
国家->使用疫苗类型
的键值对形式数据 - 对疫苗类型进行分组、聚合
- Flask框架传送数据
- HTML渲染可视化
代码实现
① python数据预处理
import pandas as pd
from flask import Flask,render_template
# 读取数据集
data = pd.read_csv("G:\Projects\pycharmeProject-C\Flask\dataset\country_vaccinations.csv")
data.columns = ['国家','国家代码','日期','疫苗接种总数','接种的总人数','已完全接种疫苗的总人数','每日疫苗接种(原始)','每日疫苗接种','截至该国日期为止的总疫苗接种量/接种人数与总人口之间的百分率(百分比)','总人数每百接种疫苗','人每百全接种总数','每百万日接种量','该国使用的疫苗','来源名称','来源网站']
# 填补缺失值
data.fillna(0,inplace=True)
# 统计各国使用的疫苗种类
data_use = data[['国家','该国使用的疫苗']].drop_duplicates()
# 统计不同疫苗的在不同国家的使用情况
count = data_use['该国使用的疫苗'].value_counts()
# counts = data_use.groupby('该国使用的疫苗').agg(count=('该国使用的疫苗','count')).reset_index()
list = count.reset_index().values.tolist()
② Flask框架传送数据
# 可视化
app = Flask(__name__)
@app.route("/")
def index():
sheets = list
return render_template("country_vaccinations02.html",sheet = sheets)
if __name__ == '__main__':
app.run(debug=True)
③ HTML渲染
<!DOCTYPE html>
<html lang="en" style="height:100%">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body style="height:100%">
<div style="height:100%" id="container"></div>
<script type="text/javascript" src="../static/echarts.min.js"></script>
<script type="text/javascript">
var dom = document.getElementById("container");
var myChart = echarts.init(dom);
var data = [{
% for item in sheet %}'{
{ item.0 }}',{
% endfor %}];
var data1 = [{
% for item in sheet %}{
{
item.1 }},{
% endfor %}];
var option = null;
option = {
title:{
text:'不同类型疫苗使用占比图',
},
tooltip:{
trigger:'item',
formatter:'{a}</br>{b}:{c}({d}%)'
},
legend:{
show:true,
left:'5%',
top:'5%',
orient:'vertical'
},
series:[
{
name:'疫苗使用情况',
type:'pie',
roseType:'area',
radius:['10%','50%'],
center:['50%','50%'],
data:[
{
name:data[0],value:[data1[0]]},
{
name:data[1],value:[data1[1]]},
{
name:data[2],value:[data1[2]]},
{
name:data[3],value:[data1[3]]},
{
name:data[4],value:[data1[4]]},
{
name:data[5],value:[data1[5]]},
{
name:data[6],value:[data1[6]]},
{
name:data[7],value:[data1[7]]},
{
name:data[8],value:[data1[8]]},
],
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
};
if (option && typeof option == "object"){
myChart.setOption(option);
}
</script>
</body>
</html>