Python数据处理的三个类库-matplotlib+Numpy+Pandas

302 阅读7分钟

「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」。

1.1安装virualenv

用于为项目创建一个干净的第三方库

pip install virtualenv

#查看是否安装成功
virtualenv --version

1.2 安装virualenvwrapper

virualenvwrapper 更方便的使用virtualenv

#安装
pip install virtualenvwrapper-win

#创建虚拟环境
mkvirtualenv [环境名称]

#切换虚拟环境
workon [环境名称]

#退出虚拟环境
deactivate

#删除虚拟环境
rmvirtualenv [环境名称]

2. matplotlib

2.1 环境搭建

matplotlib==2.2.2
numpy==1.14.2
pandas==0.20.3 
TA_Lib==0.4.16 技术指标库
tables==3.4.2 读取大数据平台的文件
jupyter==1.0.0 数据分析与展示的平台

将上述文件保存至 requirements.txt文件中

#切换到虚拟环境,安装上面的包
workon matploblib

pip install -r requirements.txt

2.2 jupyter Notebook

web版的ipython

常用命令

#启动jupyter
jupyter notebook

2.3 matplotlib介绍

画图,用于开发2d图标 3d也可以,实现数据可视化

2.3.1 demo

2.3.1.2 简单demo

import matplotlib.pyplot as plt

#创建画布
plt.figure()
#画图
plt.plot([1,2,4,5,1],[2,5,7,100,10])
#显示图像
plt.show()

2.3.1.3 demo1

import random
#画出某个城市一个小时内的每一分钟的温度变化折线图
#准备数据
x = range(60)
y = [random.uniform(15,18) for i in x]

# 创建画布
plt.figure(figsize=(20,8),dpi = 80)
#画图
plt.plot(x,y)

#修改x轴刻度
plt.rcParams['font.sans-serif']=['SimHei']
x_lable = ["11点{}分".format(i) for i in range(60)]
plt.xticks(x[::5],x_lable[::5])
#修改y轴刻度
plt.yticks(range(40)[::5])
#修改x轴字段
plt.xlabel("时间")
#x修改y轴字段
plt.ylabel("温度")
#添加虚线网格
plt.grid(True,linestyle="--",alpha=0.5)

#修改画布标题
plt.title("温度变化曲线图")
#显示图像
plt.show()

2.3.2 结构

三层结构

2.3.2.1 容器层

  1. 画板层Canvas
  1. 画布层Figure plt.figure()
  1. 绘图区/坐标区Axes  plt.subplots()

2.3.2.2 辅助显示层

图表的图例,刻度等

2.3.2.3 图像层

在绘图区画各种各样的图表

2.3.3 pyplot模块

作用与当前figure的当前Axes

提供了各种画图的函数

#创建画布 可以指定画布的大小 figsize,和图像的清晰度 dpi
plt.figure(figsize=(),dpi=)

#将当前画布保存为图片 必须在show()之前调用
plt.savefig("保存路径")

#修改x轴刻度 可以传入两个参数,第一个显示的点,第二个参数可以格式化显示的点的名称 可以看demo1
plt.xticks(range[60],[名称])
#修改y轴刻度
plt.yticks()

#修改x,y轴标题
plt.xlabel("标题")
plt.ylabel("标题")

#修改标题
plt.title("标题")

#增加网格 第一个默认True 显示不显示网格  linestyle="--"表示网格线条为虚线,alpha=0.5 透明度 
plt.grid(True,linestyle="--",alpha=0.5)


#显示图例
plt.plot(x,y,label="图例名称")
plt.lenged("可以指定图例显示的位置 使用loc参数")

#折线图
plt.plot()
#散点图
plt.scatter()
#柱状图
plt.bar()
#饼状图
plt.pie()
#直方图
plt.hist()
# matplotlib.pyplot.hist(  
#     weights=None, cumulative=False, bottom=None,   
#     histtype=u'bar', align=u'mid', orientation=u'vertical',   
#     rwidth=None, log=False, color=None, label=None, stacked=False,   
#     hold=None, **kwargs)

3.numpy

高效的运算工具

3.2 ndarray

numpy的核心 n维数组

numpy使用ndarray来对数据进行处理,对大数据的处理计算效率要远高于python原生的list

3.2.1  ndarrray的优势

3.2.1.1 存储风格

同种类型

3.2.1.2 并行化运算(向量化运算)

3.2.1.3 底层

c语言编写解除了GIL 支持多线程

