Python数据分析与展示

搭建环境

安装numpyscipymatplotlibipythonpandas等必要包

1
pip install numpy scipy matplotlib ipython jupyter pandas sympy nose

安装Spyder3

1
pip install spyder

或者直接安装集成环境anaconda

数据分析——表示

一、Numpy库入门

Numpy的引用

1
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列表、元组等类型创建
1
2
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的列表类似

1
2
3
4
5
6
7
a = np.array([9, 8, 7, 6, 5])

#索引
a[2]

#切片
a[ 1: 4: 2 ] # 起始编号:终止编号(不含):步长,三元素冒号分割

img

多维数组的索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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] # 每个维度可以使用步长跳跃切片

img
索引

img
切片

4、ndarray数组的运算

数组与标量之间的运算:作用于数组每一个元素

1
2
3
# 计算a与元素平均值的商
a = np.arange(24).reshape((2, 3, 4))
a = a / a.mean()

a
img

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文件存取

1
2
# 存储
np.savetxt(fname, array, fmt='%.18e', delimiter=None)
  • fname:文件、字符串或生成器,可以是.gz或.bz2的压缩文件
  • array:存入文件的数组
  • fmt:写入文件的格式,例如:%d %.2f %.18e
  • delimiter:分割字符串,默认是任何空格
1
2
a = np.arange(100).reshape(5, 20)
np.savetxt('a.csv', a, fmt='%d', delimiter=',')

img
csv

1
2
# 读取
np.loadtx(fname, dtype=np.float, delimiter=None, unpack=False)
  • fname:文件、字符串或生成器,可以是.gz或.bz2的压缩文件
  • dtype:数据类型,可选
  • delimiter:分割字符串,默认是任何空格
  • unpack:如果True,读入属性将分别写入不同变量
1
b = np.loadtxt('a.csv', delimiter=',')

img

CSV只能有效存储一维和二维数组

2、多维数据的存取

1
2
# 存储
a.tofile(fname, sep='', format='%s')
  • fname:文件、字符串
  • sep:数据分割字符串,如果是空串,写入文件为二进制
  • format:写入数据的格式
1
2
a = np.arange(100).reshape(5, 20)
a.tofile("b.dat", sep=",", format='%d')

img
dat

1
2
# 读取
np.fromfile(fname, dtype=float, count=-1, sep='')
  • fname:文件、字符串
  • dtype:读取的数据类型
  • count:读入元素个数,-1表示读入整个文件
  • sep:数据分割字符串,如果是空串,写入文件为二进制
1
c = np.fromfile("b.dat", dtype=np.int, sep=",")

img

该方法需要读取时知道存入文件时的维度和元素类型
a.tofile()np.fromfile()需要配合使用
可以通过元数据文件来存储额外信息

Numpy的便捷文件存取

1
2
3
4
# 存储
np.save(fname, array)

np.savez(fname, array)
  • fname:文件名,以.npy为扩展名,压缩扩展名为.npz
  • array:数组变量
1
2
# 读取
np.load(fname)
  • fname:文件名,以.npy为扩展名,压缩扩展名为.npz

3、Numpy的随机数函数

Numpy的随机数子库——random子库

1
2
3
4
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直接提供的统计类函数

1
2
3
4
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中元素的中位数
1
2
3
4
5
6
7
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)

img

1
2
3
4
5
6
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)

img

5、Numpy的梯度函数

函数 说明
np.gradient(f) 计算数组f中元素的梯度,当f为多维时,返回每个维度梯度

梯度:连续值之间的变化率,即斜率

实例:图像手绘效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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)

img
newimg

数据分析——展示

一、Matplotlib库入门

1、Matplotlib库介绍

Matplotlib库效果:http://matplotlib.org/gallery.html

Matplotlib库的使用

Matplotlib库由各种可视化类构成,内部结构复杂,受MATLAB启发。

