机器学习——Day03
·
一、Numpy
1.Numpy优势
- Numpy是一个开源的Python科学计算库,用于快速处理任意维度的数组
- 支持常见的数组和矩阵操作
- 使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器
2.ndarray介绍
- NumPy提供了一个N维数组类型ndarray,它描述了相同类型的'items'的集合

3.ndarray和Python原生list的对比

4.ndarray的优势
4.1内存块风格
- ndarray在存储数据时,数据和地址都是连续的,这样就使得批量操作数组元素时速度更快
- ndarray中的所有元素的类型都是相同的,而Python列表中的元素类型是任意的,所以ndarray在存储元素时内存可以连续,而Python原生list就只能通过寻址方式找到下一个元素,这虽然导致了在通用性能方面Numpy的ndarray不及Python原生list,但在科学计算中,Numpy的ndarray可以省掉很多循环语句,代码使用方面比Python原生list简单的多。

4.2ndarray支持并行化运算(向量化运算)
4.3效率远高于纯Python代码
- Numpy底层使用C语言编写,内部除了GIL(全局解释器锁),其对数组的操作速度不受Python解释器的限制,所以效率远高于纯Python代码
5.ndarray的属性


6.ndarray的形状

7.ndarray的类型


二、Numpy基本操作
1.生成数组的方法
1.1生成0和1的数组
np.ones(shape[, dtype, order])
np.ones_like(a[, dtype, order, subok])
np.zeros(shape[, dtype, order])
np.zeros_like(shape[, dtype, order, subok])

1.2从现有数组生成
- 浅拷贝:相当于创建一个快捷方式
- 深拷贝:复制一份一模一样的文件
np.array(object[, dtype, copy, order, subok, ndim])
np.asarray(a[, dtype, order])

1.3生成固定数组
np.linspace(star, stop, num, endpoint)
## star:序列的起始值
## stop:序列的终止值
## num:生成等间隔多少个,默认为50
## endpoint:序列中是否包含stop值,默认为true
np.arang(star, stop, step, dtype)
## step:每间隔多少生成数据
np.logspace(star, stop, num)
## 生成以10的N次幂的数据
## num:要生成几个

1.4生成随机数组
1.4.1均匀分布
np.random.rand(d0,d1,...,dn)
## 返回[0.0,1.0]内的一组分布均匀的数

np.random.uniform(low=0.0, high=1.0, size=None)
## 功能:从一个均匀分布[low,high)中随机采样,注意定义域是左闭右开
## low:下界,float类型,默认值为0
## high:上界,float类型,默认值为1
## size:输出样本数量,为int或元组(tuple)类型
## 返回值:ndarray类型,其形状和参数size中描述一致

np.random.randint(low, high=None, size=None, dtype)
## 从一个均匀分布中随机采样,生成一个整数或N维整数数组,取数范围:若high不为None时,取[low,high)之间随机整数,否则取值[0,low)之间随机整数

## 生成均匀分布小案例
import numpy as np
import matplotlib.pyplot as plt
# 0.准备数据
x = np.random.uniform(-1, 1, 100000000)
# 1.画布
plt.figure(figsize=(20,8), dpi=100)
# 2.绘制
plt.hist(x, bins=1000)
# 3.显示
plt.show()

1.4.2正态分布
- 均值:决定图形的左右位置
- 方差:决定图形是瘦还是胖,值越小图形越瘦高数据越集中,值越大图形越矮胖数据越分散

np.random.randn(d0,d1,...,dn)
## 功能:从标准正态分布中返回一个或多个样本值

np.random.normal(loc=0.0, scale=1.0,size=None)
## loc:float,此概率分布的均值
## scal:float,此概率分布的标准差
## size:int or tuple of ints

np.random.standard_normal(size=None)
## 返回指定形状的标准正态分布的数组
# 生成正态分布小案例
import numpy as np
import matplotlib.pyplot as plt
# 0.准备数据
x = np.random.normal(1.75,1,10000000)
# 1.画布
plt.figure(figsize=(20,8), dpi=100)
# 2.绘制
plt.hist(x, bins=1000)
# 3.展示
plt.show()

