跳转至

数据处理

📖 阅读信息

阅读时间:3 分钟 | 中文字符:1059 | 有效代码行数:367

数据可视化部分

案例介绍

  1. 疫情的地图
  2. 动态的 GDP 的图像
    我们使用的技术是 Echart 的开源的可视化,我们需要在环境中安装包

json 数据格式

什么是 json

  • 是一种轻量级的数据交互格式
  • 本质上是一个带有特定格式的字符串

  • 主要功能:在各个编程语言中流通的数据格式,不同的编程语言中数据传递和交互

  • json 数据转化:
    要求:

    可见,json要么是 python 中的字典,要么是 python 中的列表中嵌套字典
    json 的类型是上述转换成的字符串

两种数据的相互转换

  • 相互转换
  • 将字典、列表转换为 JSON代码:json.dumps(data)
Python
1
2
3
4
5
6
import json  
# 准备一个转化为json的列表  
data=[{"name":"张三","age":13},{"name":"大锤","age":23},{"name":"小胡","age":43}]  
json_str=json.dumps(data)  
print(type(json_str))  
print(json_str)

但是现在输出的中文是乱码,所以需要加上这么一句:json_str=json.dumps(data,ensure_ascii=False)(代表不适用 ascii 码表示中文)
输出:

Python
<class 'str'>  
[{"name": "张三", "age": 13}, {"name": "大锤", "age": 23}, {"name": "小胡", "age": 43}]

同样,使用字典时也是可以的


  • 反之,将字符串还原为字典或者列表:json.loads(s)
    Python
    1
    2
    3
    4
    5
    6
    7
    8
    s='[{"name": "张三", "age": 13}, {"name": "大锤", "age": 23}, {"name": "小胡", "age": 43}]'  
    l=json.loads(s)  
    print(type(l))  
    print(l)
    s_2='{"name": "小明", "add": "台湾"}'  
    l_2=json.loads(s_2)  
    print(l_2)  
    print(type(l_2))
    

pyecharts 模块介绍

Echart 为百度开源的,在 python 上的就是pyecharts
官方网站:pyecharts.org
https://gallery.pyecharts.org/ 这个是画廊,在这里可以看见很多图表的代码和预览图

类似上面的曲线

安装这个模块

在 cmd 中使用这个进行安装:pip install pyecharts (最好是在 pycharm 中的终端中直接安装,就在对应的环境中安装了)

快速入门

构建基础的折线图

  1. 先导包
  2. 创建折线图的对象
  3. 添加 x 轴数据和 y 轴数据
Python
import pyecharts  
# 导包  
from pyecharts.charts import Line  
# 得到折线图对象  
line=Line()  
# 添加x轴数据  
line.add_xaxis(["中国","美国","英国"])  
# 添加y轴数据  
line.add_yaxis("GDP",[30,20,10])  
# 生成图表  
# 通过render方法实现生成图像  
line.render()

最后就在文件夹中生成了 render. html 文件,在 pycharm 中使用浏览器打开即可


  • 有很多的配置的选项
    • 全局配置
      使用 set_global_opts 方法来配置(在上述网站中的全局配置项中)
    • 系列设置

增加下面的代码进行全局的配置:

Python
# 设置全局配置项  
from pyecharts.options import TitleOpts,LegendOpts,ToolboxOpts,VisualMapOpts
line.set_global_opts(  
    title_opts=TitleOpts(title="GDP展示",pos_left="center",pos_bottom="1%"),# 使用关键字传参,标题与位置  
    legend_opts=LegendOpts(is_show=True),  
    toolbox_opts=ToolboxOpts(is_show=True),  # 工具栏
    visualmap_opts=VisualMapOpts(is_show=True) # 鼠标移动的效果
)  


# 通过render方法实现生成图像  
line.render()

数据处理