3.2.2 属性

ndarray的属性有

shape ndarray的行跟列

ndim 维度

size 元素 等于shape行x高

dtype 类型 整数默认是int64

itemsize 看有几个字节

3.2.3 基础使用

3.2.3.1 生成数组的方法

  1. 生成0和1的方法
np.zeros(形状)
np.ones(形状)
  1. 从现有数组中生成
np.array() 深拷贝
np,asarray() 浅拷贝
np.cory() 深拷贝
  1. 生成固定范围的数组
np.linspace(0,10,100) #生成从010之间的100个元素 包括010 等距
np.arange(0,10,100)#生成从010之间的元素 100是步长 不包括10(左闭右开)
  1. 生成随机数组 生成随机数组可以指定分布状况, 均匀分布 可能性相当的分布 通过直方图查看分布情况 正态分布
np.random.uniform(low=,high=,size=) #均匀分布 左闭右开包含low 不包含heigh
np.random.normal(loc=,scale=,size=) #正态分布 三个参数分别为 均值,标准差,形状
### 生成随机数组并展示为直方图
import matplotlib.pyplot as plt

#准备数据
data = np.random.uniform(low=-1,high=1,size=1000000)
data
#创建画布
plt.figure(figsize=(20,8),dpi=80)

#画图
plt.hist(data,1000)

#展示
plt.show()
data2 = np.random.normal(loc=1.5,scale=0.2,size=1000000)

#创建画布
plt.figure(figsize=(20,8),dpi=80)
#绘制直方图
plt.hist(data2,1000)

#展示
plt.show()

3.2.3.2 切片和形状的修改

#只改变形状,数据不改变,并且返回新的ndarray 对原有的ndarray不修改
nd.reshape(shpae)
#只改变形状,没有返回值,直接对原有的ndarray进行修改
nd.resize(shpape)
#转置 修改数据
T

3.2.3.3 修改类型/序列化/数组去重

#修改类型
np.asarray("int32")
#序列化 tostring方法再3.8版本中过时 改为tobytes()
np.tostring()
np.tobytes()
#数组去重
#原生的set()只能对一维数组去重
np.unique(ndarray)
#将二维数组转换为一维数组
ndarray.flatten()

3.2.4 运算

布尔索引: numpy支持布尔索引,在使用ndarray的时候,可以通过布尔索引返回想要的数组

data5[data5>0.5]

3.2.4.1 逻辑运算

#当全部为True时,返回True,否则返回False
np.all(ndarray)
np.all(data5>-0.5)
#当其中有一个为True就返回True,全部为False时才返回False
np.any(ndarray)
np.all(data5>-0.5)
#三元运算符 可以对ndarray的值进行操作
np.where(ndarray, True的值, False的值)
np.where(data5>-0.5,100,-100)

#逻辑与 逻辑或 可以与where联合使用
logical_and(条件1,条件2)
logical_or(条件1,条件2)
np.where(np.logical_and(data5>0.5,data5<0.7),1,0)

3.2.4.2 统计运算

max, min等

#取ndarray的最大值 axis=1表示跟据行取最大值
temp.max(axis=1)
np.max(temp,axis=1)

#取ndarray的最大值所在位置 axis=1表示跟据行取最大值
np.argmax(temp,axis=1)
temp.argmax(axis=1)

3.2.4.3 数组间运算

3.2.4.4 矩阵运算

矩阵 二维数组

存储矩阵的两种方法:

  1. ndarray
np.array()
  1. 使用matrix数据结构
np.mat()
3.2.4.4.1 乘法运算

ndarray

np.matual()

matrix

a * b

3.2.4.5 合并

#水平拼接
np.hstack()
#竖直拼接
np.vstack()

#axis=0 竖直拼接 axis=1 水平拼接
np.concatentenate((a,b),axis=0)

3.2.5 IO操作

3.2.5.1 读取文件

使用numpy读取数据文件

np.gedata = np.genfromtxt("test.csv",delimiter=",")

如果数据中有字符串,会出现读取不出来,需要对数据进行处理

处理方法一般有两种

  1. 删除数据
  1. 对数据进行替换 使用列的平均数进行替换

4. pandas

数据处理工具

pandas.pydata.org/docs

4.1 DataFrame

import pandas as pd

columns=pd.date_range(start="20201112",periods=8,freq="b")
columns
indexs = ["股票{}".format(i+1) for i in range(10)]
print(indexs)
pd.DataFrame(data1,index=indexs,columns=columns)

