Python 数据分析与展示
学习内容
Numpy数据表示、Matplotlib绘图、Pandas数据分析这三个库
Anaconda IDE的使用
conda、Spyder、IPython的使用
实例:图像的手绘风格、引力波的绘制、房价趋势分析、股市数据的分析
Anaconda IDE的使用
使用anaconda navigator 启动
anaconda来源于conda(用于管理python的第三方包与python环境)其包含了conda、Python与一批第三方的库
编程工具 Spyder 包含了IPython(交互式命令行)
IPython中的?可以得到变量信息与函数信息、%run命令可以运行python程序,在运行时会使用空的命令空间、%magic可以显示所有的魔术命令
数据的表示Numpy
数据的维度:一组数据的组织形式
Numpy 一个开源的科学计算库,提供了一个强大的N维数组对象:ndarray,具有数学计算的功能
ndarray由实际的数据与描述数据的元数据两部分组成,一般要求数据的类型相同。
生成ndarray:
- np.array([[],[]],dtype=np.float32),也可以使用元组进行创建
- np.arrange(n) 类似range()函数
- np.ones(shape)、np.zeros(shape)、np.full(shape,val)根据元组shape生成一个全1、全0、全val的ndarray数组
- np.eye(n) 创建一个n维单位阵(以上均可以由dtype指定数据类型)
- np.ones_like(a)、np.zeros_like(a)、np.full_like(a,val) 由a给定形状
- np.linspace() 由起止数等间距地填充数据,形成数组,类似于range,但是给定的参数为start、end、number
- np.concatenate() 将两个或多个数组合并成同一个数组
ndarray对象的属性:
属性 | 说明 |
---|---|
.ndim | 维度的数量 |
.shape | ndarray的尺度 |
.size | 对象中元素的个数 |
.dtype | 对象元素类型 |
.itemsize | 每个元素的大小,以字节为单位 |
ndarray维度变换
- .reshape(shape)不改变数组的元素,返回一个shape形状的新的数组
- resize(shape) 修改原数组
- swapaxes(ax1,ax2) 将数组的n个维度中的两个维度进行调换
- flatten() 降维 不改变原数组
ndarray数组类型变换
new_a = a.astype(new_type)
ndarray转为列表
list = a.tolist()
ndarray数组操作(索引与切片)
一维数组的索引与python类似,切片a[1:4:2] 起始编号、终止编号(不含)、步长
多维数组的索引:a[1,2,3]从最外层到最内层
多维数组的切片:a[:,1:3,:],a[:,:,::2]
ndarray数组的运算
标量运算等价于对每一个元素进行运算
Numpy中的一元函数
- np.abs(x)、np.fabs(x)、np.sqrt(x)、np.square(x)
- np.log(x)、np.log10(x)
- np.ceil(x)、np.floor(x)计算ceiling(不超过其的最大整数值)与floor(超过其最小整数值)
- np.rint(x) 四舍五入值
- np.modf(x) 以整数和小数两个数组返回
- np.cosh(x) ···
- np.exp(x)、np.sign(x)
- ···
Numpy中的二元函数
- +-* / **
- np.maximum(x,y)、np.minimum(x,y) 元素的最大、小值,生成新的数组
- =、!=、>、<、<=、>= 比较大小返回布尔型数组
CSV文件(Comma-Separated Value,逗号分隔值)
文件单行以逗号进行分隔,常见数据库均可以读入或到处CSV文件
np.savetxt(fname,array,fmt='%.18e',delimiter=None)
- fname 文件名称
- array 要存入的数组
- fmt 写入文件的格式,如%d %0.2
- delimiter 分隔字符串,默认为空格
np.loadtxt(fname,dtype=np.float,delimiter=None,unpack=False)
- fname 文件名称
- dtype 数组元素格式
- delimiter 分隔字符串,默认为空格
- unpack 默认为False,读入数据存入一个变量
多维数组的存取
a.tofile(fid, sep="", format="%s")
- fid : 文件名或者是打开的文件对象
- sep : 数据分割字符串,空串则输出二进制文件
- format : 输出格式
np.fromfile(file, dtype=float, count=-1, sep='')
- count : int
Number of items to read.-1
means all items
np.save(file, array)/np.savez(file, array)
np.load(fname)
- 存为.npy或者.npz文件
Numpy随机函数子库np.random库
- rand(d0,d1,...,dn)根据d0-dn创建随机数组,浮点数,[0,1),均匀分布
- randn(d0,d1,...,dn) 正态分布
- randint(low[,high,shape]) 随机整数
- seed(s) 随机数种子
- shuffle(a) 将第一轴进行重排列,改变数组
- permutation(a) 由第一轴产生一个新的乱序数组,不改变数组
- choice(a[,size,replace,pl]) 从一位数组a中以概率p抽取元素,形成size形状新数组,replace表示是否可以重用,默认True
- uniform()、normal、poisson
Numpy的统计函数
- .sum(a,axis = None) 给定轴的求和或所有求和
- .mean(a,axis = None) 算数平均数
- .average(a,axis = None,weights = None) 加权平均数
- .std(a,axis = None) 标准差
- .var(a,axis = None) 方差
- .min(a) max(a)
- argmin(a) argmax(a) 一维后的最小、大值的下标
- unravel_index(index,shape) 根据shape将一维下标index转为多维下标
- ptp(a) 极差
- median(a) 中位数
- gradient(a) 计算数组的梯度 连续值之间的变化率
实例:图像的手绘表示
图像一般采用RGB表示,三个通道取值都在0-255
Python中的PIL库(Python Image Library)
安装 pip install pillow
使用 from PIL import Image
图像在计算机中的表示为一个二元矩阵,每个矩阵元素为RGB值:(R,G,B) 每个通道为一个字节,那么一个矩阵元素的大小就是3个字节(24二进制位)
# 打开图像
im_array = np.array(Image.open('D:/test.jpg'))
# 保存到文件
im = Image.fromarray(im_array)
im.save(filename)
# 灰度变换
a = np.array(Image.open('D:/test.jpg').convert('L'))
手绘图片:黑白灰色,边界线条较重,相同或者相近的颜色趋向于白色,略有光源效果
# -*- coding: utf-8 -*-
"""
图像手绘风格实例代码
"""
from PIL import Image
import numpy as np
a = np.array(Image.open('D:/leiding.jpg').convert('L')).astype('float')
depth = 10.
grad = np.gradient(a)
grad_x, grad_y = grad
grad_x = grad_x *depth/100.
grad_y = grad_y *depth/100.
A = np.sqrt(grad_x**2+grad_y**2+1.)
uni_x = grad_x/A
uni_y = grad_y/A
uni_z = 1./A
vec_e1 = np.pi/2.2
vec_az = np.pi/4
dx = np.cos(vec_e1)*np.cos(vec_az)
dy = np.cos(vec_e1)*np.sin(vec_az)
dz = np.sin(vec_e1)
b = 255*(dx*uni_x+dy*uni_y+dz*uni_z)
b = b.clip(0,255)
im = Image.fromarray(b.astype('uint8'))
im.save('D:/handpaint.jpg')
Matplotlib库
使用方法:
import matplotlib.pyplot as plt
plt.plot([3,1,4,5,2])
plt.ylabel('grade')
plt.show()
# 存为文件
plt.savefig('test',dpi = 600) #默认输出为PNG 文件
同样也可以这样绘制:
plt.plot([0,2,4,6,8],[3,1,4,5,2])
# 给出横纵坐标的范围 横-1到10,纵0到6
plt.axis([-1,10,0,6])
# 绘图区域分割
plt.subPlot(nrows,ncols,plot_number) # 与matlab一样,标号从左到右,从上到下
# 也可以将逗号去掉,比如plt.subplot(324)
plt.plot(x,y,format_string,**kwargs)
- x: X轴数据,列表或者数组,可选,可组合使用
- y: Y轴数据,列表或者数组
- format_stirng: 控制输出字符串,可选
- 'b'/'g'/'#008000'/'0.8' 颜色控制字符
- '-' 实线 '--' 破折线 '-.' 点划线 ':' 虚线 '''' 无线条 曲线风格字符
- '.' 点标记 ',' 像素标记 'o' 实心圈标记 'v' 倒三角标记 '^' 上三角标记 ...... 标记字符
- **kwargs: 第二组或者更多组的(x,y,format_string)
plt中的文本显示函数
- plt.xlabel()、plt.ylabel() 对轴加上标签
- plt.title() 增加文件头
- plt.text() 任意位置增加文本
- plt.text(2,1,'str') 前两个参数表示text出现范围
- plt.annotate() 增加带箭头的注释文本
- plt.grid() 显示网格线
plt.subplot2grid(GridSpec,CurSpec,colspan=1,rowspan=1)
设定网格,选中网格,设计成不同大小的绘图子区域
- GridSpec 元组,表示将区域分成什么样子的子区域
- CurSpec 元组,表示子区域的起始格子坐标
- colspan、rowspan 表示子区域占用列、行数
同样,此函数可以使用如下库实现:
import matplotlib.gridspec as grs
gs = grs.GridSpec(3,3)
ax1 = plt.subplot(gs[0:])
ax2 = plt.subplot(gs[1,:-1])
pyplot基础图标函数
plot()函数、箱形图函数boxplot()、条形图函数bar()、横向条形图函数barh()、极坐标图函数polar()、饼图pie()
功率谱密度图函数psd()、谱图specgram()、X-Y相关性图cohere()、散点图scatter()、直方图hist()、步阶图step()、等值图contour()、垂直图vlines()、柴火图stem()、数据日期plot_date()
下面以代码说明:
# -*- coding: utf-8 -*-
"""
Created on Tue Aug 1 14:07:25 2017
@author: Administrator
"""
import matplotlib.pyplot as plt
# 饼图的标签
labels = 'Frogs','Hogs','Dogs','Logs'
# 饼图对应的尺寸,即所占比例
sizes = [15,30,45,10]
# 突出与突出的量
explode = (0,0.1,0,0)
# autopct显示百分数的方式、shadow阴影效果、startangele起始角度
plt.pie(sizes,explode=explode,labels=labels,autopct = '%1.1f%%',shadow = False,startangle = 90)
# 使得轴的度量成为一样
plt.axis('equal')
plt.show()
# -*- coding: utf-8 -*-
"""
Created on Tue Aug 1 15:39:08 2017
@author: Administrator
"""
# 绘制直方图
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(0)
mu,sigma = 100,20 #均值与标准差
a = np.random.normal(mu,sigma,size=100) # 正态分布
# a 给定数组 bin 表示直方的个数,就是取值区间的划分,纵轴表示为频次/区间长度
# normed = 0 显示频次,normed=1 显示频次/区间长度
# histtype 绘制类型 facecolor 绘制颜色
plt.hist(a,20,normed = 1,histtype = 'stepfilled',facecolor = 'b',alpha = 0.75)
plt.title('Histgram')
plt.savefig('D:/Histgram',dpi = 150)
plt.show()
# -*- coding: utf-8 -*-
"""
Created on Tue Aug 1 15:48:07 2017
@author: Administrator
"""
# 极坐标图的绘制
import matplotlib.pyplot as plt
import numpy as np
# 极坐标图中的数据个数
N = 20
# 等分出20个不同的角度 0-360度
theta = np.linspace(0.0,2*np.pi,N,endpoint = False)
# 生成每个角度对应的值
radii = 10*np.random.rand(N)
# 生成宽度值
width = np.pi/4*np.random.rand(N)
# 获得绘制极坐标图的子区域
ax = plt.subplot(111,projection = 'polar')
# 前三个参数对应 theta 从何地开始绘制 radii 从中心点绘制出来的长度,width 指绘图区域的面积
bars = ax.bar(theta,radii,width=width,bottom=0.0)
for r,bar in zip(radii,bars):
bar.set_facecolor(plt.cm.viridis(r/10.))
bar.set_alpha(0.5)
plt.savefig('D:/polar',dpi = 150)
plt.show()
# -*- coding: utf-8 -*-
"""
Created on Tue Aug 1 16:02:32 2017
@author: Administrator
"""
import numpy as np
import matplotlib.pyplot as plt
fig,ax = plt.subplots()
ax.plot(10*np.random.randn(100),10*np.random.randn(100),'o')
ax.set_title('Simple Scatter')
plt.savefig('D:/Scatter',dpi = 150)
plt.show()