通过 json 模块
我们现在使用的是折线图数据的文件夹
前面有一段不符合规范的内容
怎么看这一段 json 文件呢?
我们需要打开 bejson 网站

  • 如图所示,多层的列表[]、字典{}的嵌套

    Python
    import json  
    # 处理数据  
    f_us=open("D:/美国.txt","r",encoding="UTF-8")  
    us_data=f_us.read()# 读取全部的内容  
    # 去除不符合json规范的开头  
    us_data=us_data.replace("jsonp_1629344292311_69436(", "")  
    # 去除不符合的结尾  
    us_data=us_data[0:-2:1]# 切取一部分  
    # 转为python字典  
    us_dict=json.loads(us_data)  
    print(type(us_dict))  
    print(us_dict)  
    # 获取日期数据,作为x轴  
    trend_data=us_dict['data'][0]['trend']  
    print(trend_data)  
    x_data=trend_data['updateDate'][:314]  
    print(x_data)  
    # 获取确诊数据,作为y轴
    y_data=trend_data['list'][0]['data'][:314]  
    print(y_data)
    

以上就是代码,总之就是看看自己想要的数据在哪里,然后一层一层取(字典、列表)

生成折线图

类似美国的数据,生成另外两个国家的数据:

Python
import json  
from pyecharts.charts import Line  
from pyecharts.options import TitleOpts,LegendOpts,ToolboxOpts,VisualMapOpts,LabelOpts  
# 处理数据  
f_us=open("D:/美国.txt","r",encoding="UTF-8")  
us_data=f_us.read()# 读取全部的内容  

f_jp=open("D:/日本.txt","r",encoding="UTF-8")  
jp_data=f_jp.read()# 读取全部的内容  

f_in=open("D:/印度.txt","r",encoding="UTF-8")  
in_data=f_in.read()# 读取全部的内容  

# 去除不符合json规范的开头  
us_data=us_data.replace("jsonp_1629344292311_69436(", "")  
jp_data=jp_data.replace("jsonp_1629350871167_29498(","")  
in_data=in_data.replace("jsonp_1629350745930_63180(","")  
# 去除不符合的结尾  
us_data=us_data[0:-2:1]# 切取一部分  
jp_data=jp_data[:-2]  
in_data=in_data[:-2]  

# 转为python字典  
us_dict=json.loads(us_data)  
jp_dict=json.loads(jp_data)  
in_dict=json.loads(in_data)  

# 获取日期数据,作为x轴  
us_trend_data=us_dict['data'][0]['trend']  
jp_trend_data=jp_dict['data'][0]['trend']  
in_trend_data=in_dict['data'][0]['trend']  

us_x_data=us_trend_data['updateDate'][:314]  
jp_x_data=jp_trend_data['updateDate'][:314]  
in_x_data=in_trend_data['updateDate'][:314]  
# 获取确诊数据,作为y轴  
us_y_data=us_trend_data['list'][0]['data'][:314]  
jp_y_data=jp_trend_data['list'][0]['data'][:314]  
in_y_data=in_trend_data['list'][0]['data'][:314]  
# 生成图表  
line=Line()  
# 添加x轴数据  
line.add_xaxis(us_x_data)# x轴是共用的  
# 添加y轴的数据  
line.add_yaxis("美国",us_y_data,label_opts=LabelOpts(is_show=False))# 就不显示具体的数字了  
line.add_yaxis("日本",jp_y_data,label_opts=LabelOpts(is_show=False))  
line.add_yaxis("印度",in_y_data,label_opts=LabelOpts(is_show=False))  
# 设置简单的全局选项  
line.set_global_opts(  
    title_opts=TitleOpts(title="疫情的感染人数",pos_left="center",pos_bottom="1%"),# 使用关键字传参  
    legend_opts=LegendOpts(is_show=True),  
    toolbox_opts=ToolboxOpts(is_show=True),  
    visualmap_opts=VisualMapOpts(is_show=True)  
)  
# 调用生成图表  
line.render()  
# 关闭文件夹  
f_us.close()  
f_jp.close()  
f_in.close()

地图可视化

基础地图的应用

使用的构建的对象为map

Python
from pyecharts.charts import Map  
from pyecharts.options import VisualMapOpts  
# 准备地图对象  
map=Map()  
# 准备数据(元组的形式  
data=[  
    ("北京市",99),  
    ("上海市",199),  
    ("湖南省",299),  
    ("台湾省",399),  
    ("广东省",499),  
]  
map.add("测试地图",data,"china")  
# 设置全局选项  
map.set_global_opts(  
    visualmap_opts=VisualMapOpts(  
        is_show=True,  
        is_piecewise=True,  
        pieces=[  
            {"min":1,"max":9,"label":"1-9","color":"#CCFFFF"},  
            {"min":10,"max":99,"label":"10-99","color":"#FF6666"},  
            {"min":100,"max":500,"label":"100-500","color":"#990033"}# 这里的代码是颜色对应的RGB代码  
        ]  
    )  
)  
# 绘图  
map.render("2.html")

