目录
本文章主讲:
numpy库(支持大量的维度数组和矩阵运算,对数组运算提供了大量的数学函数库。同时将可以使用线性代数,傅里叶变换,随机生成数等功能。将C,C++,Fortran代码集成到python)
pandas库(数据分析核心库,作为金融数据分析工具开发,能够快捷的处理结构化数据)
malplotlib库(作为可视化图库帮助用户快速计算和绘图)
sklean库(scikit-learn数据挖掘,数据分析工具建立在numpy,scipy,matplotlib之上,进行数据处理,模型选择,分类,聚类,数据降维和回归)
在使用之前要在Anaconda下载地址下载适合版本的anaconda,安装好以后,运行的时候要在相应的文件夹里运行命令行jupyter notebook
一,NumPy库部分
1.1numpy基本数据类型:
bool
init(一般为int32,int64)
int8,int16,int16,int32,int64.(整数,范围由后部整数确定)
uint8,uint16,uint32,uint64(无符号整数,范围由后部整数确定)
float16,float32,float64或float(分别为,半精度浮点,单精度浮点,双精度)
complex64,complex128或complex(负数。32位浮点数表实部和虚部,64位浮点数实部虚部)
运行前要导入numpy
import numpy as np #导入库
1.2数组用法(array)
import numpy as np #导入库 arr1=np.array([1,2,3,4]) #创建1维数组 arr2=np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]]) #创建2维数组 print('数组维数为',arr2.ndim) #ndim查看数组的维数 print('数组维度为',arr2.shape) #shape查看数组的尺寸 print('数组类型',arr2.dtype) #dtype查看数组元素数组类型 print('元素个数',arr2.size) #size查看数组元素总数 print('数组每个元素大小',arr2.itemsize) #itemsize查看每个数组元素大小 #arange数组生成函数 print('使用arange函数创建数组',np.arange(0,1,0.1)) #其中0为开始,1为结束,0.1为步长 #random随机生成数组函数 print('随机数数组为',np.random.random(100)) #随机生成100个数的数组 print('均匀分布随机数数组为',np.random.rand(10,5)) #随机生成均匀分布的10行5列数组 print('正太分布随机数数组为',np.random.randn(10,5)) #正太分布生成10行5列数组 #生成有上下限的随机数数组 print('生成随机数数组为:',np.random.randint(2,10,size=[2,5])) #生成下限为2上限为10的2行5列的数组
通过索引访问一维数组:
import numpy as np arr=np.arange(10) #生成数组 print("索引结果为:",arr[5]) #通过索引获取数组中的第6个数 print("切片索引的结果为",arr[3:5]) #左开右闭包含3不包含5 print("前省略索引的结果为",arr[:5]) # 前面缺省代表从arr[0]开始 print("-1索引的结果为",arr[-1]) #从后往前第一个 arr[2:4]=99,66 #更改数组中arr[2]arr[3]的值 print("再查看此时的数组",arr)
通过索引访问多维数组:
import numpy as np arr1 = np.array([[1, 2, 3, 4, 5],[4, 5, 6, 7, 8], [7, 8, 9, 10, 11]]) print('创建的二维数组为:',arr1) print('索引结果为:',arr1[0,3:5]) #索引第0行中第3和第4列的元素 print('索引结果为:\n',arr1[1:,2:])#索引第2和第3行中第3列、第4列和第5列的元素 print('索引结果为:',arr1[:,2]) #索引第2列的元素
一维数组的广播机制:
import numpy as np #横向一维数组与二维数组广播 arr1 = np.array([[0,0,0],[1,1,1],[2,2,2],[3,3,3]]) print('创建的数组1为:',arr1) print('数组1的shape为:',arr1.shape) arr2 = np.array([1,2,3]) print('创建的数组2为:',arr2) print('数组2的shape为:',arr2.shape) print('数组相加结果为:',arr1 + arr2) #此时横向一维数组arr2向y轴补全为2维数组再与arr1相加。 #纵向一维数组与二维数组广播 arr3 = np.array([[0,0,0],[1,1,1],[2,2,2],[3,3,3]]) print('创建的数组1为:',arr3) print('数组1的shape为:',arr3.shape) arr4 = np.array([1,2,3,4]).reshape((4,1)) #将横向一维数组转换成纵向一维数组 print('创建的数组2为:',arr4) print('数组2的shape为:',arr4.shape) print('数组相加结果为:',arr3 + arr4) #此时纵向一维数组arr2向x轴补全为2维数组再与arr1相加。
二,Matplotlib库部分
matplotlib.pyplot(一个命令风格函数集合):
2.1 pyplot创建画布函数与选中子图函数
plt.figure 创建一个空白画布,可指定大小,像素
figure.add_subplot 创建选定子图的行数,列数,选中图片的编号
2.2pyplot常用标签列名图例函数
plt.title 在当前图形中添加标题,可指定名称,位置,颜色,字体大小
plt.xlabel 在当前图形中添加x轴,可指定位置,颜色,字体大小
plt.ylabel 在当前图形中添加y轴,可指定位置,颜色,字体大小
plt.xlim 指定当前图形x轴的范围,只能确定一个数值区间
plt.ylim 指定当前图形y轴的范围,只能确定一个数值区间
plt.xticks 指定x轴刻度的数目与取值
plt.yticks 指定y轴刻度的数目与取值
plt.legend 指定当前图形的图例,可指定大小,位置,标签
2.3保存与展示函数
plt.savefig 保存绘制的图形,可指定分辨率,边缘颜色等
plt.show 在本机显示图形
例:
import numpy as np import matplotlib.pyplot as plt ## %matplotlib inline表示在行中显示图片,在命令行运行报错 data = np.arange(0,1.1,0.01) data plt.title('lines') ## 添加标题 plt.xlabel('x')## 添加x轴的名称 plt.ylabel('y')## 添加y轴的名称 plt.xlim((0,1))## 确定x轴范围 plt.ylim((0,1))## 确定y轴范围 plt.xticks([0,0.2,0.4,0.6,0.8,1])## 规定x轴刻度 plt.yticks([0,0.2,0.4,0.6,0.8,1])## 确定y轴刻度 plt.plot(data,data**2)## 添加y=x^2曲线 plt.plot(data,data**4)## 添加y=x^4曲线 plt.legend(['y=x^2','y=x^4']) plt.savefig('y=x^2.png') plt.show()
例2:
import numpy as np import matplotlib.pyplot as plt rad = np.arange(0,np.pi*2,0.01) rad ##第一幅子图 p1 = plt.figure(figsize=(8,6),dpi=80)## 确定画布大小 ax1 = p1.add_subplot(2,1,1)## 创建一个两行1列的子图,并开始绘制第一幅 plt.title('lines')## 添加标题 plt.xlabel('x')## 添加x轴的名称 plt.ylabel('y')## 添加y轴的名称 plt.xlim((0,1))## 确定x轴范围 plt.ylim((0,1))## 确定y轴范围 plt.xticks([0,0.2,0.4,0.6,0.8,1])## 规定x轴刻度 plt.yticks([0,0.2,0.4,0.6,0.8,1])## 确定y轴刻度 plt.plot(rad,rad**2)## 添加y=x^2曲线 plt.plot(rad,rad**4)## 添加y=x^4曲线 plt.legend(['y=x^2','y=x^4']) ##第二幅子图 ax2 = p1.add_subplot(2,1,2)## 创开始绘制第2幅 plt.title('sin/cos') ## 添加标题 plt.xlabel('rad')## 添加x轴的名称 plt.ylabel('value')## 添加y轴的名称 plt.xlim((0,np.pi*2))## 确定x轴范围 plt.ylim((-1,1))## 确定y轴范围 plt.xticks([0,np.pi/2,np.pi,np.pi*1.5,np.pi*2])## 规定x轴刻度 plt.yticks([-1,-0.5,0,0.5,1])## 确定y轴刻度 plt.plot(rad,np.sin(rad))## 添加sin曲线 plt.plot(rad,np.cos(rad))## 添加cos曲线 plt.legend(['sin','cos']) plt.savefig('sincos.png') plt.show()
三,pandas库部分
数据分析
pandas主要用于数据处理与分析。常见数据源为数据库数据,文本文件(一般文本和csv),Excel文件。
SQLAIchemy连接MySQL的代码(需要下载pymysql)
from sqlalchemy import create_engine # 创建了engine连接器,用处:可以通过Python代码操作mysql数据库 engine = create_engine('mysql+pymysql://root:1234@127.0.0.1:\3306/testdb?charset=utf8') #创建一个mysql连接器,用户名为root,密码为1234,地址为127.0.0.1,数据库名称为testdb,编码为utf-8 print(engine)
1,读取数据库的数据
import pandas as pd ## 使用read_sql_query查看tesdb中的数据表数目 formlist = pd.read_sql_query('show tables', con = engine) print('testdb数据库数据表清单为:','\n',formlist) ## 使用read_sql_table读取订单详情表 detail1 = pd.read_sql_table('meal_order_detail1',con = engine) print('使用read_sql_table读取订单详情表的长度为:',len(detail1)) ## 使用read_sql读取订单详情表 detail2 = pd.read_sql('select * from meal_order_detail2', con = engine) print('使用read_sql函数+sql语句读取的订单详情表长度为:',len(detail2)) detail3 = pd.read_sql('meal_order_detail3',con = engine) print('使用read_sql函数+表格名称读取的订单详情表长度为:',len(detail3))
2,读取文本文件数据
## 使用read_table读取订单信息表 order = pd.read_table('./data/meal_order_info.csv',sep = ',',encoding = 'gbk') print('使用read_table读取的订单信息表的长度为:',len(order)) ## 使用read_csv读取订单信息表 order1 = pd.read_csv('./data/meal_order_info.csv',encoding = 'gbk') print('使用read_csv读取的订单信息表的长度为:',len(order1))
3,读取excel文件数据
## 读取user.xlsx文件 userInfo = pd.read_excel('./data/users.xlsx',sheetname = 'users1') print('客户信息表的长度为:',len(userInfo))
4,DataFrame:
loc方法是针对DataFrame索引名称的切片(不是索引名则无法执行)。闭区间
name.loc[行索引名称或条件,列索引名称] (格式)
iloc方法是接收行索引和列索引的位置(数字)。开区间
name.iloc[行索引位置,列索引位置](格式)
from sqlalchemy import create_engine import pandas as pd engine = create_engine('mysql+pymysql://root:1234@127.0.0.1:\3306/testdb?charset=utf8') ### 创建数据库连接 detail= pd.read_sql_table('meal_order_detail1',con = engine) #读取表中数据给detail print('订单详情表的索引为:', detail.index) print('订单详情表的所有值为:','\n', detail.values) print('订单详情表的列名为:','\n', detail.columns) print('订单详情表的数据类型为:','\n', detail.dtypes) print('订单详情表的元素个数为:', detail.size)## 查看DataFrame的元素个数 print('订单详情表的形状为:', detail.shape) ## 查看DataFrame的形状 print('订单详情表的维度数为:', detail.ndim) ## 查看DataFrame的维度数 ## 访问DataFrame单列的多行数据(orderInfo) order_id = detail['order_id'] print('订单详情表中的order_id的形状为:','\n',order_id.shape) # 访问DataFrame多列的多行数据 orderDish = detail[['order_id','dishes_name']][:5] print('订单详情表中的order_id和dishes_name前5个元素为:','\n',orderDish) #相对DataFrame索引名切片loc与iloc更加灵活 #使用loc和iloc实现单列切片 dishes_name1 = detail.loc[:,'dishes_name'] #取出dishes_name列 print('使用loc提取dishes_name列的size为:', dishes_name1.size) dishes_name2 = detail.iloc[:,3] print('使用iloc提取第3列的size为:', dishes_name2.size) #使用loc和iloc实现多列切片 orderDish1 = detail.loc[:,['order_id','dishes_name']] print('使用loc提取order_id和dishes_name列的size为:', orderDish1.size) orderDish2 = detail.iloc[:,[1,3]] print('使用iloc提取第1和第3列的size为:', orderDish2.size) #使用loc和iloc实现综合行列切片 print('列名为order_id和dishes_name的行名为3的数据为:\n',detail.loc[3,['order_id','dishes_name']]) print('列名为order_id和dishes_name行名为2,3,4,5,6的数据为:\n',detail.loc[2:6,['order_id','dishes_name']]) print('列位置为1和3行位置为3的数据为:\n',detail.iloc[3,[1,3]]) print('列位置为1和3行位置为2,3,4,5,6的数据为:\n',detail.iloc[2:7,[1,3]]) ## loc内部传入表达式(根据数据列值切片) print('detail中order_id为458的dishes_name为:\n',detail.loc[detail['order_id']=='458',['order_id','dishes_name']]) print('detail中order_id为458的第1,5列数据为:\n',detail.iloc[detail['order_id']=='458',[1,5]]) #为DataFrame增添新列非定值 detail['payment'] = detail['counts']*detail['amounts'] print('detail新增列payment的前五行为:','\n',detail['payment'].head())
数据预处理
1,数据合并
横向堆叠:使用concat函数(pandas.concat(参数名称=选项))以下为常用参数
参数名称 说明
objs 接收多个Series,DataFrame,Panel的组合参与连接的pandas对象列表组合
axis 0表示横向拼接,1表纵向拼接
join inner其他轴向的索引按交集,outer其他轴向的索引按并集
join_axes 接收index,其他n-1条轴向索引,不再执行并集或者交集运算
ignore_index 接收boolean类型,是否保留连接轴上的索引,默认不保留
keys 接收sequence,用于形成连接轴向上的层次化索引
leves 指定用作层次化索引和各级别索引
names 在设置了keys和leves参数后,用于创建分层级别名称。
verify_integrity 接收boolean,检查新连接轴是否有重复项,如果有则报异常
例:
import numpy as np import pandas as pd from sqlalchemy import create_engine conn = create_engine('mysql+pymysql://root:1234@\ 127.0.0.1:3306/testdb?charset=utf8') detail1 = pd.read_sql('meal_order_detail1',conn) df1 = detail1.iloc[:,:10] ##取出detail1的前10列数据 df2 = detail1.iloc[:,10:] ##取出detail1的后9列数据 print('合并df1的大小为%s,df2的大小为%s。'%(df1.shape,df2.shape)) print('外连接合并后的数据框大小为:',pd.concat([df1,df2], axis=1,join='inner').shape) print('内连接合并后的数据框大小为:',pd.concat([df1,df2], axis=1,join='outer').shape)
纵向堆叠:(使用append方法,concat时axis=0)append需要表列名完全相同
参数名称 说明
other 接收DataFrame或者Series,表添加新数据
ignore_index 接收boolean,Ture则对新生成的DataFrame使用新索引
verify_integrity 接收boolean,会检查添加的数据索引是否冲突,冲突则失败。
例:
print('堆叠前df3的大小为%s,df4的大小为%s。'%(df3.shape,df4.shape)) print('append纵向堆叠后的数据框大小为:',df3.append(df4).shape) #堆叠前df3(1500,19),df4(1279,19) #堆叠后大小(2779,19)
2,数据清洗
数据去重
方法一:用列表(list)去重
方法二:用集合(set)元素唯一性去重
方法三:利用drop_duplicates去重。
drop_duplicates常用参数及说明
subset 接收string或sequence,表示进行去重的列
keep 接收string去重时保留第几个数据。first保留第一个,last保留最后一个False不保留
inplace 是否在原表上进行操作
(数据去重)例:
import pandas as pd detail = pd.read_csv('./data/detail.csv',index_col=0,encoding = 'gbk') ##方法一 ##定义去重函数 def delRep(list1): list2=[] for i in list1: if i not in list2: list2.append(i) return list2 ## 去重 dishes=list(detail['dishes_name']) ##将dishes_name从数据框中提取出来 print('去重前菜品总数为:',len(dishes)) dish = delRep(dishes) ##使用自定义的去重函数去重 print('方法一去重后菜品总数为:',len(dish)) ##方法二 print('去重前菜品总数为:',len(dishes)) dish_set = set(dishes) ##利用set的特性去重 print('方法二去重后菜品总数为:',len(dish_set)) ##方法三对dishes_name去重 dishes_name = detail['dishes_name'].drop_duplicates() print('drop_duplicates方法去重之后菜品总数为:',len(dishes_name))
检测与处理缺失值:
方法一:删除法(dropna)
参数名称 说明
axic 0为删除行,1为删除列
how any表有缺省值就删除,all仅当全缺省才删除,(默认为any)
subset 进行去重的行列,默认时有所行列
inplace 是否在原表操作
例:
print('去除缺失的列前detail的形状为:', detail.shape) print('去除缺失的列后detail的形状为:',detail.dropna(axis = 1,how ='any').shape)
方法二:替换法(fillna)
参数名称 说明
value 表示用来替换缺失值的值
method 取值为backfill用下一个非缺省值替补,取值为pad用上一个非缺省值替补
axis 0为横轴,1为纵轴
inplace 是否在原表操作
limit 替换缺省值的上限个数
例:
detail = detail.fillna(-99) print('detail每个特征缺失的数目为:\n',detail.isnull().sum())
方法三:插值法(Scipy interpolate拟合曲线插值)
例:
## 线性插值 import numpy as np from scipy.interpolate import interp1d x=np.array([1,2,3,4,5,8,9,10]) ##创建自变量x y1=np.array([2,8,18,32,50,128,162,200]) ##创建因变量y1 y2=np.array([3,5,7,9,11,17,19,21]) ##创建因变量y2 LinearInsValue1 = interp1d(x,y1,kind='linear') ##线性插值拟合x,y1 LinearInsValue2 = interp1d(x,y2,kind='linear') ##线性插值拟合x,y2 print('当x为6、7时,使用线性插值y1为:',LinearInsValue1([6,7])) print('当x为6、7时,使用线性插值y2为:',LinearInsValue2([6,7])) ## 拉格朗日插值 from scipy.interpolate import lagrange LargeInsValue1 = lagrange(x,y1) ##拉格朗日插值拟合x,y1 LargeInsValue2 = lagrange(x,y2) ##拉格朗日插值拟合x,y2 print('当x为6,7时,使用拉格朗日插值y1为:',LargeInsValue1([6,7])) print('当x为6,7时,使用拉格朗日插值y2为:',LargeInsValue2([6,7])) ##样条插值 from scipy.interpolate import spline ##样条插值拟合x,y1 SplineInsValue1 = spline(x,y1,xnew=np.array([6,7])) ##样条插值拟合x,y2 SplineInsValue2 = spline(x,y2,xnew=np.array([6,7])) print('当x为6,7时,使用样条插值y1为:',SplineInsValue1) print('当x为6,7时,使用样条插值y2为:',SplineInsValue2)
四,scikit-learn库(机器学习算法)
model_selection模型选择模块,preprocessing数据预处理模块,decompisition特征分解模块
以上三模块,能实现数据预处理,标准化,二值化,数据集分割,交叉验证,PCA降维
sklearn一般分析步骤
1,加载detasets中的数据集.
from sklearn.datasets import load_breast_cancer #导入相应库
字典 键 data, target ,target_name ,pescr
datasets模块集成了部分数据分析的经典数据集。以下为主要加载函数
数据集加载函数 数据集任务类型 load_boston 回归 fetch_california_housing 回归 load_digits 分类 load_breast_cancer 分类,聚类 load_iris 分类,聚类 load_wine 分类 加载数据集示例:
from sklearn.datasets import load_breast_cancer #数据导入 cancer = load_breast_cancer()##将数据集赋值给cancer变量 print('breast_cancer数据集的长度为:',len(cancer)) print('breast_cancer数据集的类型为:',type(cancer)) cancer_data = cancer['data'] print('breast_cancer数据集的数据为:','\n',cancer_data) cancer_target = cancer['target'] ## 取出数据集的标签 print('breast_cancer数据集的标签为:\n',cancer_target) cancer_names = cancer['feature_names'] ## 取出数据集的特征名 print('breast_cancer数据集的特征名为:\n',cancer_names) cancer_desc = cancer['DESCR'] ## 取出数据集的描述信息 print('breast_cancer数据集的描述信息为:\n',cancer_desc)
2,分类数据集
from sklearn.modal selection import train_test_split
一般都会将数据分为训练集,验证集,测试集。
train_test_split函数(数据较少的时用于数据拆分)
train_test_split函数参数说明 参数名 说明 test_size 接收float,int类型数据,代表测试集大小float在0~1之间 train_size 接收float,int类型数据,代表训练集大小。 random_state 随机种子编号,相同的种子产生相同的随机结果 shuffle 代表是否有放回抽样 stratify 接收array或None,不为None则传入标签进行分层抽样。 示例代码:
print('原始数据集数据的形状为:',cancer_data.shape) print('原始数据集标签的形状为:',cancer_target.shape) from sklearn.model_selection import train_test_split cancer_data_train, cancer_data_test,\ cancer_target_train, cancer_target_test = \ train_test_split(cancer_data, cancer_target, test_size=0.2, random_state=42) print('训练集数据的形状为:',cancer_data_train.shape) print('训练集标签的形状为:',cancer_target_train.shape) print('测试集数据的形状为:',cancer_data_test.shape) print('测试集标签的形状为:',cancer_target_test.shape)
3,数据分析
from sklearn.prepraessing import minmax scaler
fit 生成规划树
tranform 应用规则
4,数据降维
from sklearn.decompisition import PCA
5,聚类,非监督学习
from sklearn.cluster import kmeans
fit 生成规则
predic 预测
6,可视化查看聚类结果
from sklearn.manifold import TSNE
7,评价聚类模型
form sklean.metrics import explained_variance_score
未完!
python数据分析具体上机操作往这走python数据分析上机