导图社区 智能统计学技术
详细讲解了numpy, pandas, plt库的使用,介绍详细,知识全面,希望可以对大家有所帮助!
编辑于2024-02-04 00:48:40智能统计学技术
导论
课本
统计思维:程序员数学之概率统计
python数据分析与应用
分析数据
明确目标
先决条件
方向
数据收集
数据库
其他
数据处理
清洗(预处理)
转化
提取
计算
数据分析
数据分析
pandas
数据挖掘
数据展现
图表
表格
文字
内容
概率论
统计学
量化分析实现
调用的库
NumPy
数组与矩阵运算
效率极高
Matplotlib
图表、可视化
Pandas
名字由来
panel data和data analysis
功能
数据分析和探索
高级数据结构
Series
一维数据
DataFream
二维数据
NumPy
介绍
强大的N维数组ndarray
广播功能函数ufunc
整合C/C++/Fortran代码的工具
线性代数、傅里叶变换、随机数生成等功能
ndarray
作用
存储单一数据类型的多维数组
创建
从已有数据中创建多维数组
从list, tuple对象中创建 - array()
np.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
object — list或tuple对象,强制参数
dtype — 数据类型
copy — 对象被复制
order — 数组按一定的顺序排列:C - 按行;F - 按列;A - 如果输入为F则按列排列,否则按行排列;K - 保留按行和列排列
subok —返回的数组被强制为基类数组
ndmin — 最小维数
从字符串中读取 - fromstring()
np.fromstring(string, dtype=float, count=-1, sep=”)
创建特定形状的多维数组
创建‘全1'数组- ones()
np.ones(shape, dtype=None, order='C')
创建‘全0'数组 - zeros()
np.zeros(shape, dtype=float, order='C')
创建空数组 - empty()
np.empty(shape, dtype=float, order='C')
自主填充数组 - full()
np.full(shape, fill_value, dtype=None, order='C')
创建单位矩阵 - eye()
np.full(n)
从numerical range 创建多维数组
创建等差数列数组 - arange()
np.arange(start=0, stop, step=1, dtype=None)
创建等差数列数组 - linspace()
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
num是等分的个数
属性
ndim
维度
shape
每个维度的长度
size
元素的总数
dtype
元素的类型
itemsize
数组中每个元素的大小
索引和切片
同list
方法
reshape(a,b)
改变成a行b列的矩阵
repeat(4, axis=1)
复制4次,添加在右边
numpy.random
np.random.rand(2, 3)
数值取值为[0,1],2行3列
np.random.randint(5, size = (2, 3))
数值小于5,2行3列
NumPy矩阵
是ndarray的子类
创建矩阵
使用分号隔开数据
matr1 = np.mat("1 2 3;4 5 6;7 8 9")
使用列表创建矩阵
matr2 = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
将小矩阵组合成大矩阵
matr3 = np.bmat("arr1 arr2; arr1 arr2")
矩阵属性
矩阵运算
ufunc函数
作用
能够对ndarray数组进行处理的函数,直接用就行了
常用操作
四则运算
比较运算
逻辑运算
np.all(x)函数表示对x用逻辑and
np.any(x)函数表示对x用逻辑or
广播机制
指不同形状的数组之间执行算术运算的方式
原则
让所有的输入数组向其中shape最长的数组看齐,shape中不足的部分通过在前面加1补齐
输出数组的shape是输入数组shape的各个轴上的最大值
如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为 1,则这个数组能够用来计算,否则出错
当输入数组的某个轴的长度为1时,沿着此轴运算时使用此轴上的第一组值
读写文件
二进制文件
numpy.save(file, arr, allow_pickle=True, fix_imports=True)
注意:保存路径中的目录一定要存在!save函数不会自动创建目录。
numpy.load(file, mmap_mode=None, allow_pickle=True, fix_imports=True, encoding='ASCII')
文本文件
np.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n',header='',footer='', comments='# ')
numpy.loadtxt(FILENAME, dtype=int, delimiter=' ')
简易分析
排序
直接排序
指对数值直接进行排序
numpy.sort(a, axis, kind, order)
a
要排序的数组
axis
沿着它排序数组的轴,如果没有数组会被展开,沿着最后的轴排序
kind
默认为'quicksort'(快速排序)
order
如果数组包含字段,则是要排序的字段
间接排序
指根据一个或多个键对数据集进行排序
numpy.argsort(a)
函数对输入数组沿给定轴执行间接排序,并使用指定排序类型返回数据的索引数组(下标)
numpy.lexsort(a,b)
函数使用键序列执行间接排序,键可以看作是电子表格中的一列,返回一个索引数组(下标)
去重
numpy.unique
统计函数
matplotlib
介绍
提供了丰富的数学绘图函数,可以很方便的绘制数据图表
其他可视化统计工具
echart
词云
标准方法
基本流程
创建画布
<是否创建子图>
选定子图
设置X、Y轴
添加图例(细节)
<是否完成绘制>
保存显示
步骤解析
创建画布
plt.figure(figsize=(x,y))
有画布的话可以创建多个图形
plt.subplot(nrows, ncols, index)
nrows 参数指定将数据图区域分成多少行
ncols 参数指定将数据图区域分成多少列
index 参数指定获取第几个区域
选定子图
折线图
plot
散点图
scatter
条形图
水平
bar
垂直
barh
直方图
hist
饼图
pie
...
设置X、Y轴
Axes
plot
plt.plot(x,y)
x和y是两个数组,如果只输入一个默认x轴为数组下标
还有设置颜色、透明度、样式、宽度等参数
plt.plot(x, y, color='green',alpha=0.5,linestyle='-',linewidth=3,marker='*')
添加图例(细节)
标题、区间上下限、图例、分段、布局、轴等
设置标题
plt.xlabel('Time')
plt.ylabel("Temp")
plt.title('Title')
中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']
自定义X轴刻度
plt.xticks(range(0,len(x),4),x[::4],rotation=45)
X轴区间和上下限
plt.set_xlim([xmin, xmax]) #设置X轴的区间
plt.axis([xmin, xmax, ymin, ymax]) #X、Y轴区间
plt.set_ylim(bottom=-10) #Y轴下限
plt.set_xlim(right=25) #X轴上限
快速方法
import matplotlib.pyplot as plt plt.plot(x,y) plt.show()
Pandas
特点
它提供了简单、高效、带有默认标签(也可以自定义标签)的对象。
能够快速得从不同格式的文件中加载数据(比如 Excel、CSV 、SQL文件),然后将其转换为可处理的对象;
能够按数据的行、列标签进行分组,并对分组后的对象执行聚合和转换操作;
能够很方便地实现数据归一化操作和缺失值处理;
能够很方便地对 DataFrame 的数据列进行增加、修改或者删除的操作;
能够处理不同格式的数据集,比如矩阵数据、异构数据表、时间序列等;
提供了多种处理数据集的方式,比如构建子集、切片、过滤、分组以及重新排序等。
内置数据结构
Series
定义
1维,能够存储各种数据类型,比如字符数、整数、浮点数、Python 对象等,Series 用 name 和 index 属性来描述 数据值。
创建
s=pd.Series( data, index, dtype, copy)
data
输入的数据,可以是标量、列表、字典、ndarray 数组等。
index
索引值必须是惟一的,如果没有传递索引,则默认为 np.arrange(n)。
dtype
dtype表示数据类型,如果没有提供,则会自动判断得出。
copy
表示对 data 进行拷贝,默认为 False。
基本操作
访问
下标索引
类似列表
标签索引
类似字典
Numpy的运算和操作都适用
可以进行切片
常用属性
dtype
返回对象的数据类型。
empty
返回一个空的 Series 对象。
ndim
返回输入数据的维数。
size
返回输入数据的元素数量。
size跟count的区别: size计数时包含NaN值,而count不包含NaN值
values
以 ndarray 的形式返回 Series 对象。
index
返回一个RangeIndex对象,用来描述索引的取值范围。
常用方法
describe()
count:数量统计,此列共有多少有效值 unipue:不同的值有多少个 std:标准差 min:最小值 25%:四分之一分位数 50%:二分之一分位数 75%:四分之三分位数 max:最大值 mean:均值
head()&tail()查看数据
head(n)返回前 n 行数据,默认显示前 5 行数据
tail(n)返回的是后 n 行数据,默认为后 5 行
isnull()&nonull()检测缺失值
isnull():如果为值不存在或者缺失,则返回 True。
notnull():如果值不存在或者缺失,则返回 False。
value_counts
统计频数
DataFrame
定义
2维,既有行索引,也有列索引。行索引是 index,列索引是 columns。 在创建该结构时,可以指定相应的索引值。
表格中每列的数据类型可以不同,比如可以是字符串、整型或者浮点型等
创建
df =pd.DataFrame( data, index, columns, dtype, copy)
data
输入的数据,可以是列表、字典嵌套列表、列表嵌套字典、字典形式的 Series等
列索引操作
列索引选取数据列
print(df ['one'])
print(df[['单词', '汉字', '含义']])
列索引添加数据列
df['three']=pd.Series([10,20,30],index=['a','b','c'])
df['four']=df['one']+df['three']
df.insert(1,column='score',value=[91,90,75])
数值1代表插入到columns列表的索引位置
列索引删除数据列
df.pop('two')
拆分提取列
df[df[‘column_name’] == some_value]
行索引操作
标签索引
df1.loc["b" : "e", "bx" : "ex"]
先行后列
下标索引
df1.iloc[2 : 6, 2 : 4]
先行后列
混合索引
df1.ix[2 : 6, "bx" : "ex"]
先行后列
切片操作多行选取
df[2 : 4]
添加数据行
df = df.append(df2)
删除数据行
df = df.drop(0)
拆分提取行
df.loc[df['column_name'] == str]
输出某一列是NaN的行
df[df['单词'].isna()]
常用属性
T
行和列转置。
axes
返回一个仅以行轴标签和列轴标签为成员的列表。
dtypes
返回每列数据的数据类型。
empty
DataFrame中没有数据或者任意坐标轴的长度为0,则返回True。
ndim
轴的数量,也指数组的维数。
shape
返回一个元组 (a,b),a 表示行数,b 表示列数
size
DataFrame中的元素数量
size跟count的区别: size计数时包含NaN值,而count不包含NaN值
values
使用 numpy 数组表示 DataFrame 中的元素值
常用方法
describe(include='all')
同Series
不加参数的话只统计数值列
head()&tail()
同Series
info()
查看信息
shift()
将行或列移动指定的步幅长度
pivot()
将一个数据框中的列进行转换,使得某一列成为新的行索引,并用另一列的值来填充这个索引对应的单元格。
参数
index: 将要成为新的行索引的列名
columns: 将要成为新的列索引的列名
values: 将要填充新行索引和新列索引之间的单元格的列名
sort_values(by=‘进行排序的列名或索引值’, axis=0, ascending=True, inplace=False, kind=‘quicksort’, na_position=‘last’, ignore_index=False, key=None)
sort_index(axis=0, level=None, ascending=True, inplace=False, kind='quicksort', na_position='last', sort_remaining=True, ignore_index=False, key=None)
axis:axis 默认为 0,即指按照行的索引进行排序;axis 设置为 1,即指按照列的索引进行排序 level:默认None,否则按照给定的 level 顺序排列。 ascending:ascending 默认为 True,即升序,设置为 False 时候为降序。 inplace:默认False,否则排序之后的数据直接替换原来的数据框 kind:排序方法,{‘quicksort’, ‘mergesort’, ‘heapsort’}, default ‘quicksort’。用户可以自己选用 na_position:缺失值默认排在最后{"first","last"},参数“ first”将NaN放在开头,“ last”将NaN放在结尾。 ignore_index:布尔量,默认为 False,如果为 True, 那么 axis 则是 label 0,1,2;这是新加的 key:这是一个可调用的函数,即在排序之前先对 index 的值执行 key 函数。这有点类似于内置函数 sorted() 函数里面的 key 函数
遍历
遍历每一行
for index, row in df.iterrows():
遍历每一列
for column, value in df.iteritems():
数据表清洗
用数字0填充空值
df.fillna(value=0)
使用列prince的均值对这列NA进行填充
df['prince'].fillna(df['prince'].mean())
清除city字段的字符空格
df['city']=df['city'].map(str.strip)
大小写转换
df['city']=df['city'].str.lower()
数据类型转换
df['price'].astype(int)
更改列/行索引
全部修改
手写索引
df.columns=['a','b','c']
df.index=['a','b','c']
引用索引
df.set_columns("idx",inplace=False)
df.set_index("col",inplace=False)
部分修改
df.rename(columns={'category': 'category-size'},inplace=False)
df.rename(index={'category': 'category-size'},inplace=False)
重复
查找重复项:df.duplicated()可以返回一个布尔数组,指示每一行是否是重复项。
删除后出现的重复值
df['city'].drop_duplicates()
删除先出现的重复值
df['city'].drop_duplicates(keep='last')
选择主键
subset=['学号']
删除NaN
df2=df.dropna(axis=0,how="all",inplace=False)
how="all"表示某行(列)全为NaN才会删除。how="any"表示只要有一个NaN就会删除(默认)
数据替换
df['city'].replace('sh', 'shanghai')
数据表合并
merge
pd=pd.merge(df,df1,how='inner') #匹配,合并,交集,默认 df_left=pd.merge(df,df1,how='left') df_right=pd.merge(df,df1,how='right') df_outer=pd.merge(df,df1,how='outer') #并集,效果等同于前两个组合
append
已经被弃用,推荐使用concat
join
concat
pd.concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verify_integrity=False,copy=True)
统计
var()
方差
cov()
协方差
汇总
样例1
df = pd.DataFrame({ 'A': ['a', 'b', 'a', 'c', 'a', 'c', 'b', 'c'], 'B': [2, 8, 1, 4, 3, 2, 5, 9], 'C': [102, 98, 107, 104, 115, 87, 92, 123]})
方法
按A列分组(groupby),获取其他列的均值
df.groupby('A').mean()
取出某一列
print(df.groupby('key1')['data1'].mean())
按多列进行分组(groupby)
df.groupby(['A','B']).mean()
样例2
df = pd.DataFrame({' A': list('XYZXYZXYZX'), 'B': [1, 2, 1, 3, 1, 2, 3, 3, 1, 2], 'C': [12, 14, 11, 12, 13, 14, 16, 12, 10, 19]})
方法
针对某列使用agg()时进行不同的统计运算
df.groupby('A')['B'].agg({'mean':np.mean, 'standard deviation': np.std})
lambda运算
少数民族分数补偿
df['ExtraScore'] = df['Nationality'].apply (lambda x : 5 if x != '汉' else 0)
成绩合格
df['pass_reading'] = df['阅读成绩'].apply (lambda x: 'Pass' if x >= 60 else 'Fail')
画图
ax = series1.plot(kind='bar')
fig = ax.get_figure() fig.subplots_adjust(bottom=0.4) fig.savefig('output.png')
pd.plot(kind='scatter',x="a",y="b",alpha=0.1)
alpha是透明度
pd.hist(bins=50,figsize=(7,7))
数据输入输出
输入
读取csv
df = pd.read_csv("mtcars.csv", encoding="utf-8")
写入Excel
df = pd.read_excel("mtcars.csv")
输出
写入Excel
pd.to_excel('excel_to_python.xlsx', sheet_name='bluewhale_cc')
写入到CSV
pd.to_csv('excel_to_python.csv')
Pandas与NumPy区别
datetime
1).date子类可以创建日期时间序列的数据、2).time子类可创建小时分时间数据,而3).子类datetime则可以描述日期小时分数据。
import datetime cur = datetime.datetime(2018,12,30, 15,30,59) print cur,type(cur) d = datetime.date(2018,12,30) print d t = datetime.datetime(2018,12,30).now() print t
2018-12-30 15:30:59 <type 'datetime.datetime'> 2018-12-30 2018-12-16 15:35:42.757826
4).可以使用datetime的timedelta模块给出时间间隔(差)。
import datetime cur0 = datetime.datetime(2018,12,30, 15,30,59) print cur0 cur1 = cur0 + datetime.timedelta(days = 1) print cur1 cur2 = cur0 + datetime.timedelta(minutes = 10) print cur2 cur3 = cur0 + datetime.timedelta(minutes = 29,seconds = 1) print cur3
2018-12-30 15:30:59 #cur0 2018-12-31 15:30:59 #cur1 2018-12-30 15:40:59 #cur2 2018-12-30 16:00:00 #cur3
用datetime数据创建time series时间序列数据。意思就是用datetime创建的时间作为index。
from datetime import datetime, timedelta import numpy as np import pandas as pd b = datetime(2018,12,16, 17,30,55) vi = np.random.randn(60) ind = [] for x in range(60): bi = b + timedelta(minutes = x) ind.append(bi) ts = pd.Series(vi, index = ind) print ts[:5]
2018-12-16 17:30:55 -1.469098 2018-12-16 17:31:55 -0.583046 2018-12-16 17:32:55 -0.775167 2018-12-16 17:33:55 -0.740570 2018-12-16 17:34:55 -0.287118 dtype: float64
补充
类
Hist类
将值映射到一个用整数表示的数量
Pmf类
将值映射到一个用浮点数表示的概率
上述过程称为正态化,即概率总和为1
CDF类
PMF的不足
PMF的适用情况:处理的数据比较少时
随着数据的增加,每个值的概率就会降低,而随机噪声的影响就会增大
解决办法
数据分组:确定分组区间的大小需要技巧
分组区间大到能够消除噪声的时候,可能会将有用信息舍去
CDF
累计分布函数
能完整描述一个实数随机变量X的概率分布,是概率密度函数的积分
百分位秩
以考试成绩为例:两种形式呈现 1.原始分数 2.百分位秩:原始分数不高于你的人在全部考试人数中所占的比例再乘以100。 例:若某人在90百分位秩,说明其比90%的人成绩好;或者至少不比90%的考试人员差。
计算出CDF后,能够较为方便地计算出百分位数和百分位秩
函数
PercentileRank(x)
对给定的值x,计算其百分位秩
100*CDF(x)
Percentile (p):对给定的百分位秩,计算对应的值x;
四分位距
四分位数
四分位距是统计学中的一种描述离散数据分布程度的指标。它分别表示数据中第25%、第50%、第75%的位置。
四分位距
高四分位减去低四分位,就是四分距。
作用
四分位距表示的是数据的离散程度,越大表示数据的离散程度越高。
箱型图
有了最小值,低四分位,中位数,高四分位,最大值,这五个数值,我们就可以画箱线图。
异常值
我们可以顺便引出一种定义异常值的方法:如果一个数值特别小,比低四分位减去1.5倍四分距还要小,可以算作异常值;对应的,如果一个数值特别大,比高四分位加上1.5倍四分距还要大,也可以算作异常值。
CCDF(a) = P(X > a)= 1- CDF(a)
概念
PDF:概率密度函数(probability density function), 在数学中,连续型随机变量的概率密度函数(在不至于混淆时可以简称为密度函数)是一个描述这个随机变量的输出值,在某个确定的取值点附近的可能性的函数。
PMF:概率质量函数(probability mass function), 在概率论中,概率质量函数是离散随机变量在各特定取值上的概率。
CDF:累积分布函数 (cumulative distribution function),又叫分布函数,是概率密度函数的积分,能完整描述一个实随机变量X的概率分布。
分布建模
指数分布
正态分布
概率密度函数
累计分布函数
对数正态分布
如果一组数值对数变换后服从正态分布,就称其服从对数正态分布。即用log(x)代替正态分布里的x。
帕累托分布Pareto
变量之间的关系
协方差
协方差可以用于衡量相关变量变化趋势是否相同,也可用于衡量两个变量的总体误差。
因为值和单位难解释,一般较少使用
方差可以看成协方差的一种特殊情况,即当两个变量是相同的情况。
如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值时另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值;
如果两个变量的变化趋势相反,即其中一个变量大于自身的期望值时另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值;
皮尔逊秩 Pearson
适用范围
两组数据变量分布正常,且两者呈线性关系
用标准分数代替原始的值,计算两个标准分数的乘积
称为皮尔逊相关系数,其中-1<=p<=1, p=1:表示两个变量完全正相关; p=-1:表示两个变量完全负相关;
斯皮尔曼秩 Spearman
适用范围
存在异常值和变量分布非常不对称:
先计算序列中数值的秩:即某个值在序列中按排序后的位置,再计算秩的皮尔逊相关系数
样例
序列{7,1,2,5} 对序列从小大到排序,结果为{4,1,2,3} 所以5的秩为3