国内的疫情地图

同样,将我们的 json 文件在浏览器中打开
下面就是层级:

Python
from pyecharts.charts import Map  
from pyecharts.options import * # 所有都导进来  
import json  

from pyecharts.types import Title  

# 读取文件  
f=open("D:/疫情.txt","r",encoding="UTF-8")  
data=f.read()  
f.close()  
print(type(data))  
# 取得各个省的数据  
# 将字符串json转换为python的字典  
data_dict=json.loads(data)  
pro_data_list=data_dict["areaTree"][0]["children"]# 现在就是各个省的数据列表了  

# 组装各个省份和确诊人数为元组,把各个省的数据都封装在列表中  
data_list=[]# 所需要的列表  
for i in pro_data_list:# 遍历列表,组装为元组  
    if i["name"]=="北京" or i["name"]=="上海" or i["name"]=="天津" or i["name"]=="重庆":  
        pro_name=i["name"]+"市"# 省份的名称  
    else:  
        pro_name = i["name"] + "省"  # 省份的名称  
    pro_confirm=i["total"]["confirm"]# 确证的人数  
    data_list.append((pro_name,pro_confirm))# 将元组添加到列表中  

print(data_list)  

# 创建地图对象  
map=Map()  
# 添加数据  
map.add("各个省份的确诊人数",data_list,"china")  
# 设置全局配置  
map.set_global_opts(  
    title_opts=TitleOpts(title="全国疫情地图"),  
    visualmap_opts=VisualMapOpts(  
        is_show=True,  
        is_piecewise=True,  
        pieces=[  
            {"min":1,"max":99,"label":"1-9","color":"#CCFFFF"},  
            {"min":100,"max":999,"label":"100-999","color":"#FFFF99"},  
            {"min":1000,"max":4999,"label":"1000-4999","color":"#FF9966"} ,# 这里的代码是颜色对应的RGB代码  
            {"min":5000,"max":9999,"label":"5000-9999","color":"#FF6666"} ,# 这里的代码是颜色对应的RGB代码  
            {"min":10000,"max":99999,"label":"10000-99999","color":"#CC3333"},# 这里的代码是颜色对应的RGB代码  
            {"min":100000,"label":"100000-","color":"#990033"}# 这里的代码是颜色对应的RGB代码  
        ]  
    )  
)  
# 绘图  
map.render("疫情.html")
  1. 首先对数据进行的处理
    1. 打开文件,读取、关闭
    2. 转换为字典对象
    3. 拿到每个省份的,对列表进行遍历,写成元组的形式
  2. 全局设置
    1. 标题的设置
    2. 图例的显示和颜色的设置
  3. 绘图

省级疫情地图的绘制


上述就是省级的层级(在上面的全国的基础上)

Python
from pyecharts.charts import Map  
from pyecharts.options import * # 所有都导进来  
import json  
from pyecharts.types import Title  

# 读取文件  
f=open("D:/疫情.txt","r",encoding="UTF-8")  
data=f.read()  
f.close()  
print(type(data))  
# 取得各个省的数据  
# 将字符串json转换为python的字典  
data_dict=json.loads(data)  
pro_data_list=data_dict["areaTree"][0]["children"][3]["children"]# 现在就是各个市的数据列表了  
data_list=[]  
for i in pro_data_list:  
    city_name=i["name"]+"市"  
    city_confirm=i["total"]["confirm"]  
    data_list.append((city_name,city_confirm))  
print(data_list)  

# 构建地图对象  
map=Map()  
map.add("河南省疫情分布",data_list,"河南")  
# 设置全局的选项  
map.set_global_opts(  
    title_opts=TitleOpts(title="河南疫情地图"),  
    visualmap_opts=VisualMapOpts(  
        is_show=True,  
        is_piecewise=True,  
        pieces=[  
            {"min":1,"max":99,"label":"1-9","color":"#CCFFFF"},  
            {"min":100,"max":999,"label":"100-999","color":"#FFFF99"},  
            {"min":1000,"max":4999,"label":"1000-4999","color":"#FF9966"} ,# 这里的代码是颜色对应的RGB代码  
            {"min":5000,"max":9999,"label":"5000-9999","color":"#FF6666"} ,# 这里的代码是颜色对应的RGB代码  
            {"min":10000,"max":99999,"label":"10000-99999","color":"#CC3333"},# 这里的代码是颜色对应的RGB代码  
            {"min":100000,"label":"100000-","color":"#990033"}# 这里的代码是颜色对应的RGB代码  
        ]  
    )  
)  
#绘制  
map.render("河南省疫情地图.html")

