1-python数据分析-数据分析介绍、数据分析三剑客之NumPy
什么是数据分析
- 是把隐藏在一些看似杂乱无章的数据背后的信息提炼出来,总结出所研究对象的内在规律
- 使得数据的价值最大化
- 分析用户的消费行为
- 制定促销活动的方案
- 制定促销时间和粒度
- 计算用户的活跃度
- 分析产品的回购力度
- 分析广告点击率
- 决定投放时间
- 制定广告定向人群方案
- 决定相关平台的投放
- ......
- 分析用户的消费行为
- 使得数据的价值最大化
- 数据分析是用适当的方法对收集来的大量数据进行分析,帮助人们做出判断,以便采取适当的行动
- 保险公司从大量赔付申请数据中判断哪些为骗保的可能
- 支付宝通过从大量的用户消费记录和行为自动调整花呗的额度
- 短视频平台通过用户的点击和观看行为数据针对性的给用户推送喜欢的视频
为什么学习数据分析
- 有岗位的需求
- 数据竞赛平台
- 是Python数据科学的基础
- 是机器学习课程的基础
数据分析实现流程
- 提出问题
- 准备数据
- 分析数据
- 获得结论
- 成果可视化
课程内容介绍
- 基础模块使用学习
- 项目实现
- 金融量化
开发环境介绍
- anaconda
- 官网:https://www.anaconda.com/
- 集成环境:集成好了数据分析和机器学习中所需要的全部环境
- 注意:
- 安装目录不可以有中文和特殊符号
- 注意:
- jupyter
- jupyter就是anaconda提供的一个基于浏览器的可视化开发工具
- jupyter的基本使用
- 启动:在终端中录入:jupyter notebook的指令,按下回车
- 新建:
- python3:anaconda中的一个源文件
- cell有两种模式:
- code:编写代码
- markdown:编写笔记
- 快捷键:
- 添加cell:a或者b
- 删除:x
- 修改cell的模式:
- m:修改成markdown模式
- y:修改成code模式
- 执行cell:
- shift+enter
- tab:自动补全
- 代开帮助文档:shift+tab
数据分析三剑客
- numpy
- pandas(重点)
- matplotlib
numpy模块
NumPy(Numerical Python) 是 Python 语言中做科学计算的基础库。侧重在于数值计算,也是大部分Python科学计算库的基础,多用于在大型、多维数组上执行的数值运算。
重点
- numpy数组的创建
- numpy索引和切片
- 级联
- 变形
- 矩阵的乘法和转置
- 常见的聚合函数+统计
numpy的创建
- 使用np.array()创建
- 使用plt创建
- 使用np的routines函数创建
使用np.array()创建
# 用array()创建一个一维数组 import numpy as np np.array([1,2,3,4,5]) # array([1, 2, 3, 4, 5]) # 使用array()创建一个多维数组 np.array([[1,2,3],[4,5,6]]) array([[1, 2, 3], [4, 5, 6]])
数组和列表的区别是什么?
- 数组中存储的数据元素类型必须是统一类型
- 优先级:
- 字符串 > 浮点型 > 整数
np.array([1.1,'哈哈',11]) # array(['1.1', '哈哈', '11'], dtype='<U32') np.array([1,5,6.1,8]) # array([1. , 5. , 6.1, 8. ])
将外部的一张图片读取加载到numpy数组中,然后尝试改变数组元素的数值查看对原始图片的影响
import matplotlib.pyplot as plt # imread可以返回一个numpy数组 img_arr = plt.imread('./1.jpg') # 将返回的数组的数据进行图像的展示 plt.imshow(img_arr) # imshow也可以将一个二维数组进行图片展示规 plt.imshow(img_arr + 100)
zeros()、ones()、linespace()、arange()、random系列
# ones zeros()与ones()相似 np.ones(shape=(3,4)) # 返回一个3行4列的np数组,元素都是1., zeros是0. array([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]]) # linspace返回一维形式的等差数列 开始 ,结束,一共8个元素 np.linspace(0, 50, num=8) array([ 0. , 7.14285714, 14.28571429, 21.42857143, 28.57142857, 35.71428571, 42.85714286, 50. ]) #arange返回一维形式的等差数列 np.arange(0,50,5) array([ 0, 5, 10, 15, 20, 25, 30, 35, 40, 45]) #random.randint 返回指定形状的随机整数数组 np.random.randint(0,20,size=(4,5)) array([[ 3, 1, 16, 14, 1], [18, 13, 10, 14, 18], [19, 19, 1, 8, 13], [15, 2, 17, 15, 6]]) #random.random 随机范围0-1 np.random.random(size=(2, 2)) array([[0.16654448, 0.59399791], [0.6076535 , 0.89254046]])
numpy的常用属性
- shape 形状
- ndim 维度
- size 元素总个数
- dtype 元素的数据类型
img_arr.shape # 返回数组形状 (500, 500, 3) img_arr.ndim # 返回数组维度 3 img_arr.size # 返回数组元素总个数 750000 img_arr.dtype # 返回数组元素的数据类型 dtype('uint8') type(img_arr) # 返回数组的数据类型 numpy.ndarray
numpy的数据类型
- array(dtype=?):可以设定数据类型
- arr.dtype = '?':可以修改数据类型
- arr.astype('?'):也可以修改数据类型
修改数据类型
arr = np.array([1,2,3], dtype='float16') array([1., 2., 3.], dtype=float16) #1、修改arr元素的数据类型 arr.astype('int8') array([1, 2, 3], dtype=int8) #2、修改arr元素的数据类型 arr.dtype='float16' array([1., 2., 3.], dtype=float16)
numpy的索引和切片操作(重点)
索引取值操作
索引取值操作和列表同理
arr = np.random.randint(0,100,size=(5,6)) array([[21, 36, 62, 40, 52, 54], [91, 45, 40, 35, 17, 98], [48, 49, 36, 59, 47, 36], [80, 66, 77, 21, 1, 80], [18, 32, 55, 0, 32, 12]]) arr[3][4] 1 arr[0,4] 52
切片操作
- 切出前两行数据
- 切出前两列数据
- 切出前两行的前两列的数据
- 数组数据翻转
- 练习:将一张图片上下左右进行翻转操作
- 练习:将图片进行指定区域的裁剪
# 切出数组的前两行的数据 arr[0:2] array([[21, 36, 62, 40, 52, 54], [91, 45, 40, 35, 17, 98]]) # 切出数组的前两列 arr[:,0:2] array([[21, 36], [91, 45], [48, 49], [80, 66], [18, 32]]) #切出数组前两行的前两列 arr[0:2, 0:2] array([[21, 36], [91, 45]]) # 将数组行倒置 arr[::-1] array([[18, 32, 55, 0, 32, 12], [80, 66, 77, 21, 1, 80], [48, 49, 36, 59, 47, 36], [91, 45, 40, 35, 17, 98], [21, 36, 62, 40, 52, 54]]) # 将数组列倒置 arr[::,::-1] array([[54, 52, 40, 62, 36, 21], [98, 17, 35, 40, 45, 91], [36, 47, 59, 36, 49, 48], [80, 1, 21, 77, 66, 80], [12, 32, 0, 55, 32, 18]]) # 将数组进行行列导倒置 arr[::-1,::-1] array([[12, 32, 0, 55, 32, 18], [80, 1, 21, 77, 66, 80], [36, 47, 59, 36, 49, 48], [98, 17, 35, 40, 45, 91], [54, 52, 40, 62, 36, 21]])
将图片进行翻转
import matplotlib.pyplot as plt img_arr = plt.imread('./1.jpg') plt.imshow(img_arr) img_arr.shape (500, 500, 3) # 前俩个是图片像素,最后一个是颜色维度 # 将图片左右翻转 plt.imshow(img_arr[:,::-1,:]) # 将图片上下翻转 plt.imshow(img_arr[::-1]) # 上下左右颜色都倒置 plt.imshow(img_arr[::-1,::-1,::-1]) # 图片的裁剪:将脸部数据裁剪下来 plt.imshow(img_arr[30:300,140:330,:])
变形 reshape
注意:变形前和变形后数组的容量不可以发生变化
arr.shape (5, 6) # 将二维数组变形成一维数组 reshape() arr_1 = arr.reshape((30,)) # 原数组一共有30个元素,所以这里必须是30 array([21, 36, 62, 40, 52, 54, 91, 45, 40, 35, 17, 98, 48, 49, 36, 59, 47, 36, 80, 66, 77, 21, 1, 80, 18, 32, 55, 0, 32, 12]) # 将一维数组变多维 arr_1 = arr.reshape((3,10)) # 给定一个值另一个可以用-1自动计算 array([[21, 36, 62, 40, 52, 54, 91, 45, 40, 35], [17, 98, 48, 49, 36, 59, 47, 36, 80, 66], [77, 21, 1, 80, 18, 32, 55, 0, 32, 12]]) arr_1 = arr.reshape((-1,10)) arr_1 = arr.reshape((3,-1)) array([[21, 36, 62, 40, 52, 54, 91, 45, 40, 35], [17, 98, 48, 49, 36, 59, 47, 36, 80, 66], [77, 21, 1, 80, 18, 32, 55, 0, 32, 12]])
级联操作 concatenate
级联的操作意义:将多个numpy数组进行横向或者纵向拼接
- axis轴向的理解
- 0:列 y轴方向,竖直方向
- 1:行 x轴方向,水平方向
- 问题:
- 级联的两个数组维度一样,但是行列个数不一样会如何?
#axis=0列和列进行拼接,axis=1行和行进行拼接 np.concatenate((arr,arr),axis=1) array([[21, 36, 62, 40, 52, 54, 21, 36, 62, 40, 52, 54], [91, 45, 40, 35, 17, 98, 91, 45, 40, 35, 17, 98], [48, 49, 36, 59, 47, 36, 48, 49, 36, 59, 47, 36], [80, 66, 77, 21, 1, 80, 80, 66, 77, 21, 1, 80], [18, 32, 55, 0, 32, 12, 18, 32, 55, 0, 32, 12]]) np.concatenate((arr,arr),axis=0) array([[21, 36, 62, 40, 52, 54], [91, 45, 40, 35, 17, 98], [48, 49, 36, 59, 47, 36], [80, 66, 77, 21, 1, 80], [18, 32, 55, 0, 32, 12], [21, 36, 62, 40, 52, 54], [91, 45, 40, 35, 17, 98], [48, 49, 36, 59, 47, 36], [80, 66, 77, 21, 1, 80], [18, 32, 55, 0, 32, 12]])
级联的两个数组维度一样,但是行列个数不一样会如何?
- 如果横向级联保证行数一致,纵向级联保证列数一致
- 注意:维度不一致的数组无法级联
arr_new = np.random.randint(0,100,size=(5,5)) array([[29, 43, 36, 67, 32], [63, 65, 31, 90, 55], [13, 59, 3, 3, 22], [55, 26, 10, 5, 80], [27, 20, 61, 75, 23]]) arr array([[21, 36, 62, 40, 52, 54], [91, 45, 40, 35, 17, 98], [48, 49, 36, 59, 47, 36], [80, 66, 77, 21, 1, 80], [18, 32, 55, 0, 32, 12]]) np.concatenate((arr,arr_new), axis=0) # 这样就会报错他俩列数不同 np.concatenate((arr,arr_new), axis=1) # 先写的数组元素在前 array([[21, 36, 62, 40, 52, 54, 29, 43, 36, 67, 32], [91, 45, 40, 35, 17, 98, 63, 65, 31, 90, 55], [48, 49, 36, 59, 47, 36, 13, 59, 3, 3, 22], [80, 66, 77, 21, 1, 80, 55, 26, 10, 5, 80], [18, 32, 55, 0, 32, 12, 27, 20, 61, 75, 23]])
图片的9宫格
img_arr3 = np.concatenate((img_arr,img_arr,img_arr),axis=1) img_arr9 = np.concatenate((img_arr3,img_arr3,img_arr3), axis=0) plt.imshow(img_arr9)
常用的聚合操作
- sum求和、max最大值、min最小值、mean均值
# sum求和、max最大值、min最小值、mean均值,它们4个用法一致 arr.sum() # 计算所有元素的和 1340 arr.sum(axis=0) # 计算每列元素的和 array([258, 228, 270, 155, 149, 280]) arr.sum(axis=1) # 计算每行元素的和 array([265, 326, 275, 325, 149])
常用的数学函数
- NumPy 提供了标准的三角函数及反三角函数:sin()、cos()、tan()
- numpy.around(a,decimals) 函数返回指定数字的四舍五入值。
- 参数说明:
- a: 数组
- decimals: 舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置
- 参数说明:
np.sin([3.5,4.6,2.1]) array([-0.35078323, -0.993691 , 0.86320937]) np.around([33.4,51.2,55.8]) # 默认decimals为0 array([33., 51., 56.]) np.around([33.4,51.2,55.8], decimals=1) #decimals=1保留一位小数 array([33.4, 51.2, 55.8]) np.around([33.4,51.2,55.8], decimals=-1) # decimals=-1个位数上四舍五入 array([30., 50., 60.])
常用的统计函数
- numpy.amin() 和 numpy.amax(),用于计算数组中的元素沿指定轴的最小、最大值。
- numpy.ptp():计算数组中元素最大值与最小值的差(最大值 - 最小值)极差。
- numpy.median() 函数用于计算数组 a 中元素的中位数(中值)
- 标准差std():标准差是一组数据平均值分散程度的一种度量。所有数据与均值的差的平方和除以元素个数开根号
- 公式:std = sqrt(mean((x - x.mean())**2))
- 如果数组是 [1,2,3,4],则其平均值为 2.5。 因此,差的平方是 [2.25,0.25,0.25,2.25],并且其平均值的平方根除以 4,即 sqrt(5/4) ,结果为 1.1180339887498949。
- 方差var():统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数,即 mean((x - x.mean())** 2)。换句话说,标准差是方差的平方根。
# 所有元素中位数 np.median(arr) 42.5 # 每列的中位数 np.median(arr,axis=0) array([48., 45., 55., 35., 32., 54.]) # 每行的中位数 np.median(arr,axis=1) array([46. , 42.5, 47.5, 71.5, 25. ]) # 数组所有元素的标准差 俩种写法 np.std(arr) 24.513035081133648 arr.std() 24.513035081133648 # 每列的标准差 俩种写法 np.std(arr, axis=0) array([29.78993118, 11.87602627, 14.92648653, 19.70786645, 18.90396784, 30.59411708]) arr.std(axis=0) array([29.78993118, 11.87602627, 14.92648653, 19.70786645, 18.90396784, 30.59411708]) # 每行的标准差 俩种写法 np.std(arr, axis=1) array([13.52056047, 29.75268429, 7.98783798, 31.41876651, 17.51586582]) arr.std(axis=1) array([13.52056047, 29.75268429, 7.98783798, 31.41876651, 17.51586582])
矩阵相关
- NumPy 中包含了一个矩阵库 numpy.matlib,该模块中的函数返回的是一个矩阵,而不是 ndarray 对象。一个 的矩阵是一个由行(row)列(column)元素排列成的矩形阵列。
- numpy.matlib.identity() 函数返回给定大小的单位矩阵。单位矩阵是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为 1,除此以外全都为 0。
转置矩阵
转置就是将原数据行变列,列变行
- .T
#转置就是将原始数据行变列,列变行 arr array([[21, 36, 62, 40, 52, 54], [91, 45, 40, 35, 17, 98], [48, 49, 36, 59, 47, 36], [80, 66, 77, 21, 1, 80], [18, 32, 55, 0, 32, 12]]) arr.T array([[21, 91, 48, 80, 18], [36, 45, 49, 66, 32], [62, 40, 36, 77, 55], [40, 35, 59, 21, 0], [52, 17, 47, 1, 32], [54, 98, 36, 80, 12]])
矩阵相乘
- numpy.dot(a, b, out=None)
- a : ndarray 数组
- b : ndarray 数组
- 第一个矩阵第一行的每个数字(2和1),各自乘以第二个矩阵第一列对应位置的数字(1和1),然后将乘积相加( 2 x 1 + 1 x 1),得到结果矩阵左上角的那个值3。也就是说,结果矩阵第m行与第n列交叉位置的那个值,等于第一个矩阵第m行与第二个矩阵第n列,对应位置的每个值的乘积之和。
- 线性代数基于矩阵的推导:
np.dot([[2,1],[4,3]],[[1,2],[1,0]]) array([[3, 4], [7, 8]])
重点
- numpy数组的创建
- numpy索引和切片
- 级联
- 变形
- 矩阵的乘法和转置
- 常见的聚合函数+统计