【Python+Flask+Echarts】可视化练习题 ---- COVID-19世界疫苗接种数据 (疫苗类型使用统计玫瑰图)



数据集

本篇的数据来源 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>

返回顶部


可视化展示

在这里插入图片描述

返回顶部

扫描二维码关注公众号,回复: 12532513 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_45797116/article/details/113415122