title_opts=TitleOpts(title="河南疫情地图") 这种写法的含义是什么

动态柱状图的绘制

基础柱状图

学习之后,我们可以绘制基础的柱状图

Python
from pyecharts.charts import Bar  
from pyecharts.options import * # 所有具体的功能都导进来  
# 使用Bar构建基础柱状图  
bar=Bar()  
 # 添加x轴的数据  
bar.add_xaxis(["中国","美国","英国"])  
 # 添加y轴的数据  
bar.add_yaxis(  
    "GDP",[30,20,10],label_opts=LabelOpts(position="right")  
)# 将数值的标签放到右边  
# 绘制  
# 反转两个轴  
bar.reversal_axis()  
bar.render("GDP.html")

基础时间线柱状图的绘制

基础的时间线配置动态图表

就是一个从左往右的时间轴,在点 1 的时候提供一个图表,在点 2 的时候提供一个图表(就是一直切换柱状图表)
需要新导入from pyecharts.charts import Bar,Timeline

Python
from pyecharts.charts import Bar,Timeline  
from pyecharts.options import * # 所有都导进来  
# 使用Bar构建基础柱状图  
bar1=Bar()  
 # 添加x轴的数据  
bar1.add_xaxis(["中国","美国","英国"])  
 # 添加y轴的数据  
bar1.add_yaxis(  
    "GDP",[30,20,10],label_opts=LabelOpts(position="right")  
)# 将数值的标签放到右边  
bar1.reversal_axis()  

bar2=Bar()  
 # 添加x轴的数据  
bar2.add_xaxis(["中国","美国","英国"])  
 # 添加y轴的数据  
bar2.add_yaxis(  
    "GDP",[50,50,50],label_opts=LabelOpts(position="right")  
)# 将数值的标签放到右边  
bar2.reversal_axis()  

bar3=Bar()  
 # 添加x轴的数据  
bar3.add_xaxis(["中国","美国","英国"])  
 # 添加y轴的数据  
bar3.add_yaxis(  
    "GDP",[70,60,60],label_opts=LabelOpts(position="right")  
)# 将数值的标签放到右边  
bar3.reversal_axis()  

# 构建时间线对象  
timeline=Timeline()  
# 在时间线对象中添加柱状图对象  
timeline.add(bar1,"点1")  
timeline.add(bar2,"点2")  
timeline.add(bar3,"点3")  
# 绘图是使用时间线对象绘图,不是使用bar对象绘图  
timeline.render("基础时间线柱状图.html")


以上就是生成的结果,那么如何让时间能够自动播放

Python
1
2
3
4
5
6
7
# 自动播放  
timeline.add_schema(  
    play_interval=1000,# 自动播放的时间,单位ms  
    is_timeline_show=True,# 是否在自动播放的时候显示时间线  
    is_auto_play=True,# 是否自动播放  
    is_loop_play=True# 是否自动循环播放  
)
在绘图前加上这个就行

掌握设置主题修改颜色样式

时间线设置主题
from pyecharts.globals import ThemeType
在构建时间线对象中加入

Python
1
2
3
4
# 构建时间线对象  
timeline=Timeline(  
    {"theme":ThemeType.LIGHT}  
)

GDP 动态柱状图的绘制

完成列表的排序

我们使用 sort 的方法进行能够指定排序规则的排序
使用方法

列表. sort (key=, reverse=)

  • key:要求传入一个函数(函数的传入自变量为列表的元素),将列表的每一个元素都传入函数中,返回排序的依据
  • 参数 reverse,是否反转排序的结果