基础语法

import pandas as pd
pd.DataFrame(数据,index=行名称,columns=列名称)
#行名称列名称都是数组,要与数据的形状相对应

4.1.2 结构

既有行索引又有列索引的二维数组

可以看作是ndarray加上了行索引和列索引

4.1.3 属性

shape

index

columns

values 值就是ndarray

T 转置

4.1.4 方法

#获取DataFrame的前几行 参数不穿默认前5行
dataFrame1.head(8)
#获取DataFrame的后几行 参数不穿默认后5行
dataFrame1.tail(7)

4.1.5 设置索引

修改行索引的方法

  1. 全部修改
#不能直接对DataFrame的索引的某个值进行修改,只能整体进行修改
dataFrame1.index = ["股票_update{}".format(i) for i in range(10)]
#这样就对index全部修改
  1. 重置索引
#drop参数默认为False 如果为True,会把原有的index当成一列,再插入默认的索引列
dataFrame1.reset_index(drop=True)
  1. 设置新索引
#设置新索引,这样设置完索引,DataFrame会变成一个可以存储多维数据的数组
dataFrame1.set_index(["2020-11-12 00:00:00","2020-11-13 00:00:00"])
#注意set_index完的index变化了会变成 MultiIndex

4.2 Panel

存储三维数据

弃用 使用 MultiIndex代替

4.3 Series

存储一维数组

4.3.1 创建Series

 #pandas.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)
    pd.Series(np.arange(0,10,2))  
    pd.Series(np.arange(0,10,2),index=list("abcde"))
    pd.Series({"red":1,"yellow":2})

4.3.2 属性

  1. index
  1. values

4.4 索引操作数据

使用索引获取操作数据

4.4.1 使用索引获取数据

  1. 直接索引
#直接索引必须先列后行
data["User_id"][113639]
#data是一个DataFrame User_id是列索引,113639是行索引
  1. 按名字索引
data.loc[]
  1. 按数字索引
data.iloc[]
#第一行第三列
data.iloc[1,3]
  1. 组合索引 不用
data.ix[]

4.4.2 赋值操作

使用索引操作赋值

data.loc[0,'Merchant_id']=450
data.iloc[0,1]=410

4.4.3 排序

4.4.3.1 对内容排序

  1. DataFrame
data.sort_values(by="Date_received",ascending=False)
#by可以是一个列表
  1. series
sr.sort_values()
#series 是一维数组 所以不用再指定某个字段

4.4.3.2 对索引排序

  1. DataFrame
data.sort_index()
  1. series
data.sort_index()

4.5 运算

4.5.1 算术运算

可以直接对DataFrame,Series进行加减乘除

4.5.2 逻辑运算

#将查询条件放入query参数 返回符合条件的数据
data.query("Distance==450")
#判断Merchant_id是否存在410的数据
data[data["Merchant_id"].isin([410])]

4.5.3 统计运算

data.describe()

...

4.5.4 自定义运算

apply()

4.6 文档的读取和存储

4.6.1 读取

pandas.pydata.org/docs/refere…

read_csv()

4.6.2 存储

to_csv()

4.7 高阶用法

4.7.1 处理NaN数据

pd.isnull(DataFrame)
pd.notnull(DataFrame)	
#删除NaN行
DataFrame.dropna(inplace=False)
#替换NaN
DataFrame.fillna(value,inplace=False)

#替换其他默认符号为NaN
DataFrame.replace(to_replace,value)

4.7.2 数据离散化

数据离散化,将一组数据经过处理成矩阵的形式

比如 一组身高数据 160 165 170 175 ...

数据离散化就是将 身高分为 矮 中 高三个属性,达到如下效果

010
100
100

4.7.2.1 实现数据离散化

  1. 分组
    1. 自定义分组
      1. pd.cut(data,bins)
    1. 自动分组
      1. pd.qcut(data,bins)
  1. 求哑变量
    1. get_demmies(data,prefiex="分组")
#求分组
cut = pd.qcut(data_received,3)
#求哑变量矩阵
test_dummies = pd.get_dummies(cut,prefix="test")

4.7.3 合并

#axis=1水平
pd.concat([data1,data2],axis=1)

pd.merge(left,right,how="inner",on=[])

4.7.4 交叉表和透视表

#交叉表
crosstab(val1,val2)
#透视表

4.7.5 分组与聚合

#分组
groupby()
#聚合函数
max()

data.groupby(data["Date_received"])["Discount_rate"].max()