使用pandas/bokeh做交互数据可视化项目遇到的知识整理

这几天一直在做关于新冠疫情的可视化,带着自己想要的需求在使用着各种各样的工具,其中用到pandas库与bokeh库比较多,在这里将遇到和使用的的知识整理一下,也将踩到的大大小小的坑记录一下

这是写给未来的我的一篇博客,如果把这些用到的知识忘记的话,这篇博客可以让他回想起来七七八八

踩到坑一直在到处搜索解决方案,在别处文章看到解决bug的经验感觉非常认同,在这里贴下:

经验一:保持冷静,切勿暴躁,心态失衡时容易捶鼠标,捶键盘,捶坏了,还得买新的。

经验二:先从自身代码找原因,复制粘贴有时候也会出现偏差,这时候,最好就和源头对比一下。如果肉眼发现不了,上比较工具,靠谱。

经验三:问谷歌,不要问某度。这年头,经常听到一些小伙伴们抱怨说,公司不允许上网,遇到问题时真的无从下手,我只能说这样的公司真的是闭关锁国啊。

经验四:换个环境试一试。同样的代码,环境不同,运行后的解决真有可能不同。IDEA 中出错,放 Eclipse 中试试;Windows 下出错,放 Linux 下试试;自己的环境有问题,放同事的环境下试试。

经验五:搜索的时候换一下关键词,真的是“柳暗花明又一村”啊。

经验六:重复以上。

下面进行知识整理
pandas:
1、我要处理的是json的数据格式,首先用pandas来解析json数据格式呢使用到的是pandas的read_json函数(虽然我的json数据不能这样解析),read_json函数将json文件按照预定的格式转化为DateFrame数据形式,read_json函数的语法如下:

pandas.read_json(path_or_buf=None, orient=None, typ=‘frame’, dtype=True,
convert_axes=True, convert_dates=True, keep_default_dates=True,
numpy=False, precise_float=False, date_unit=None, encoding=None,
lines=False, chunksize=None, compression=‘infer’)

介绍两个经常使用的参数:
第一个参数就是json数据或者json的文件存储路径,这里要注意的是,json文件的存储路径并不一定是本机的,也可以是网络的存储路径,pandas会自动为你发送请求获取数据。
第二个参数也就是orient,用来向pandas表明预期的json数据格式,有几种,分别为‘split’,‘record’,‘index’,‘columns’,‘values’,这几种预定的数据格式,
(1).‘split’ : dict like {index -> [index], columns -> [columns], data -> [values]}
直接 指出DataFrame的数据索引和列名字如下:
在这里插入图片描述
(2)、‘records’ : list like [{column -> value}, … , {column -> value}]
这种就是给出了列名和内容,pandas需要自动补全索引的:
(3)、‘index’ : dict like {index -> {column -> value}}
给出索引,并同时列名为键,内容为键值,实例如下:
在这里插入图片描述
(4)、‘columns’ : dict like {column -> {index -> value}}
嵌套字典,在每一列中的键值中标明索引值对应的内容,如下:
在这里插入图片描述
(5)、‘values’ : just the values array。
嵌套列表,如下:
在这里插入图片描述
2、遇到的是那种树状的json嵌套的字典格式,所以不得不用自己写的一些灵活性比较高的对症下药的代码与json库结合起来才能将那些树状的json数据解析为pandas 的DataFrame,下面要进行的就是数据的清洗工作了,因为解析出来的DataFrame数据会有许多的空值或者缺失的数据,在进行数据清洗的时候有一点感悟就是,

也许你的想法或者灵感是来自于你的天赋,但丰富而又广泛的基础知识与各种方法我感觉才是这些神奇的想法或灵感的真正来源,就比如,在解析这些树状的json文档的时候,如果我不知道或者忘记python的eval函数可以将列表或字典在字符串之间相互转换的话,那么无论我刷多少算法题,打破脑袋都想不出可以使用递归加上eval函数来解析树状的json文档提取出我们真正想要的值来。

我们要去除这些空值或者缺失的数据,我们这时已经知道我们所提取出来的DataFrame数据同行也就是同索引的数据只要有一个是空值那么,这一行的值必定都是空值,那我们这时就可以使用DataFrame的特性来选择特定的数据:
在这里插入图片描述
这里注意到的是DataFrame数据的列名是可以像这个变量的属性一样被引用出来的,这里的三行代码就将df中的空字符与空值全部去除,得到我们想要的数据,DataFrame的tolist()函数将这个指定的列转化为一个列表。