2.数组的索引、切片
- 先对行进行索引,再进行列索引
- 高维数组索引,从宏观到微观
## 准备一只股票的涨幅数据
stock_change = np.random.normal(0,1,(8,10))
stock_change

2.1获取第一个股票的前3个交易日的涨跌幅数据
## 二维数组,两个维度
stock_change[0:2, 0:3] ## 前两行,前三列

2.2三维数组索引

3.形状修改
## 这里先修改一下stock_change内容使其后续的改变简单直观
stock_change.reshape([5,4])
结果:array([[ 2.2122037 , 0.10989197, 1.09698403, -0.21854044],
[ 1.89599321, 0.88034965, 0.62521371, 1.45474966],
[ 1.82033877, -0.37153039, 0.18331455, 0.25492944],
[-0.53461454, -0.38696423, -0.36788641, 0.72617972],
[-0.31884896, -2.23535446, -1.56658259, 0.88626681]])
- 在转换形状的时候,一定要注意数组元素的匹配
## 转换数组的形状
stock_change.reshape([4,5])
stock_change.reshape([-1,2]) ## -1表示不要求多少行,只要求有2列


stock_change.resize([5,4])

- reshape是产生了新变量,resize是改变了原来的数组形状
## 数组的转置
stock_change.T

4.类型修改
stock_change.astype(np.int32)

arr = np.array([ [[1,2,3],[4,5,6]],[[2,3,4],[5,6,7]] ])
arr.tobytes() ## 转换为bytes

5.数组去重
ndarray.unique

三、ndarray运算
1.逻辑运算




2.通用判断函数
stock_d = stock_change[0:2, 0:5]
np.all(stock_d > 0) # stock_d中全部值>0返回True
np.any(stock_d > 0) # stock_d中任意值>0返回True

3.np.where(三元运算符)
- np.where()
temp = stock_change[:4,:4]
np.where(temp>0, 1, 0) # temp>0赋值为1,否则赋值为0

- np.logical_and() 并
- np.logical_or() 与
# temp>0.5并且temp<1 赋值为1,否则赋值为0
np.where(np.logical_and(temp > 0.5, temp < 1), 1, 0)
#temp>0.5或temp<-0.5 赋值为1,否则为0
np.where(np.logical_or(temp>0.5, temp<-0.5),1, 0)

4.统计运算
4.1统计指标
- median 中位数
- mean 平均值
- std 标准差
- var 方差

4.2最大值
- 求的是全局中最大的数

- axis表示轴,一般情况下axis=0表示列,axis=1表示行
- 求的是每行中最大的数

# 返回最大值所在下标
np.argmax()
# 返回最小值所在下标
np.argmin()


四、矩阵
1.矩阵和向量
- 矩阵,英文matrix,和array的区别是矩阵必须是2维的,但是array可以是多维的

- 向量是一种特殊的矩阵,一般都是列向量,下图为三维列向量

2.加法和标量乘法

3.矩阵向量乘法
- (M行,N列)×(N行,L列)=(M行,L列)

4.矩阵乘法

5.矩阵乘法的性质
- 矩阵的乘法不满足交换律:A×B ≠ B×A
- 矩阵的乘法满足结合律:A×(B×C)=(A×B)×C
- 单位矩阵:是方阵,一般用I或E表示,从左上角到右下角的对角线(主对角线)上的元素均为1,其他元素均为0

6.逆、转置
6.1矩阵的逆

6.1.1待定系数法
6.1.2初等变换
6.2矩阵的转置


五、数组间运算
1.数组与数的运算
arr = np.array([[1,2,3,2,1,4],[5,6,1,2,3,1]])
arr + 1
arr / 2

2.广播机制
- 数组和数组间运算需要满足广播机制
- 让所有输入数组都向其中形状最长的数组看齐,形状中不足的部分都通过在前面加1补齐维度
- 输出数组的形状是输入数组形状的各个维度上的最大值
- 如果输入数组的某个维度和输出数组的对应维度的长度相同或者其长度为1时,这个数组能够用来计算,否则出错
- 当输入数组的某个维度的长度为1时,沿着此维度运算时都用此维度上的第一组值