Python
1
2
3
4
5
6
7
my_list=["a",33],['b',55],['c',11]("a",33],['b',55],['c',11.md){#e2dd4979bc3f4613089ce89bc6290b99}  
# 基于带名函数进行排序  
def choose_sort_key(element):  
    return element[1]  
my_list.sort(key=choose_sort_key,reverse=True)  

print(my_list)

或者直接使用 lambda 函数

Python
1
2
3
4
5
6
7
my_list=["a",33],['b',55],['c',11]("a",33],['b',55],['c',11.md){#e2dd4979bc3f4613089ce89bc6290b99}  
# 基于带名函数进行排序  
# def choose_sort_key(element):  
#     return element[1]  
# my_list.sort(key=choose_sort_key,reverse=True)  
my_list.sort(key=lambda element:element[1],reverse=True)  
print(my_list)

完成图表所需的数据处理和数据图的绘制

我们需要对结果进行排序,取到前八名
我们使用记事本打开文件,逗号分开的就是不同的列

Python
#  
# my_list=["a",33],['b',55],['c',11]("a",33],['b',55],['c',11.md){#e2dd4979bc3f4613089ce89bc6290b99}  
# # 基于带名函数进行排序  
# # def choose_sort_key(element):  
# #     return element[1]  
# # my_list.sort(key=choose_sort_key,reverse=True)  
# my_list.sort(key=lambda element:element[1],reverse=True)  
# print(my_list)  
from cProfile import label  

from pyecharts.charts import Bar,Timeline  
from pyecharts.options import * # 所有都导进来  
from pyecharts.globals import ThemeType  

from 基础柱状图 import timeline  

# 读取文件  
f=open("D:/1960-2019全球GDP数据.csv","r",encoding="GB2312")  
data_line=f.readlines()  
# 删除第一条数据  
data_line.pop(0)  
# print(data_line)# 此时输出的是列表,每个元素是由一行组成的字符串['1960,美国,5.433E+11\n', '1960,英国,73233967692\n',……  
# 将数据转化为字典储存,格式为:  
# {年份:[国家,gdp]……,[[国家],[gdp](国家,gdp]……,[[国家],[gdp.md){#cabcb6117dc9bb4861afd3c7e9ff60b5}……}  
# 先定义一个字典的对象  
data_dict={}  
for i in data_line:  
    year=int(i.split(",")[0])# 年份(使用函数分割,转换为int  
    country=i.split(",")[1]# 国家  
    gdp=float(i.split(",")[2])# gdp数据  
    # 如何判断字典中有没有指定的key(使用异常的捕获的形式  
    try:  
        data_dict[year].append([country,gdp])  
    except KeyError:  
        data_dict[year]=[]  
        data_dict[year].append([country,gdp])  
print(data_dict)# 此时的初始结果就是我们想要的字典的形式了  

# 循环我们的字典,每一年都构建一个对象  
# 先排序年份  
print(data_dict.keys())  
s_data_dict=sorted(data_dict.keys())  
print(s_data_dict)  
timeline=Timeline(  
    {"theme":ThemeType.LIGHT}  
)# 进行主题颜色的设计  

for year in s_data_dict:  
    data_dict[year].sort(key=lambda element:element[1],reverse=True)  
    # 去除本年份前八的国家  
    year_data=data_dict[year][0:8]  
    x_data=[]  
    y_data=[]  
    for i in year_data:  
        x_data.append(i[0])  
        y_data.append(i[1]/100000000)  
    # 构建柱状图对象  
    x_data=x_data[::-1]# 将轴的数据顺序反转一下,使得GDP高的在上面  
    y_data=y_data[::-1]# 或者时间使用reverse反转  
    bar=Bar()  
    bar.add_xaxis(x_data)  
    bar.add_yaxis("GDP(亿)",y_data,label_opts=LabelOpts(position="right"))  
    bar.reversal_axis()# 反转  
    bar.set_global_opts(  
        title_opts=TitleOpts(title=f"{year}年全球前8GDP的数据")  
    )# 进行柱状图标题的设置  
    # 构建时间线里面的  
    timeline.add(bar,str(year))  

timeline.add_schema(  
    play_interval=1000,# 自动播放的时间,单位ms  
    is_timeline_show=True,# 是否在自动播放的时候显示时间线  
    is_auto_play=True,# 是否自动播放  
    is_loop_play=True# 是否自动循环播放  
)  

timeline.render("GDP可动的柱状图.html")
总之就是在时间线对象中构建图表的对象