文章目录
- 基本统计特征
- 区间统计
- Pandas
- pandasGUI
Python科学计算:数组💯数据生成💯数据交互💯微积分💯插值💯拟合💯FFT💯卷积💯滤波
基本统计特征
分析统计特征是数据分析的重要一环,numpy自然不会在这个领域缺席,提供了提供了一系列统计函数,如表所示。
类别 | 函数 |
---|---|
最值 | amin , min
∗
^*
∗, amax , max
∗
^*
∗, 极差ptp |
分位数 | quantile
∗
^*
∗, |
统计量 | 中位数median
∗
^*
∗;平均数mean
∗
^*
∗;变化幅度var ;加权平均average |
标准差std ;协方差cov ;相关系数corrcoef | |
其他 | 相乘求和correlate ;连乘prod ;梯形求和trapz |
其中,标有星号*的表示存在一个nan
开头的同名函数,可以忽略非有效值,例如【sum】对应【nansum】。这些概念基本都是中学时就已经有所了解的,但协方差、相关系数涉及到多组数据,在此稍微复习一下。
对于 X , Y X, Y X,Y两组样本,其协方差可以表示为
c o v ( X , Y ) = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) n − 1 cov(X,Y) = \frac{\sum_{i=1}^n(x_i-\bar x)(y_i-\bar y)}{n-1} cov(X,Y)=n−1∑i=1n(xi−xˉ)(yi−yˉ)
【cov】作为协方差函数,得到的是一个矩阵,分别用于描述 X ∼ X , X ∼ Y , Y ∼ X , Y ∼ Y X\sim X, X\sim Y, Y\sim X, Y\sim Y X∼X,X∼Y,Y∼X,Y∼Y这四对协方差。
在理解协方差与方差之后,就可以理解相关系数,记 C i j C_{ij} Cij为第 i i i和第 j j j列数组之间的协方差,那么相关系数可表示为
R i j = C i j C i i C j j R_{ij}=\frac{C_{ij}}{\sqrt{C_{ii}C_{jj}}} Rij=CiiCjjCij
可见,当 i = = j i==j i==j时,数组与其自身的相关系数为1,可以用下面的代码测试一下。
import numpy as np
x = np.arange(10)
np.corrcoef(x,x[::-1])
区间统计
如果将样本的取值范围划分成特定的几个区间,并统计落入每个区间的值的个数,就可以得到一个图,此即数据直方图,【plt】中提供了【hist】函数,可以直接出图,示例如下
import matplotlib.pyplot as plt
np.random.seed(42)
x = np.random.normal(size=(1000))
y,b,_ = plt.hist(x, bins=20)
plt.show()
其中,bins表示区间个数,返回值 y y y表示每个区间的元素个数, b b b表示区间的节点,20个区间共有21个节点。绘图结果如下,其横坐标的确被分成了20份。
【histogram】是numpy中的直方图函数,这个函数只有两个返回值 y , b y,b y,b,结果与plt.hist完全相同,但不会画出图像。除了待统计数组和指定区间个数外,histogram还有下列参数可以设置
- range 表示统计区域,例如
[0,1]
表示统计从0到1的值 - weights 表示数组权重
- density 为
True
时,返回概率密度;为False时,返回元素个数
numpy中还提供了二维直方图histogram2d和高维直方图histogramdd,使用方法大同小异。
Pandas
【Pandas】是Python专业的统计模块,以数据框【DataFrame】这种表格类型为核心对象,使得数据统计更加便捷,提供了类似Excel、SAS之类的操作体验,示例如下。
import numpy as np
import pandas as pd
s = pd.Series(range(5))
dates = pd.date_range('20221201', periods=3)
data = np.random.randn(3, 4)
df = pd.DataFrame(data, index=dates, columns=list('ABCD'))
其中, s s s是一个序列,dates是一个日期时间索引,二者同为Pandas的数据类型,均类似于一维数组,比较简单。
【df】就是数据框,其构造函数中,第一项是数据,index为行索引,column为表头。数据框中封装了许多方法,诸如sum, mean等,用以获取统计信息,但最快捷的,还是describe函数,可以一次性给出多种统计特征,示例如下
>>> df.describe()
A B C D
count 3.000000 3.000000 3.000000 3.000000
mean -0.406763 -0.490002 0.682413 -0.182096
std 0.454428 0.144518 0.481390 0.338844
min -0.930670 -0.581243 0.128678 -0.391708
25% -0.550449 -0.573315 0.522944 -0.377557
50% -0.170229 -0.565386 0.917209 -0.363407
75% -0.144809 -0.444382 0.959280 -0.077290
max -0.119389 -0.323378 1.001352 0.208826
此外,还封装了各种排序方案,甚至可以画图。
# 此为按列(axis=0时为按行)进行由大到小的排序
df.sort_index(axis=1, ascending=False)
# 此为按照B列进行排序
df.sort_values(by='B')
df.plot()
plt.show()
对数据框而言,不同的列可以有不同的数据类型,通过将字典转换为数据帧的过程,可以很好地说明这一点
df2 = pd.DataFrame({
'A':1,
'B':pd.date_range('20221201', periods=3),
'C':np.arange(3)
})
print(df2)
'''打印结果为
A B C
0 1 2022-12-01 0
1 1 2022-12-02 1
2 1 2022-12-03 2
'''
pandasGUI
如果说pandas相对于【np+plt】来说并没什么优势,那么pandasGUI就堪称绝杀了,这是一个类似于Excel的交互式窗口,可通过pip安装,并可在Python命令行中启动。
pip install pandasgui
安装完成后,从【pandasgui】中导入show函数,直接调用,就会弹出一个窗口。
from pandasgui import show
show()
如下图所示,点击菜单栏中的【setting】->【Context Menus】,可将PandasGUI添加到右键菜单或者开始菜单等位置,便于快速启动。
在PandasGUI的菜单栏中,点击【Edit】->【import】即导入csv, xlsx等格式的数据。
此外,也可以导入Python命令行中的数据,以【pandasgui】中自带的泰坦尼克数据集为例,只需将其作为show函数的参数,即可在弹出的窗口中显示对应数据
from pandasgui.datasets import titanic
show(titanic)
其最左侧是数据列表,目前只导入了泰坦尼克数据;中间是数据筛选界面;右侧是数据区。
其数据区出现四个选项卡,对应pandasGUI的四个功能
- DataFrame 数据表,双击表头可以对此列进行排序,点击右键可弹出菜单;双击数据区,可更改单元数据。
- Statistics 数据的统计情况
- Grapher 画图
- Reshaper 数据的整体操作,比如旋转、合并、截取等。
如果数据导入时遇到下面的错误
'bokeh.plotting' has no attribute 'Figure'
只需更改pandasGUI的【utility.py】文件,将下面代码中的Figure改为figure即可。
import bokeh.plotting
if issubclass(type(fig), bokeh.plotting.Figure):
return "bokeh"
pandasGUI提供了许多绘图类型,包括散点图、线图、条形图、直方图、箱线图、小提琴图、3D散点图、热图、等高线、饼图、蜡烛图以及词云。
以小提琴图为例,点击进入【Grapher】选项卡后,用鼠标将【sex】拖动到中间【x】坐标后的输入框中,将【age】拖动到【y】后的输入框,然后点击上方的Violin,即可自动完成小提琴图的绘制,左右两个“小提琴”分别表示男性和女性的年龄分布。
pandasGUI基于plotly完成图形的绘制,有着良好的交互性,当鼠标掠过图像时,其右上角有一组功能按钮,可对图像进行保存、缩放等操作。
若拖动新的数据到 x , y x,y x,y轴后面,则绘图数据可被覆盖;若双击输入框,则输入框会被清除。此外,数据下方有一些按钮,点击【Reset】可清空所有输入框中的数据。