使用Python分析数据

本来这不是我现在该想的东西,被迫因为建模比赛看了一点。所学东西太过杂乱。

为什么不用Matlab、Mathematica

因为Mathematica被我卸了,Matlab没学过,也不喜欢。这只是一个排除法,我不知道该怎么从优势上比较。

R语言没学过,Julia也没有,所以回归工具齐全的Python。

Python 数据分析套装

建议目标就是分析数据的人直接安装anaconda,使用jupyter lab,不折腾。

  • 对于数据读入和清洗:Pandas
  • 对于矩阵等向量运算:numpy
  • 对于计算机代数计算:sympy

绘图

绘图的库就很多了。Matplotlib,Plotly,Seaborn,Altair这几个还不错。第一个比较底层,是直接参照Matlab的API设计的,Seaborn是在其基础上设计的更高层的绘图包,所以使用、配色、排版什么的都不错。Plotly和Altair都是具有一定交互能力的绘图包,在lab里是需要前端js配合绘图的(所以一旦图片数据太多,会卡得浏览器痛不欲生)。

我就胡乱选了个Plotly。不过现在看来大概是个错误的决定。

Plotly在国内配置的坑

看着npm和yarn这两个字眼就害怕现在。js那一堆乱七八糟的工具链,支持度各不相同的标准,这里可以import,那里又会ce必须用require,又let又var,到现在也整不清楚的this和that,有的包要求传正确的lambda表达式,有的又必须用function,还有一堆坑……看着就想躲着走,然而这plotly的构建是需要npm和yarn的。

……为什么这破语言能用到现在。

在安装Plotly向Jupyter lab的支持库时,切勿在npmyarn中使用镜像。镜像和源之间有一定的更新延迟并且存在同步错误而跳过某些包的问题。我就正好卡在了被跳过的包上,因为这个问题死活编译不过去浪费了很长时间。

其次,使用Plotly输出.pdf等格式的图片文件时,需要安装ocra,在服务器上配置时还需要安装xvfb,这些都在其文档中有写,不过视系统不同仍然需要自己补齐很多支持库。从这个角度上来说,似乎还是选择Seaborn+Matplotlab比较好,除非你有工具人,否则不要把时间浪费在莫名其妙的地方。

基本操作

numpy和pandas都有快速入门教程,花20分钟读一读,然后剩下的随用随查就好了。

这里记几个常用但是不太好找的东西。

如何遍历数据帧的所有行

标准操作是apply

1
df['pass']=df.apply(lambda a:a['grade']>=60,axis=1)

但是,这玩意的坑在于传给它的函数内部是只能get不能set的。即使set也没有作用。不过一般修改单列数据也没有问题,可以像上面一行一样。

另外时刻记住,筛选的数据帧结果也是不能set的。虽然不知道为什么,但是我在踩这个坑的时候,有些时候不但不会修改而且连错误也不会报。

不过如果是修改多行数据呢,上面的命令是不能简单推广的。当然可以用一些很丑陋的做法,比如for i in range(df.shape[0])(可能有稍微好看一点的写法)然后iloc一个个的改掉。不过实际上,仍然有使用apply的余地。

1
2
3
4
def fn(row):
return math.sqrt(row['计算机导♂论'])*10,math.sqrt(row['高等♂数学'])*10

df['计算机导♂论'],df['高等♂数学']=zip(*df.apply(fn,axis=1))

开方乘十,标准的捞人方法要不要了解一下。

这种方案可读性较差,不过实测是快于手动遍历的。听说python不想让人管复杂度,事实却不大行啊。

Plotly的整体设计

Plotly的官方文档写得很好,看完概览后费点功夫就能找到自己想要的图的画法。再想自定义就去翻API。

总体来看,graph_object(好像是这么拼?)是最基础的绘图对象,设置好图例后加入到Figure里,就可以作为最终结果输出。express是一个更高层的工厂,能够满足一般情况常用的图的快速绘制。所以,先去express,满足不了再往下找。

如果看完概览了之后还能发现一个很重要的信息。设置图例属性时可能会遇到嵌套多层对象的那种参数,这时候可以直接使用_连接参数名,不需要一层层构造。

知道这些之后随便画就是了。


使用Python分析数据
https://blog.chenc.me/2020/02/21/python-in-data-processing/
作者
CC
发布于
2020年2月22日
许可协议