python数据分析

目录

一,NumPy库部分

1.1numpy基本数据类型:

1.2数组用法(array)

二,Matplotlib库部分

2.1 pyplot创建画布函数与选中子图函数

2.2pyplot常用标签列名图例函数

2.3保存与展示函数

三,pandas库部分

数据分析

1,读取数据库的数据

2,读取文本文件数据

3,读取excel文件数据

4,DataFrame:

数据预处理

1,数据合并

2,数据清洗

四,scikit-learn库(机器学习算法)

sklearn一般分析步骤

1,加载detasets中的数据集.

2,分类数据集

3,数据分析

4,数据降维

5,聚类,非监督学习

6,可视化查看聚类结果

7,评价聚类模型


本文章主讲:

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数据分析上机

  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值