matplotlib.pyplot是绘制各种可视化图形的命令子库,相当于快捷方式。

1
import matplotlib.pyplot as plt

pyplot的绘图区域

1
2
# 在全局绘图区域中创建一个分区体系,并定位到一个子绘图区域
plt.subplot(nrows, ncols, plot_number)

nrows横轴数量,ncols纵轴数量,plot_number绘图区域

2、pyplot的plot()函数

1
plt.plot(x, y, format_string, **kwargs)
参数 说明
x X轴数据,列表或数组,可选
y Y轴数据,列表或数组
format_string 控制曲线的格式字符串,可选
**kwargs 第二组或更多组(x,y,format_string)

当绘制多条曲线时,各条曲线的x不能省略

1
2
3
4
5
6
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()

img

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中文显示

第一种方法

1
2
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

1
2
3
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() 在图形中增加带箭头的注释
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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()

img

1
plt.annotate(s, xy=arrow_crd, xytext=text_crd, arrowprops=dict)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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()

img

4、pyplot的子绘图区域

1
plt.subplot2grid(GridSpec, CurSpec, colspan=1, rowspan=1)

设定网格,选中网格,确定选中行列区域数量,编号从0开始

GridSpec类

1
2
3
4
5
6
7
8
9
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饼图的绘制

1
2
3
4
5
6
7
8
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()

img

3、pyplot直方图

1
2
3
4
5
6
7
8
9
10
11
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()

img

4、pyplot极坐标图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 这里使用了面向对象的方式绘制极坐标图,也可以跟之前一样使用函数式绘制
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()

img

5、pyplot散点图

1
2
3
4
5
6
7
8
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()

img

三、实例:绘制引力波

引力波数据源:
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
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)

Gravitational_Waves_Original

数据分析——概要

一、Pandas库入门

1、Pandas库介绍

Pandas官网

Pandas库的引用

Pandas是Python第三方库,提供高性能易用数据类型和分析工具

1
import pandas as pd

Pandas基于NumPy实现,常与NumPy和Matplotlib一同使用

Pandas库的理解

  • 两个数据类型
    • Seies
    • DataFrame
  • 基于上述数据类型的各种操作
    • 基本操作
    • 运算操作
    • 特征类操作
    • 关联类操作
NumPy和Pandas对比
NumPy Pandas
基础数据类型 扩展数据类型
关注数据的结构表达 关注数据的应用表达

2、Pandas库的Series类型

Series类型

由一组数据及与之相关的数据索引组成

1
2
3
4
5
index_0 --> data_a  
index_1 --> data_b
index_1 --> data_b
index_1 --> data_b
索引 --> 数据

一维带标签的数组

img

img
自定义索引

Series类型可以由以下类型创建
  • Python列表
  • 标量值
  • Python字典
  • ndarray
  • 其他函数
从标量值创建

img

从字典类型创建

img
img

从ndarray类型创建

img
img

Serires类型的基本操作
  • Series类型包括index和values两部分
  • Series类型的操作类似ndarray类型
    • 索引方法相同,采用[]
    • NumPy中运算和操作可用于Series类型
    • 可以通过自定义索引的列表进行切片
    • 可以通过自动索引进行切片,如果存在自定义索引,则一同被切片
  • Series类型的操作类似Python字典类型
    • 通过自定义索引访问
    • 保留字in操作
    • 使用.get()方法

img
img
img
img

Series类型对齐问题

Series + Series
img

Series类型在运算中会自动对齐不同索引的数据

Series类型的name属性

Series对象和索引都可以有一个名字,存储在属性.name

img

Series类型的修改

Series对象可以随时修改并立即生效

img

3、Pandas库的DataFrame类型

DataFrame类型

DataFrame类型由共用相同索引的一组列组成