4.矩阵运算
4.1矩阵乘法api
# 矩阵乘法 矩阵不可以和数字相乘
np.matmul
# 点乘 矩阵可以和数字相乘
np.dot


六、Pandas
1.Pandas介绍
- 2008年WestMcKinney开发的库
- 专门用于数据挖掘的开源Python库
- 以Numpy为基础,借力Numpy模块在计算方面性能高的优势
- 基于matplotlib,能够简便的画图
- 独特的数据结构
- 读取文件方便
import pandas as pd
import numpy as np
stock_change = np.random.normal(0,1,(10,5))
stock_change
stock_day_rise = pd.DataFrame(stock_change)
stock_day_rise
#给股票涨跌幅数据增加行索引
stock_code = ["股票{}".format(i+1) for i in range(stock_day_rise.shape[0])]
stock_code
pd.DataFrame(stock_change, stock_code)
#增加列索引
# data_range(star, end, periods, freq) periods:时间天数 freq:敌进单位,默认1天,'B'默认略过周末 end和periods任选一个就可以
date = pd.date_range(start="20260630", periods=stock_day_rise.shape[1], freq="B")
date
pd.DataFrame(stock_change, index=stock_code, columns=date)



2.DataFrame的属性
stock_c = pd.DataFrame(stock_change, index=stock_code, columns=date)
data.shape

# 行索引列表
data.index

# 列索引列表
data.columns

# 获取其中array的值
data.values

# 行列互换,转置
data.T

# 显示前几行内容,如果不补充参数,默认5行,填入参数n则显示前n行
data.head(n)

# 显示后几行内容,规则同head
data.tail(n)
3.DataFrame索引的设置
3.1修改行列索引值
stock_code = ["股票_{}".format(i+1) for i in range(stock_change.shape[0])]
# 必须整体全部修改
data.index = stock_code
# 以下修改方法错误
data.index[3] = "股票_3"


3.2重设索引
# 设置新的下标索引
reset_index(drop=False)
# drop:默认为False,不删除原来索引,如果为True,删除原来的索引值


3.3以某列值设置为新的索引
set_index(keys, drop=True)
# keys:列索引名称或列索引名称的列表
# drop:boolean,default True 当作新的索引,删除原来的列



4.基本数据操作

4.1索引操作
# 直接使用行列索引(先列后行)
data['open']['2018-02-27']
# 不支持的操作
data['2018-02-27']["open"]
# 不支持的操作
data[:1, :2]
-
结合loc或者iloc使用索引
-
data.loc
- data.iloc
# 获取从'2018-02-27':'2018-02-22','open'的结果
# 使用loc:只能指定行列索引的名字
data.loc['2018-02-27':'2018-02-22','open']
返回:2018-02-27 23.53
2018-02-06 22.80
2018-02-23 22.88
Name:open, dypt:float
# 使用iloc可以通过索引的下标去获取
# 获取前100填数据的'open'列的结果
data.iloc[0:100, 0:2].head()
返回: open high close low
2018-02-27 23.53 25.88 24.16 23.53
2018-02-26 22.80 23.78 23.53 22.80
2018-02-23 22.88 23.37 22.82 22.71
-
使用ix组合索引
# 获取行第一天到第四天,['open','close','high','low']
#使用ix进行下标和名称组合索引
data.ix[0:4, ['open','close','high','low']]
#推荐使用loc和iloc来获取的方式
data.loc[data.index[0:4], ['open','close','high','low']]
data.iloc[0:4, data.columns.get_indexer(['open','close','high','low'])]

4.2赋值操作
# 直接修改原来的值
data['close'] = 1
# 或者
data.close = 1
4.3排序
#根据内容进行索引
df.sort_values(by= , acscending= )
# by:根据什么元素排序
# 单个键或者多个键进行排序,默认升序
# ascending=False:降序
# ascending=True:升序


# 对索引进行排序
data.sort_index()

series.sort_values(ascending=True)

series.sort_index()

更多推荐




所有评论(0)