1. Numpy模块
1.1 Numpy介绍
1.1.1 主要功能
- ndarray:一个多维数组结构,高效且节省空间
- 无需循环对数组数据进行快速运算的数学函数
- 线性代数、随机数生成、傅里叶变换
1.1.2 ndarray——多维数组对象
- 创建ndarray:np.array(array_like)
- 数组与列表的区别:① 数组对象内的元素类型必须相同;② 数组大小不可修改
1.1.3 ndarray数据类型
数组中可以存放字符串类型的数据,但是一般都是存放数字,用于批量运算。
- 布尔型:bool_
- 整型:int_、int8、int16、int32、int64
- 无符号整型:uint8、uint16、uint32、uint64
- 浮点型:float_、float16、float32、float64
- 复数型:complex_、complex64、complex128
1.2 基本方法
1.2.1 创建数组
- array():将列表转换为数组,可选择显式指定dtype
- arange():range的numpy版,支持浮点数
- linspace():类似arange(),第三个参数为数组长度(画函数图像时常用)
- zeros():根据指定形状和dtype创建全0数组,默认类型为浮点数
- ones():根据指定形状和dtype创建全1数组
- empty():根据指定形状和dtype创建空数组(之前内存留的随机值)
- eye():根据指定边长和dtype创建单位矩阵
1.2.2 批量运算
- 数组和标量之间的运算:a+1、a*3、1//a、a**0.5、a>5
- 同样大小数组之间的运算:a+b、a/b、a**b、a%b、a==b
1.2.3 索引和切片
- 数组中不仅能用 a[3][5] 进行多维数组的索引,还可用 a[2,3] 进行索引
- 数组切片是新创建一个数组,列表切片并没有创建新的列表
- 二维数组进行切片时,a[0:2][0:2] 相当于对行进行了两次切片操作,a[0:2,0:2] 才是对行列都进行切片
1.2.4 布尔型索引
- 返回数组a中所有大于5的值组成的数组:a[a>5]
- 原理:将同样大小的布尔数组传进索引,会返回一个由所有True对应位置的元素的数组
- 返回数组a中大于5的偶数:a[(a>5)&(a%2==0)]
- 返回数组a中大于5的数和偶数:a[(a>5)|(a%2==0)]
1.2.5 花式索引
- 二维数组a,返回第一列和第三列 a[:,[1,3]]
- 二维数组a,返回第0行大于5的数 a[0,a>5]
- 二维数组a,a[[1,3],[1,3]] 返回的是第一列第一行的值,和第三列第三行的值。若想返回第一行和第三行,第一列和第三列组成的数组,需要多次索引 a[[1,3],:][:,[1:3]]
1.2.6 通用函数
指能同时对数组中所有元素进行运算的函数,在numpy库中进行调用(np.)
- 一元函数:abs、sqrt、exp、log、ceil(向上取整)、floor(向下取整)、rint/round(向外取整)、trunc(向零取整)、modf(将小数部分与整数部分分开为两个数组组成的元组)、isnan(nan时返回True)、isinf(inf时返回True)、cos、sin、tan
- 二元函数:add、substract、multiply、divide、power、mod、maximum、minimum
浮点数特殊值:
- nan(Not a Number):不等于任何浮点数,且 nan != nan,0/0返回nan
- inf(infinity):比任何浮点数都大,1/0返回inf
- Numpy中创建特殊值:np.nan、np.inf
- 在数据分析中,nan常被用作表示数据缺失值,a[~(np.isnan(a))]提取数组中非缺失值
1.2.7 数学和统计方法
方法直接通过对象进行调用(a.):sum、mean、std(标准差)、var(方差)、min、max、argmin、argmax
1.2.8 随机数生成
随机数函数在np.random子包内
- rand:给定形状产生随机数组(0到1之间的数)
- randint:给定形状产生随机整数
- choice:给定形状产生随机选择(从数组中随机选择n个数)
- shuffle:与random.shuffle相同(打乱数组)
- uniform:给定形状按平均分布产生随机数组
2. pandas模块
2.1 pandas简介
panda是个强大的Python数据分析工具包,是基于Numpy构建的,其主要功能有:
- 具备对其功能的数据结构DataFrame、Series
- 集成时间序列功能
- 提供丰富的数学运算和操作
- 灵活处理缺失数据
2.2 Series一维数据对象
2.2.1 Series介绍
- Series是一种类似于一维数组的对象,由一组数据和一组与之相关的数据标签(索引)组成
- 创建方式:① pd.Series(list);② pd.Series(list,index=list2);③ pd.Series(map);④ pd.Series(int,index=list)
- 获取值数组和索引数组:values属性和index属性
- Series类似列表和字典的结合体
2.2.2 Series使用特性
- Series支持array的特性:① 可从ndarray创建:Series(arr);② 可以同ndarray一样做标量运算、两个Series运算、索引、切片、布尔值过滤;③ 可用numpy的通用函数(np.)
- Series支持字典的特性:① 可从字典创建:Series(dic);② 可通过in运算判断Series中是否存在该键(index);③ 可通过标签对value进行索引 sr[‘a’]
- 对Series进行遍历时,得到的是value而不是标签(与字典不同)
- 通过标签对Series进行切片时,前后都包括(相比于用下标切片前包后不包)
- 如果Series中的标签是整型数据,则通过整数索引时是面向标签的 sr[1],使用Series的loc属性可将索引解释为标签 sr.loc[1],iloc属性可将索引解释为下标 sr.iloc[1]
- 数据对齐:对两个Series对象进行运算时,会按照标签对其进行计算。两个对象不共有的标签默认返回值为nan,可通过pd.(add、sub、div、mul)指定不存在标签的填充值。
- 对缺失数据(nan)进行处理:① 通过 sr[sr.notnull()] 或 sr.dropna() 删除缺失数据;② 通过 sr.fillna(0) 或 sr.fillna(sr.mean()) 填充缺失值。注意:处理后原Series对象本身不变,要用新对象进行接收
2.3 DataFrame二维数据对象
2.3.1 DataFrame介绍
- DateFrame是一个表格型的数据结构,含有一组有序的列,可以看做是由Series组成的字典,且共用行索引
- 创建方式:① pd.DataFrame({‘one’:list1,‘two’:list2});② pd.DataFrame({‘one’:sr1,‘two’:sr2})(Series中没有的标签返回nan)
- 从csv文件中读取和写入:df.read_csv(‘filename.csv’);df.to_csv()
2.3.2 DataFrame常用属性
- index:获取行索引
- columns:获取列索引
- T:转置
- values:获取值的二维数组
- describe():数据统计汇总(每列的均值、标准差等)
2.3.3 使用
- 索引:① df[‘one’][‘a’] 先列后行(不推荐使用);② df.loc[‘a’,‘one’] 按标签先行后列;③ df.iloc[1,2] 按位置先行后列
- 数据对齐:DataFrame对象在运算时,其行索引和列索引分别对齐
- df对象和sr对象处理缺失值基本相同,使用 dropna() 时,默认会将nan所在的一行全部删除;使用 dropna(how=‘all’),一行全为nan时才会删除;使用 dropna(axis=1) 删除列
- mean(axis=0.skipna=False):对列(行)求平均值(忽略缺失值)
- sum(axis=0):对列(行)求和
- sort_index(axis,…,ascending=False):对列(行)索引排序,默认降序
- sort_values(by,axis,ascending):按某一列(行)的值排序,nan统一放在最后
- 同样可使用numpy的通用函数
2.4 时间对象处理
2.4.1 时间对象类型
- 时间戳:特定时刻
- 固定时期:如2020年12月
- 时间间隔:起始时间——结束时间
- Python标准库处理时间序列对象:datetime —— datetime.datetime.strptime()
- 灵活处理时间对象:dateutil —— dateutil.parser.parse()
- 成组处理时间对象:pandas —— pd.to_datetime([list])
- 产生时间对象数组 :pd.date_range
2.4.2 pd.date_range主要参数
- start:开始时间
- end:结束时间
- periods:时间长度
- freq:时间频率,默认为D,可选H(our),W(eek),B(usiness),SM,T,S,A等
2.4.3 时间序列
- 时间序列就是以时间对象为索引的Series或DataFrame
- datetime对象作为索引时是存储在DatetimeIndex对象中的
- 时间序列可传入“年”或“年月”作为切片方式
- 时间序列可传入日期范围作为切片方式
- 使用 resample() 方法对时间序列重新采样
sr = pd.Series(np.arange(100), index=pd.date_range('2020-01-01', periods=100))
print(sr['2020-03']) # 输出index在2020年3月的切片
print(sr['2020-03':'2020-04']) # 输出index在2020年3月到4月的切片
print(sr.resample('M').sum()) # 求每月的value和
2.5 文件处理
2.5.1 使用
- 数据完成的常用格式为 .csv,以某间隔符分割数据
- pandas可从文件名、URL、文件对象中加载数据
- read_csv:默认分隔符为逗号
- read_table:默认分隔符为制表符
- to_csv:写入到csv文件
- 使用 read_excel 读取excel文件时需要下载 xlrd 模块
2.5.2 read_csv、read_table主要参数(pandas中的函数)
- sep:指定分隔符,可用正则表达式,如’\s+'表示任意长度的空字符
- header=None:指定文件无列名
- name:指定列名
- index_col:指定某列作为索引
- skip_row:跳过某些行
- na_values:指定某些字符串表示缺失值
- parse_dates:指定某些列是否被解析为日期,类型为布尔值或列表
pd.read_csv('1234.csv', index_col='date') # 将date列作为行索引,默认第一行为列索引
pd.read_csv('1234.csv', header=None, names=list('abcde')) # 将abcde分别作为列索引
pd.read_csv('1234.csv', header=None, skiprows=[1, 2, 3]) # 跳过123行
pd.read_csv('1234.csv', header=None, na_values=['None', 'nan']) # 指定缺失值形式
pd.read_csv('1234.csv', index_col='date', parse_dates=True) # 将文件中所有时间类字符串转换为时间对象
pd.read_csv('1234.csv', index_col='date', parse_dates=['date']) # 将date列转换为时间对象
2.5.3 to_csv主要参数(DataFrame的方法)
- sep:指定文件分隔符
- na_rep:指定缺失值转换的字符串,默认为空字符串
- header=False:不输出列索引一行
- index=False:不输出行索引一列
- columns:指定输出的列传入列表
3. Matplotlib模块
3.1 介绍
- Matplotlib是一个强大的Python绘图和数据可视化的工具包
- 引用方法:import matplotlib.pyplot as plt
- 绘图函数:plt.plot() 绘制折线图
- 显示图像:plt.show()
3.2 plot函数
3.2.1 plot可用参数
与Matlab中的plot函数相同:Matlab常用函数
3.2.2 基本使用
- 在一个坐标轴中画多条折线:多次调用 plot() 后再调用 show()
- 设置图像标题:plt.title(“my plot”)
- 设置x轴、y轴名称:plt.xlabel(“x轴”)
- 设置x轴、y轴范围:plt.xlim(0,5)
- 设置x轴、y轴刻度:plt.xticks([0,2,4]) 刻度只显示传入的值;plt.xticks([0,2,4],[‘a’,‘b’,‘c’]) 将刻度替换为给定值
- 设置曲线图例:plt.legend() 可配合plot中的label参数使用,显示曲线对应的label值
- 对于DataFrame或Series对象,直接调用 df.plot() 可绘制每列的折线图
3.2.3 画布与子图
- 创建画布figure:fig=plt.figure()
- 向画布上添加子图subplot:ax1=fig.add_subplot(2,2,1)
- 在子图上绘制:ax1.plot()
- 调整子图间距:subplots_adjust(left,bottom,right,top,wspace,hspace)
- 显示画布上的图像:plt.show() 或 fig.show()
3.3 绘制其他类型图
- plt.plot(x,y,fmt,…):坐标图
- plt.boxplot(data,notch,position):箱线图
- plt.bar(left,height,width,bottom):条形图
- plt.barh(width,bottom,left,height):横向条形图
- plt.polar(theta,r):极坐标图
- plt.pie(data,explode):饼图
- plt.psd(x,NFFT=256,pad_to,Fs):功率谱密度图
- plt.specgram(x,NFFT=256,pad_to,F):谱图
- plt.cohere(x,y,NFFT=256,Fs):X-Y相关性函数
- plt.scatter(x,y):散点图
- plt.step(x,y,where):步阶图
- plt.hist(x,bins,normed):直方图
3.4 绘制K线图
- mplfinance包中有许多绘制金融相关图的函数接口:mplfinance函数
- 绘制K线图:mplfinance.polt(df,type=‘candle’) 函数
- 绘制K线图时,行名需要为时间戳,列名需要有Open、High、Low、Close、Volume五列
daily = pd.read_csv('mydata.csv', index_col=0, parse_dates=True)
mpf.plot(daily,type='candle')