一、数据分析概念
广义的数据分析包括狭义数据分析和数据挖掘。
1、狭义数据分析是指根据分析目的,采用对比分析、分组分析、回归分析等分析方法,对收集来的数据进行处理与分析,取得有价值的信息,发挥数据的作用,得到一个特征统计量的过程。
2、数据挖掘是从大量的、不完全的、有噪声的、模糊的、随机的实际应用数据中,通过应用聚类,分类,回归和关联规则等技术,挖掘潜在的价值过程。
3、典型数据分析流程
需求分析-数据获取-数据预处理-分析与建模-模型评价与优化-部署
4、主流的数据分析语言:R、Python、MATLAB
| R | Python | MATLAB |
语言学习难易程度 | 入门难度低 | 入门难度一般 | 入门难度一般 |
使用场景 | 数据分析,数据挖掘,机器学习,数据可视化等。 | 数据分析,机器学习,矩阵运算,科学数据可视化,数字图像处理,web应用,网络爬虫,系统运维等。 | 矩阵计算,数值分析,科学数据可视化,机器学习,符号计算,数字图像处理,数字信号处理,仿真模拟等。 |
第三方支持 | 拥有大量的Packages,能够调用C,C++,Fortran,Java等其他程序语言。 | 拥有大量的第三方库,能够简便地调用C,C++,Fortran,Java等其他程序语言。 | 拥有大量专业的工具箱,在新版本中加入了对C,C++,Java的支持。 |
流行领域 | 工业界≈学术界 | 工业界>学术界 | 工业界≤学术界 |
软件成本 | 开源免费 | 开源免费 | 商业收费 |
使用python数据分析包括以下五个优势:
①语法简单精炼②拥有强大的库③功能强大④不仅适用于研究和原型构件,同时也适用于构建生产系统⑤python是一种胶水语言
二、Numpy
1、简介
是一个开源的pthon科学计算库,是一个由多维数组对象和用于处理数组的例程集合组成的库。
①数值计算,使用numpy可以直接对数组和矩阵进行操作
②numpy中数组的存储效率和输入输出性能远远优于python中等价的基本数据结构
③大部分代码是c语言写的
④通常与Scipy和Matplotlib一起使用
⑤开源
Numpy提供了两种基本对象:
①ndarray:多维数组对象
②ufunc:对数组进行处理的函数
2、数组属性
import numpy as np # 导入NumPy库
arr=np.array([[1,2,3,4],[7,5,6,8]])#创建数组
#①表示数组维数
arr.ndim
#②数组形状几行几列,也可以用于更改数组形状(前提是个数得一样)
arr.shape
#③数组的大小,共有几个元素
arr.size
arr_a.shape=3,2
#数组元素类型
arr.dtype
#数组每个元素的大小(字节为单位)
arr.itemsize
3、数组的创建
numpy.array(object, dtype=None, copy=True, order='K',subok=False,ndmin=0)
#object表示接收的数组,dtype表示所需的数据类型,ndimin表示数组应具有的最小维度
#创建特殊的数组
#①一维数组
print('使用 arange 函数创建的数组为:\n',np.arange(0,1,0.1))
#如果要创建多维数组
print('新的一维数组为:',arr.reshape(3,4)) #设置数组的形状
#使用 arange 函数创建的数组为:
# [0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]注意是左闭右开
#②等差数组
print('使用 linspace 函数创建的数组为:',np.linspace(0, 1, 12))
#③等比数组
print('使用logspace函数创建的数组为:',np.logspace(0, 2, 20))
#全为0
print('使用zeros函数创建的数组为:',np.zeros((2,3)))
#主对角线为1.其余是0
print('使用eye函数创建的数组为:',np.eye(3))
#主对角线为1,2,3,4,其余是0
print('使用diag函数创建的数组为:',np.diag([1,2,3,4]))
#全为1
print('使用ones函数创建的数组为:',np.ones((5,3)))
#创建一个未初始化的数组
arr = np.empty((2, 3))
#使用mat创建,以及bmat合成
matr1 = np.mat("1 2 3;4 5 6;7 8 9")
matr2 = np.matrix([[123], [456], [789]])
print('合成矩阵为:', np.bmat("matr1 matr2; matr1 matr2"))
matr1为:
[[1 2 3]
[4 5 6]
[7 8 9]]
matr2为:
[[123]
[456]
[789]]
合成矩阵为:
[[ 1 2 3 123]
[ 4 5 6 456]
[ 7 8 9 789]
[ 1 2 3 123]
[ 4 5 6 456]
[ 7 8 9 789]]
random模块常用随机数生成函数:
函数 | 说明 |
seed | 确定随机数生成器的种子。 |
permutation | 返回一个序列的随机排列或返回一个随机排列的范围。 |
shuffle | 对一个序列进行随机排序。 |
binomial | 产生二项分布的随机数。 |
normal | 产生正态(高斯)分布的随机数。 |
beta | 产生beta分布的随机数。 |
chisquare | 产生卡方分布的随机数。 |
gamma | 产生gamma分布的随机数。 |
uniform | 产生在[0,1)中均匀分布的随机数。 |
4、数组的索引(注意:左闭右开)
arr2 = np.array([[1, 2, 3],
[4, 4, 5],
[6, 7, 7],
[8, 9, 10]])
result = arr2[3:5]
#输出的结果是 [8, 9, 10]
5、变换数组形态
arr = np.arange(12).reshape(3,4)
创建的二维数组为:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
print('数组展平后为:',arr.ravel())
数组展平后为: [ 0 1 2 3 4 5 6 7 8 9 10 11
print('数组展平为:',arr.flatten()) #横向展平
数组展平为: [ 0 1 2 3 4 5 6 7 8 9 10 11]
print('数组展平为:',arr.flatten('F')) #纵向展
数组展平为: [ 0 4 8 1 5 9 2 6 10 3 7 11
#转置
np.transpose(arr)
arr.T
#组合
print('使用hstack实现数组横向组合后为:', np.hstack((arr, arr1))) # 使用hstack函数实现数组横向组合
print('使用vstack实现数组纵向组合后为:', np.vstack((arr, arr1))) # 使用vstack函数实现数组纵向组合
print('使用concatenate实现数组横向组合后为:', np.concatenate((arr, arr1), axis=1)) # 使用concatenate函数实现数组横向组合
print('使用concatenate实现数组横向组合后为:', np.concatenate((arr, arr1), axis=0)) # 使用concatenate函数实现数组纵向组合
#分割
print('使用hsplit函数实现数组按列分割后为:', np.hsplit(arr, 2)) # 使用hsplit函数实现数组横向分割(按列)
print('使用vsplit函数实现数组按行分割后为:', np.vsplit(arr, 3)) # 使用vsplit函数实现数组纵向分割(按行)
print('使用split函数实现数组按列分割后为:', np.split(arr, 2, axis=1)) # 使用split函数实现数组横向分割
print('使用split函数实现数组按行分割后为:', np.split(arr, 3, axis=0)) # 使用split函数实现数组纵向分割
6、数组增删改查
①增
#append()函数该函数是在数组的末尾添加元素,该函数会返回一个新数组,而原数组不变
a = np.array([[1,2,3], [4,5,6]])
[[1 2 3]
[4 5 6]]
print('向数组添加元素:',np.append(a, [7, 8, 9]))
[1 2 3 4 5 6 7 8 9]
print(np.append(a, [[7,8,9]],axis = 0))
[[1 2 3]
[4 5 6]
[7 8 9]]
print(np.append(a, [[5,5,5],[7,8,9]],axis = 1))
[[1 2 3 5 5 5]
[4 5 6 7 8 9]]
②删
#delete()函数该函数返回从输入数组中删除指定子数组的新数组,原数组不变。如果未提供轴参数,则输入数组将展开。
a = np.arange(12).reshape(3,4)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
print('删除某个数:',np.delete(a,5))
删除某个数: [ 0 1 2 3 4 6 7 8 9 10 11]
删除行
print(np.delete(a, 1, axis=0))
[[ 0 1 2 3]
[ 8 9 10 11]]
删除列
[[ 0 2 3]
[ 4 6 7]
[ 8 10 11]]
③去重
u = np.unique(a)
7、数组计算
ufunc函数的广播机制
print('矩阵相加为:', matr1 + matr2)
print('矩阵相减为:', matr1 - matr2)
print('矩阵相乘为:', matr1*matr2)
print('矩阵对应元素相乘为:', np.multiply(matr1, matr2))
np.random.seed(44) # 设置随机种子,方便结果复现
arr = np.random.randint(1, 10, size=10) # 生成随机数
print('创建的数组为:', arr)
创建的数组为: [5 4 2 4 1 5 4 9 8 8]
arr.sort() # 直接排序
print('排序后数组为:', arr)
排序后数组为: [1 2 4 4 4 5 5 8 8 9]
arr = np.random.randint(1,10, size=(3, 3)) # 生成3行3列的随机数
创建的数组为:
[[7 4 8]
[4 4 7]
[6 5 6]]
arr.sort(axis=1) # 沿着横轴排序
排序后数组为:
[[4 7 8]
[4 4 7]
[5 6 6]]
arr.sort(axis=0) # 沿着纵轴排序
排序后数组为:
[[4 4 6]
[4 6 7]
[5 7 8]]
print('排序后数组为:', arr.argsort()) # 返回值为重新排序值的下标
arr = np.random.randint(0, 10, size=(3,3))
print('创建的数组为:', arr)
print('重复后数组为:', arr.repeat(2, axis=0)) # 按行进行元素重复,重复两次
print('重复后数组为:', arr.repeat(2, axis=1)) # 按列进行元素重复,重复两次
函数 | 说明 |
sum | 计算数组的和 |
mean | 计算数组均值 |
std | 计算数组标准差 |
var | 计算数组方差 |
min | 计算数组最小值 |
max | 计算数组最大值 |
argmin | 返回数组最小元素的索引 |
argmax | 返回数组最小元素的索引 |
cumsum | 计算所有元素的累计和 |
cumprod | 计算所有元素的累计积 |
8、读写文件
#保存
np.save("../save_arr",arr)
#保存多个
np.savez("../save_arr",arr1,arr2)
#读取,不可以省略扩展名
np.load("../save_arr.npy")
#savetxt函数是将数组写到某种分隔符隔开的文本文件中
np.savetxt("../arr.txt", arr, fmt="%d", delimiter=",")
#loadtxt函数执行的是把文件加载到一个二维数组中
np.loadtxt("../arr.txt",delimiter=",")