Python数据分析与展示Numpy、Matplotlib

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可以显示所有的魔术命令


image
![Uploading polar_331910.png . . .]
image ![Uploading polar_331910.png . . .]

数据的表示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运行结果.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()
pie.png
# -*- 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()

Histgram.png
# -*- 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()
polar.png
# -*- 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()
Scatter.png

推荐阅读更多精彩内容