img
索引+多列数据构成

  • DataFrame是一个表格型的数据类型,每列值类型可以不同
  • DataFrame基友行索引,也有列索引
  • DataFrame常用于表达二维数据,但也可以表达多维数据
  • DataFrame类型可以由以下类型创建
    • 二维ndarray对象
    • 一维ndarray、列表、字典、元祖或Series构成的字典
    • Series类型
    • 其他DataFrame类型
从二维ndarray对象创建

img

从一维ndarray对象字典创建

img

从列表类型的字典创建

img
img

4、Pandas库的数据类型操作

  • 增加或重排:重新索引
  • 删除:drop

重新索引

.reindex()能够改变或重排Series和DataFrame索引

img

1
.reindex(index=None, columns=None, ...)
参数 说明
index, columns 新的行列自定义索引
fill_value 重新索引中,用于填充缺失位置的值
method 填充方法,ffill当前值向前填充,bfill向后填充
limit 最大填充量
copy 默认True,生成新的对象,False时,新旧相等不复制

img

索引类型

img

  • Series和DataFrame的索引是Index类型
  • Index对象是不可修改类型
方法 说明
.append(idx) 连接另一个Index对象,产生新的Index对象
.diff(idx) 计算差集,产生新的Index对象
.intersection(idx) 计算交集
.union(idx) 计算并集
.delete(loc) 删除loc位置处的元素
.insert(loc, e) 在loc位置增加一个元素e

img

直接按照教程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指定行或列索引
img
img

5、Pandas库的数据类型运算

算数运算法则

  • 算术运算根据行列索引,补齐后运算,运算默认产生浮点数
  • 补齐时缺项填充NaN
  • 二维和一维、一维和零维间为广播运算
  • 采用+-*/符号进行的二元运算产生新的对象

img
img

方法 说明
.add(d, **argws) 类型间加法运算,可选参数
.sub(d, **argws) 类型间减法运算,可选参数
.mul(d, **argws) 类型间乘法运算,可选参数
.div(d, **argws) 类型间除法运算,可选参数

img
fill_value参数代替NaN,替代后参与运算

img
不同维度间为广播运算,一维Series默认在轴1参与运算

img
使用运算方法可以令一维Series参与轴0运算

比较运算

  • 比较运算只能比较相同索引的元素,不进行补齐
  • 二维和一维、一维和零维间为广播运算
  • 采用> < >= <= == !=等符号进行的二元运算产生布尔对象

img
img
同纬度运算,尺寸一致

img
不同纬度,广播运算,默认在1轴

二、Pandas数据特征分析

1、数据的排序

  • .sort_index()方法在指定轴上根据索引进行排序,默认升序
    • .sort_index(axis=0, ascending=True)
      img
  • .sort_values()方法在指定轴上根据数值进行排序,默认升序
    • Series.sort_values(axis=0, ascending=True)
    • DataFrame.sort_values(by, axis=0, ascending=True)
    • by:axis轴上的某个索引或索引列表
      img
  • NaN同意放到排序末尾

2、数据的基本统计分析

适用于Series和DataFrame类型

方法 说明
.sum() 计算数据的总和,按0轴就算,下同
.count() 非NaN值的数量
.mean() .median() 计算数据的算数平均值、算数中位数
.var() .std() 计算数据的方差、标准差
.min() .max() 计算数据的最小值、最大值
describe() 针对0轴(各列)的统计汇总

适用于Series类型

方法 说明
.argmin() .argmax() 计算数据最大值、最小值所在位置的索引位置(自动索引)
.idxmin() .idxmax() 计算数据最大值、最小值所在位置的索引(自定义索引)

img

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、分析数据相关性

img

相关分析函数

方法 说明
.cov() 计算协方差矩阵
.corr() 计算相关系数矩阵,Pearson、Spearman、Kendall等系数

本文章总结于中国大学MOOC网Python数据分析与展示课程。该网课老师为北京理工大学计算机学院的嵩天副教授

谢谢观众姥爷们的支持鼓励qwqありがとうございます~