下面我们将pandas的DataFrame简单介绍一下:
对DataFrame理解,dataframe就像是一个加强版的列表与字典的结合体的数据结构,在对列的选择上是和字典一样,指定列名,返回键值,不过这里的键值是一个series也就是一长列,列表,对行的选择就是列表,通过对索引值的指定切片来选择数据,不过这里似乎并不能来只通过一个索引值来选择一行,只能通过切片选择(同样对列进行选择的时候也可以通过切片来选择),这样就可以达到通过列名和索引值index来对元素精确选择,整个DataFrame形成一个二维矩阵。

dataframe选择数据:

除了上述所说的切片选择与列名选择,还有
根据标签loc-行标签进行选择数据:实例:
#这里是数据
在这里插入图片描述
在这里插入图片描述
根据序列iloc-行号进行选择数据:(相当于转化为了二维数组使用二维数组的规则选择数据)实例:
在这里插入图片描述
根据混合的两种ix:实例:
在这里插入图片描述
根据判断筛选:(在项目中用到的)实例:
在这里插入图片描述
此外还有使用pandas设置数据与使用pandas处理无用的数据,pandas将数据集合并,若忘了的话在收藏夹里面有详细的教程再去过一遍,
pandas数据集合并:
join合并方式:实例:
在这里插入图片描述
在这里插入图片描述
append添加数据:(在项目中使用的是这个)实例:
在这里插入图片描述
pandas还有许多其他的高级用法,比如合并merge,可以在以后的学习中使用到。

下面介绍使用到的bokeh的一些方法:
bokeh这个绘图工具感觉用起来是要比matplotlib等传统的绘图工具用起来要好用多的,用起来是比较简单和方便的,生成的是可视化的可交互的web页面图表,而且bokeh是有和pandas直接对接的绘图参数接口的。
使用是要注意的是如果要使用show()方法来生成这个图表时一定要使用output_file()方法指定文件的储存位置的,而且一定不要重名,或者对同一个画板figure重复初始化(我在这个坑里面整整爬了半天嗷),show()方法显示成品web页面之后,文件自动存储到output_file指定的存储位置。
1、首先介绍bokeh的绘图工具(相当于初始化一个画板,可以在上面绘制各种曲线):实例:

p = figure(plot_width = 600, plot_height = 400, # 图表宽度、高度
           tools = 'pan,wheel_zoom,box_zoom,save,reset,help',  # 设置工具栏,默认全部显示
           toolbar_location='above',     # 工具栏位置:"above","below","left","right"
           x_axis_label = 'A', y_axis_label = 'B',    # X,Y轴label
           x_range = [-3,3], y_range = [-3,3],        # X,Y轴范围
           title="测试图表"                          # 设置图表title
          )

这样的语法来初始化这个画板。

2、对画板进行画图的话使用画板的.circle()属性或.square()或.line()描绘出散点图或者折线图,实例:

p.circle(df['A'], df['B'], size = 20, alpha = 0.5) # 创建散点图  # 这里.circle()是figure的一个绘图方法

绘制散点图,可以看到直接使用的df的[‘A’]列和[‘B’]列当作x轴与y轴,经常使用在同一张图绘制不同的曲线,用来区别,使用散点方法与折线方法绘制同一条曲线效果同下:
在这里插入图片描述
还有其他的是用来美化图表的在这里就不再赘述,比如:对折线或散点的颜色设置,对图表边框线的参数设置,对绘图空间背景的设置,对外边界的背景设置,对x轴y轴刻线的设置,对轴线标签的设置等等,具体详细可以查看一篇博客,讲的很详细,还有许多高级方法对图表链接:
https://www.cnblogs.com/shengyang17/p/9735465.html
bokeh官方文档:
https://docs.bokeh.org/en/latest/docs/user_guide/quickstart.html#userguide-quickstart

3、bokeh生成web页面还可以生成许多小部件,这里介绍一下我的项目中使用的小部件:实例:
在这里插入图片描述

from bokeh.io import output_file, show
from bokeh.models import Panel, Tabs
from bokeh.plotting import figure

output_file("slider.html")

p1 = figure(plot_width=300, plot_height=300)
p1.circle([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], size=20, color="navy", alpha=0.5)
tab1 = Panel(child=p1, title="circle")

p2 = figure(plot_width=300, plot_height=300)
p2.line([1, 2, 3, 4, 5], [6, 7, 2, 4, 5], line_width=3, color="navy", alpha=0.5)
tab2 = Panel(child=p2, title="line")

tabs = Tabs(tabs=[ tab1, tab2 ])

show(tabs)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值