搭建环境
安装numpy
、scipy
、matplotlib
、ipython
、pandas
等必要包
pip install numpy scipy matplotlib ipython jupyter pandas sympy nose
安装Spyder3
pip install spyder
或者直接安装集成环境anaconda
数据分析——表示
一、Numpy库入门
Numpy的引用
import numpy as np
1、Numpy数组对象:ndarray
ndarray
是一个多位数组对象,有两部分组成:
- 实际的数据
- 描述数据的元数据(数据维度、数据类型)
ndarray
数组一般要求所有元素类型相同(同质),数组下标从0开始
轴(axis
):保存数据的维度,秩(rank
):轴的数量
ndarray对象的属性
属性 | 说明 |
---|---|
.ndim | 秩,即轴的数量或维度的数量 |
.shape | ndarray 对象的尺度,对于矩阵,n行m列 |
.size | ndarray 对象元素的个数,相当于.shape 中n*m的值 |
.dtype | ndarray 对象的元素类型 |
.itemsize | ndarray 对象中每个元素的大小,以字节为单位 |
ndarray的元素类型
数据类型 | 说明 |
---|---|
bool | 布尔类型,True或False |
intc | 与C语言中的int类型一致,一般是int32或int64 |
intp | 用于索引的整数,与C语言中ssize_t一致,int32或int64 |
int8 | 字节长度的整数,取值:[$$ -128, 127 $$] |
int16 | 16位长度的整数,取值:[$$ -32768, 32767 $$] |
int 32 | 32位长度的整数,取值:[$$ -2^{31}, 2^{31}-1 $$] |
int64 | 64位长度的整数,取值:[$$ -2^{63}, 2^{63}-1 $$] |
uint8 | 8位无符号整数,取值:[0, 255] |
uint16 | 16位无符号整数,取值:[0, 65535] |
uint32 | 32位无符号整数,取值:[0, $$ 2^{32}-1 $$] |
uint64 | 64位无符号整数,取值:[0, $$ 2^{64}-1 $$] |
float16 | 16位半精度浮点数:1位符号位,5位指数,10位尾数 |
float32 | 32位半精度浮点数:1位符号位,8位指数,23位尾数 |
float64 | 64位半精度浮点数:1位符号位,11位指数,52位尾数 |
complex64 | 复数类型,实部和虚部都是32位浮点数 |
complex128 | 复数类型,实部和虚部都是64位浮点数 |
ndarray数组可以由非同质对象构成
非同质ndarray元素为对象类型
非同质ndarray对象无法有效发挥Numpy优势,尽量避免使用
2、ndarray数组的创建和变换
ndarray数组的创建方法
从Python列表、元组等类型创建
x = np.array(list/tuple)
x = np.array(list/tuple, dtype=np.float32)
使用Numpy函数创建
函数 | 说明 |
---|---|
np.arange(n) | 类似range() 函数,返回ndarray 类型,元素从0到n-1 |
np.ones(shape) | 根据shape 生成一个全1数组,shape 是元祖类型 |
np.zeros(shape) | 根据shape 生成一个全0数组,shape 是元祖类型 |
np.full(shape, val) | 根据shape 生成一个数组,每个元素值都是val |
np.eye(n) | 创建一个正方的n*n单位矩阵,对角线为1,其余为0 |
np.ones_like(a) | 根据数组a的形状生成一个全1数组 |
np.zeros_like(a) | 根据数组a的形状生成一个全0数组 |
np.full_like(a, val) | 根据数组a的形状生成一个数组,每个元素值都是val |
np.linspace() | 根据起止数据等间距地填充数据,形成数组 |
np.concatenate() | 将两个或多个数组合并成一个新的数组 |
ndarray数组的维度变换
方法 | 说明 |
---|---|
.reshape(shape) | 不改变数组元素,返回一个shape 形状的数组,原数组不变 |
.resize(shape) | 与.reshape() 功能一致,但修改原数组 |
swapaxes(ax1, ax2) | 将数组n个维度中两个维度进行调换 |
flatten() | 对数组进行降维,返回折叠后的一维数组,原数组不变 |
3、ndarray数组的操作:索引和切片
索引:获取数组中特定位置元素
切片:获取数组元素子集
一维数组的索引和切片:与Python的列表类似
a = np.array([9, 8, 7, 6, 5])
#索引
a[2]
#切片
a[ 1: 4: 2 ] # 起始编号:终止编号(不含):步长,三元素冒号分割
多维数组的索引
a = np.arange(24).reshape((2, 3, 4))
# 索引
a[1, 2, 3]
a[0, 1, 2]
a[-1, -2, -3]
#切片
a[:, 1, -3] # 选取一个维度用:
a[:, 1:3, :] # 每个维度切片方法与一维数组相同
a[:, :, ::2] # 每个维度可以使用步长跳跃切片
索引
切片
4、ndarray数组的运算
数组与标量之间的运算:作用于数组每一个元素
# 计算a与元素平均值的商
a = np.arange(24).reshape((2, 3, 4))
a = a / a.mean()
Numpy一元函数对ndarray中的数据执行元素级运算的函数
函数 | 说明 |
---|---|
np.abs(x) np.fabs(x) | 计算数组各元素的绝对值 |
np.sqrt(x) | 计算数组各元素的平方根 |
np.square(x) | 计算数组各元素的平方 |
np.log(x) np.log10(x) np.log2(x) | 计算数组各元素的自然对数、10底对数和2底对数 |
np.cell(x) np.floor(x) | 计算数组各元素的celling值或floor值 |
np.rint(x) | 计算数组各元素的四舍五入值 |
np.mod(x) | 将数组各元素的小数和整数部分以两个独立数组形式返回 |
np.cos(x) np.cosh(x) np.sin(x) np.sinh(x) np.tan(x) np.tanh(x) | 计算数组各元素的普通型和双曲型三角函数 |
np.exp(x) | 计算数组各元素的指数值 |
np.sign(x) | 计算数组各元素的符号值,1(+),0,-1(-) |
Numpy二元函数
函数 | 说明 |
---|---|
+ - * / ** | 两个数组各元素进行对应运算 |
np.maximum(x,y) np.fmax() np.minimum(x,y) np.fmin() | 元素级的最大值/最小值计算 |
np.mod(x,y) | 元素级的模运算 |
np.copysign(x,y) | 将数组y中各元素值的符号赋值给数组x对应元素 |
> < >= <= == != | 算数比较,产生布尔型数组 |
二、Numpy数据存取与函数
1、数据的CSV文件存取
# 存储
np.savetxt(fname, array, fmt='%.18e', delimiter=None)
fname
:文件、字符串或生成器,可以是.gz或.bz2的压缩文件array
:存入文件的数组fmt
:写入文件的格式,例如:%d
%.2f
%.18e
delimiter
:分割字符串,默认是任何空格
a = np.arange(100).reshape(5, 20)
np.savetxt('a.csv', a, fmt='%d', delimiter=',')
# 读取
np.loadtx(fname, dtype=np.float, delimiter=None, unpack=False)
fname
:文件、字符串或生成器,可以是.gz或.bz2的压缩文件dtype
:数据类型,可选delimiter
:分割字符串,默认是任何空格unpack
:如果True
,读入属性将分别写入不同变量
b = np.loadtxt('a.csv', delimiter=',')
CSV只能有效存储一维和二维数组
2、多维数据的存取
# 存储
a.tofile(fname, sep='', format='%s')
fname
:文件、字符串sep
:数据分割字符串,如果是空串,写入文件为二进制format
:写入数据的格式
a = np.arange(100).reshape(5, 20)
a.tofile("b.dat", sep=",", format='%d')
# 读取
np.fromfile(fname, dtype=float, count=-1, sep='')
fname
:文件、字符串dtype
:读取的数据类型count
:读入元素个数,-1
表示读入整个文件sep
:数据分割字符串,如果是空串,写入文件为二进制
c = np.fromfile("b.dat", dtype=np.int, sep=",")
该方法需要读取时知道存入文件时的维度和元素类型a.tofile()
和np.fromfile()
需要配合使用
可以通过元数据文件来存储额外信息
Numpy的便捷文件存取
# 存储
np.save(fname, array)
np.savez(fname, array)
fname
:文件名,以.npy
为扩展名,压缩扩展名为.npz
array
:数组变量
# 读取
np.load(fname)
fname
:文件名,以.npy
为扩展名,压缩扩展名为.npz
3、Numpy的随机数函数
Numpy的随机数子库——random子库
np.random.*
np.random.randn()
np.random.rand()
np.random.randint()
np.random的随机数函数
函数 | 说明 |
---|---|
rand(d0,d1,...,dn) | 根据d0-dn创建随机数数组,浮点数,[0, 1),均匀分布 |
randn(d0,d1,...,dn) | 根据d0-dn创建随机数数组,标准正态分布 |
randint(low[,high,shape]) | 根据shape 创建随机数数组,范围是[low, high) |
seed(s) | 随机数种子,s是给定的种子值 |
shuffle(a) | 根据数组a的第1轴进行随排列,改变数组a |
permutation(a) | 根据数组a的第1轴产生一个新的乱序数组,不改变数组a |
choice(a[,size,replace,p]) | 从一维数组a中以概率p抽取元素,形成size 形状新数组,replace 表示是否可以重用元素,默认为False |
uniform(low,high,size) | 产生具有均匀分布的数组,low 起始值,high 结束值,size 形状 |
normal(loc,scale,size) | 产生具有正态分布的数组,loc 均值,scale 标准差,size 形状 |
poisson(lam,size) | 产生具有泊松分布的数组,lam 随机事件发生率,size 形状 |
4、Numpy的统计函数
Numpy直接提供的统计类函数
np.*
np.std()
np.var()
np.average()
np.random的统计函数
函数 | 说明 |
---|---|
sum(a,axis=None) | 根据给定轴axis 计算数组a相关元素之和,axis 整数或元祖 |
mean(a,axis=None) | 根据给定轴axis 计算数组a相关元素的期望,axis 整数或元祖 |
average(a,axis=None,weights=None) | 根据给定轴axis 计算数组a相关元素的加权平均值,weights 是权值 |
std(a,axis=None) | 根据给定轴axis 计算数组a相关元素的标准差 |
var(a,axis=None) | 根据给定轴axis 计算数组a相关元素方差 |
min(a) max(a) | 计算数组a中元素的最小值、最大值 |
argmin(a) argmax(a) | 计算数组a中元素的最小值、最大值的降一维后下标 |
unravel_index(index,shape) | 根据shape 将一维下标index转换为多维下标 |
ptp(a) | 计算数组a中元素最大值与最小值的查 |
median(a) | 计算数组a中元素的中位数 |
a = np.arange(15).reshape(3, 5)
np.sum(a)
np.sum(a, axis=1)
np.mean(a, axis=0)
np.average(a, axis=0, weights=[10, 5, 1])
np.std(a)
np.var(a)
b = np.arange(15, 0, -1).reshape(3, 5)
np.max(b)
np.argmax(b)
np.unravel_index(np.argmax(b), b.shape)
np.ptp(b)
np.median(b)
5、Numpy的梯度函数
函数 | 说明 |
---|---|
np.gradient(f) | 计算数组f中元素的梯度,当f为多维时,返回每个维度梯度 |
梯度:连续值之间的变化率,即斜率
实例:图像手绘效果
from PIL import Image
import numpy as np
ImagePath = ""
NewImagePath = ""
a = np.asarray(Image.open(ImagePath).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(NewImagePath)
数据分析——展示
一、Matplotlib库入门
1、Matplotlib库介绍
Matplotlib库效果:http://matplotlib.org/gallery.html
Matplotlib库的使用
Matplotlib库由各种可视化类构成,内部结构复杂,受MATLAB启发。
matplotlib.pyplot
是绘制各种可视化图形的命令子库,相当于快捷方式。
import matplotlib.pyplot as plt
pyplot的绘图区域
# 在全局绘图区域中创建一个分区体系,并定位到一个子绘图区域
plt.subplot(nrows, ncols, plot_number)
nrows
横轴数量,ncols
纵轴数量,plot_number
绘图区域
2、pyplot的plot()函数
plt.plot(x, y, format_string, **kwargs)
参数 | 说明 |
---|---|
x | X轴数据,列表或数组,可选 |
y | Y轴数据,列表或数组 |
format_string | 控制曲线的格式字符串,可选 |
**kwargs | 第二组或更多组(x,y,format_string) |
当绘制多条曲线时,各条曲线的x不能省略
import matplotlib.pyplot as plt
import numpy as np
a = np.arange(10)
plt.plot(a, a*1.5, a, a*2.5, a, a*3.5, a, a*4.5)
plt.show()
format_string:有颜色字符、风格字符和标记字符组成
颜色字符 | 说明 | 颜色字符 | 说明 |
---|---|---|---|
'b' | 蓝色 | 'm' | 洋红色 magenta |
'g' | 绿色 | ‘y’ | 黄色 |
'r' | 红色 | 'k' | 黑色 |
'c' | 青绿色 cyan | 'w' | 白色 |
‘#008000’ | RGB颜色 | '0.8' | 灰度值字符串 |
风格字符 | 说明 |
---|---|
‘-' | 实线 |
’--‘ | 破折线 |
’-.' | 点划线 |
‘:’ | 虚线 |
‘' 或 ' ’ | 无线条 |
标记字符 | 说明 | 标记字符 | 说明 |
---|---|---|---|
'.' | 点标记 | ’4‘ | 右花三角标记 |
‘,' | 像素标记(极小点) | ’s‘ | 实心方形标记 |
’o‘ | 实心圆标记 | ’p‘ | 实心五角标记 |
’v‘ | 倒三角标记 | ’*‘ | 星形标记 |
’^' | 上三角标记 | ’h‘ | 竖六边形标记 |
‘>' | 右三角标记 | ’H‘ | 横六边形标记 |
’<‘ | 左三角标记 | ’+‘ | 十字标记 |
’1‘ | 下花三角标记 | ’x‘ | X标记 |
’2‘ | 上花三角标记 | ’D‘ | 菱形标记 |
’3‘ | 左花三角标记 | ’d‘ | 瘦菱形标记 |
’丨‘ | 垂直线标记 |
**kwargs:第二组或更多组(x,y,format_string)
参数 | 说明 |
---|---|
color | 控制颜色 |
linestyle | 线条风格 |
marker | 标记风格 |
markerfacecolor | 标记颜色 |
3、pyplot中文显示
第一种方法
import matplotlib
matplotlib.reParams['font.family'] = 'SimHei' # 使用中文黑体字体
属性 | 说明 |
---|---|
font.family | 用于显示 字体的名字 |
font.style | 字体风格,正常'normal' 或斜体 'italic' |
font.size | 字体大小 ,整数字号或者'large' 、'x-small' |
中文字体 | 说明 |
---|---|
'SimHei' | 中文黑体 |
'Kaiti' | 中文楷体 |
'LiSu' | 中文隶书 |
'FangSong' | 中文仿宋 |
'YouYuan' | 中文幼圆 |
'STSong' | 华文宋体 |
第二种方法
有中文的地方增加一个属性:fontproperties
import matplotlib.pyplot as plt
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=20)
plt.ylabel('竖轴:振幅', fontproperties='SimHei', fontsize=20)
3、pyplot的文本显示函数
函数 | 说明 |
---|---|
plt.xlabel() | 对X轴增加文本标签 |
plt.ylabel() | 对Y轴增加文本标签 |
plt.title() | 对图形整体增加文本标签 |
plt.text() | 在任意位置增加文本标签 |
plt.annotate() | 在图形中增加带箭头的注释 |
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=15 color='green')
plt.ylabel('纵轴:振幅', fontproperties='SimHei', fontsize=15)
plt.title(r'正弦波实例$y=cos(2\pi x)$', fontproperties='SimHei', fontsize=25) # $ $ 内引入的是LaTeX格式
plt.text(2, 1, r'$\mu=100$', fontsize=15)
plt.axis([-1, 6, -2, 2]) # 横纵轴坐标范围
plt.grid(True) # 网格线
plt.show()
plt.annotate(s, xy=arrow_crd, xytext=text_crd, arrowprops=dict)
import numpy as np
import matplotlib.pyplot as plt
a = np.arange(0.0, 5.0, 0.02)
plt.plot(a, np.cos(2*np.pi*a), 'r--')
plt.xlabel('横轴:时间', fontproperties='SimHei', fontsize=15 color='green')
plt.ylabel('纵轴:振幅', fontproperties='SimHei', fontsize=15)
plt.title(r'正弦波实例$y=cos(2\pi x)$', fontproperties='SimHei', fontsize=25)
plt.annotate(r'$\mu=100$', xy=(2, 1), xytext=(3, 1.5), arrowprops=dict(facecolor='black', shrink=0.1, width=2))
plt.axis([-1, 6, -2, 2])
plt.grid(True)
plt.show()
4、pyplot的子绘图区域
plt.subplot2grid(GridSpec, CurSpec, colspan=1, rowspan=1)
设定网格,选中网格,确定选中行列区域数量,编号从0开始
GridSpec类
import natplotlib.gridspec as gridspec
gs = gridspec.GridSpec(3, 3)
ax1 = plt.subplot(gs[0, :])
ax2 = plt.subplot(gs[1, : -1])
ax3 = plt.subplot(gs[1:, -1])
ax4 = plt.subplot(gs[2, 0])
ax5 = plt.subplot(gs[2, 1])
二、Matplotlib基础函数
1、pyplot基础图表函数概述
函数 | 说明 |
---|---|
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(datga, 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) | 绘制散点图,其中x和y长度相同 |
plt.step(x, y, where) | 绘制步阶图 |
plt.hist(x, bins, normed) | 绘制直方图 |
plt.contour(X, Y, Z, N) | 绘制等值图 |
plt.vlines() | 绘制垂直图 |
plt.stem(x, y, linefmt, markerfmt) | 绘制柴火图 |
plt.plot_date() | 绘制数据日期 |
2、pyplot饼图的绘制
import matplotlib.pyplot as plt
labels = 'Frogs', 'Hogs', 'Dogs', 'Logs'
sizes = [15, 30, 45, 10]
explode = (0, 0.1, 0, 0)
plt.pie(sizes, explode=explode, labels=labels, autopct='%1.1f%%', shadow=False, startangle=90)
plt.show()
3、pyplot直方图
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
mu, sigma = 100, 20 # 均值和标准差
a = np.random.normal(mu, sigma, size=100)
plt.hist(a, 20, density=1, histtype='stepfilled', facecolor='b', alpha=0.75)
plt.title('Histogram')
plt.show()
4、pyplot极坐标图
# 这里使用了面向对象的方式绘制极坐标图,也可以跟之前一样使用函数式绘制
import numpy as np
import matplotlib.pyplot as plt
N = 20
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')
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.show()
5、pyplot散点图
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.show()
三、实例:绘制引力波
引力波数据源:
http://python123.io/dv/grawave.html
http://python123.io/dv/H1_Strain.wav
http://python123.io/dv/L1_Strain.wav
http://python123.io/dv/wf_template.txt
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
# 读取相关数据
rate_h, hstrain = wavfile.read(r"H1_Strain.wav", "rb")
rate_l, lstrain = wavfile.read(r"L1_Strain.wav", "rb")
reftime, ref_H1 = np.genfromtxt('wf_template.txt').transpose()
htime_interval = 1 / rate_h
ltime_interval = 1 / rate_l
htime_len = hstrain.shape[0] / rate_h
htime = np.arange(-htime_len / 2, htime_len / 2, htime_interval)
ltime_len = lstrain.shape[0] / rate_l
ltime = np.arange(-ltime_len / 2, ltime_len / 2, ltime_interval)
fig = plt.figure(figsize=(12, 6)) # 创建12x6的绘图空间
# 绘制H1 Strain
plth = fig.add_subplot(221) # 2x2个子图,在第一个子图绘制
plth.plot(htime, hstrain, 'y')
plth.set_xlabel('Time (seconds)')
plth.set_ylabel('H1 Strain')
plth.set_title('H1 Strain')
# 绘制L1 Strain
pltl = fig.add_subplot(222)
pltl.plot(ltime, lstrain, 'g')
pltl.set_xlabel('Time (seconds)')
pltl.set_ylabel('L1 Strain')
pltl.set_title('L1 Strain')
# 绘制Template
pltref = fig.add_subplot(212)
pltref.plot(reftime, ref_H1)
pltref.set_xlabel('Time (seconds)')
pltref.set_ylabel('Template Strain')
pltref.set_title('Template')
fig.tight_layout() # 自动调整图像外部边缘
plt.savefig("Gravitational_Waves_Original.png")
plt.show()
plt.close(fig)
数据分析——概要
一、Pandas库入门
1、Pandas库介绍
Pandas库的引用
Pandas是Python第三方库,提供高性能易用数据类型和分析工具
import pandas as pd
Pandas基于NumPy实现,常与NumPy和Matplotlib一同使用
Pandas库的理解
两个数据类型
- Seies
- DataFrame
基于上述数据类型的各种操作
- 基本操作
- 运算操作
- 特征类操作
- 关联类操作
NumPy和Pandas对比
NumPy | Pandas |
---|---|
基础数据类型 | 扩展数据类型 |
关注数据的结构表达 | 关注数据的应用表达 |
2、Pandas库的Series类型
Series类型
由一组数据及与之相关的数据索引组成
index_0 --> data_a
index_1 --> data_b
index_1 --> data_b
index_1 --> data_b
索引 --> 数据
一维带标签的数组
自定义索引
Series类型可以由以下类型创建
- Python列表
- 标量值
- Python字典
- ndarray
- 其他函数
从标量值创建
从字典类型创建
从ndarray类型创建
Serires类型的基本操作
- Series类型包括index和values两部分
Series类型的操作类似ndarray类型
- 索引方法相同,采用[]
- NumPy中运算和操作可用于Series类型
- 可以通过自定义索引的列表进行切片
- 可以通过自动索引进行切片,如果存在自定义索引,则一同被切片
Series类型的操作类似Python字典类型
- 通过自定义索引访问
- 保留字
in
操作 - 使用
.get()
方法
Series类型对齐问题
Series + Series
Series类型在运算中会自动对齐不同索引的数据
Series类型的name属性
Series对象和索引都可以有一个名字,存储在属性.name
中
Series类型的修改
Series对象可以随时修改并立即生效
3、Pandas库的DataFrame类型
DataFrame类型
DataFrame类型由共用相同索引的一组列组成
索引+多列数据构成
- DataFrame是一个表格型的数据类型,每列值类型可以不同
- DataFrame基友行索引,也有列索引
- DataFrame常用于表达二维数据,但也可以表达多维数据
DataFrame类型可以由以下类型创建
- 二维ndarray对象
- 一维ndarray、列表、字典、元祖或Series构成的字典
- Series类型
- 其他DataFrame类型
从二维ndarray对象创建
从一维ndarray对象字典创建
从列表类型的字典创建
4、Pandas库的数据类型操作
- 增加或重排:重新索引
- 删除:drop
重新索引
.reindex()
能够改变或重排Series和DataFrame索引
.reindex(index=None, columns=None, ...)
参数 | 说明 |
---|---|
index, columns | 新的行列自定义索引 |
fill_value | 重新索引中,用于填充缺失位置的值 |
method | 填充方法,ffill当前值向前填充,bfill向后填充 |
limit | 最大填充量 |
copy | 默认True,生成新的对象,False时,新旧相等不复制 |
索引类型
- Series和DataFrame的索引是Index类型
- Index对象是不可修改类型
方法 | 说明 |
---|---|
.append(idx) | 连接另一个Index对象,产生新的Index对象 |
.diff(idx) | 计算差集,产生新的Index对象 |
.intersection(idx) | 计算交集 |
.union(idx) | 计算并集 |
.delete(loc) | 删除loc位置处的元素 |
.insert(loc, e) | 在loc位置增加一个元素e |
直接按照教程nd = d.reindex(index=ni, columns=nc, method='ffill')
会报错ValueError: index must be monotonic increasing or decreasing
。因为为了重新索引方法,你的索引必须是有序/单调/递增的顺序,因为列也是重新索引的,而不是单调增加或减少。所以新版本的pandas代码改成nd = d.reindex(index=ni, columns=nc).ffill()
即可
删除指定索引对象
.drop()
能够删除Series和DataFrame指定行或列索引
5、Pandas库的数据类型运算
算数运算法则
- 算术运算根据行列索引,补齐后运算,运算默认产生浮点数
- 补齐时缺项填充NaN
- 二维和一维、一维和零维间为广播运算
- 采用
+-*/
符号进行的二元运算产生新的对象
方法 | 说明 |
---|---|
.add(d, **argws) | 类型间加法运算,可选参数 |
.sub(d, **argws) | 类型间减法运算,可选参数 |
.mul(d, **argws) | 类型间乘法运算,可选参数 |
.div(d, **argws) | 类型间除法运算,可选参数 |
fill_value参数代替NaN,替代后参与运算
不同维度间为广播运算,一维Series默认在轴1参与运算
使用运算方法可以令一维Series参与轴0运算
比较运算
- 比较运算只能比较相同索引的元素,不进行补齐
- 二维和一维、一维和零维间为广播运算
- 采用
> < >= <= == !=
等符号进行的二元运算产生布尔对象
同纬度运算,尺寸一致
不同纬度,广播运算,默认在1轴
二、Pandas数据特征分析
1、数据的排序
.sort_index()
方法在指定轴上根据索引进行排序,默认升序.sort_index(axis=0, ascending=True)
.sort_values()
方法在指定轴上根据数值进行排序,默认升序Series.sort_values(axis=0, ascending=True)
DataFrame.sort_values(by, axis=0, ascending=True)
by
:axis轴上的某个索引或索引列表
- NaN同意放到排序末尾
2、数据的基本统计分析
适用于Series和DataFrame类型
方法 | 说明 |
---|---|
.sum() | 计算数据的总和,按0轴就算,下同 |
.count() | 非NaN值的数量 |
.mean() .median() | 计算数据的算数平均值、算数中位数 |
.var() .std() | 计算数据的方差、标准差 |
.min() .max() | 计算数据的最小值、最大值 |
describe() | 针对0轴(各列)的统计汇总 |
适用于Series类型
方法 | 说明 |
---|---|
.argmin() .argmax() | 计算数据最大值、最小值所在位置的索引位置(自动索引) |
.idxmin() .idxmax() | 计算数据最大值、最小值所在位置的索引(自定义索引) |
3、数据的累计统计分析
方法 | 说明 |
---|---|
.cumsum() | 前n个数和 |
.cumprod() | 前n个数积 |
.cummax() | 前n个数最大值 |
.cummin() | 前n个数最小值 |
滚动计算(窗口计算)函数
方法 | 说明 |
---|---|
.rolling(w).sum() | 依次计算相邻w个元素的和 |
.rolling(w).mean() | 依次计算相邻w个元素的算数平均值 |
.rolling(w).var() | 依次计算相邻w个元素的方差 |
.rolling(w).std() | 依次计算相邻w个元素的标准差 |
.rolling(w).min() .rolling(w).max() | 依次计算相邻w个元素的最大值和最小值 |
4、分析数据相关性
相关分析函数
方法 | 说明 |
---|---|
.cov() | 计算协方差矩阵 |
.corr() | 计算相关系数矩阵,Pearson、Spearman、Kendall等系数 |
本文章总结于中国大学MOOC网的Python数据分析与展示课程。该网课老师为北京理工大学计算机学院的嵩天副教授