python|Python数据分析课程笔记·嵩天


Python数据分析课程笔记

  • Matplotlib
  • Numpy
  • Pandas

Matplotlib import matplotlib.pyplot as plt
plt.savefig(‘test’, dpi=500) 存储图片默认为PNG格式
plt.plot([1,2,3])
plt.plot([1,2,3],[3,5,7])
plt.ylable(“Grade”)
plt.axis([-1,10,0,6])横纵坐标尺度
plt.show()展示图片
pyplot绘图区域
plt.subplot(nrows,ncols,plot_number)几行几列第几个
plt.subplot(3,2,4)
plt.plot(x,y,format_string,**kwargs)
x,y:列表和数组
format_string:控制曲线的格式字符串,可选
**kwargs:第二组或更多(x,y,format_string)
控制中文字体:
第一种方法,全局更改:
matplotlib.rcParams[‘font.family’]= ‘SimHei’
font.family 字体名字
font.style 字体风格,normal或italic斜体
font.size 字体大小,整数字号或large x-small
第二种方法,部分修改:
plt.ylable(“Grade”,fontproperties= ‘SimHei’)
全区域文本显示函数:
plt.xlabel() plt.ylable()
plt.title() 图形整体增加文本标签
plt.text() 任意位置增加文本
plt.annotate() 图形中增加带箭头的注解
annotate(s,xy=arrow_crd,xytext=text_crd,arrowprops=dict)
arrow_crd 箭头所在位置
text_crd 文本显示位置
设计绘图的网格:
plt.subplot2grid()高级划定网格并选定区域
plt.subplot2grid(GridSpec,CurSpec,colspan=1,rowspan=1)
ax2 = pltsubplot2grid((3,3),(1,0),colspan=2)
总共划分为3*3的区域,第(1,0)区域处向右延申成长度为2的区域
ax3 = pltsubplot2grid((3,3),(1,2),rowspan=2)
ax1 = pltsubplot2grid((3,3),(0,0),colspan=3)
也可以配合使用GridSpec类
import matplotlib.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])
pyplot的基础16个图标函数:
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(data,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() 数据日期
#matplotlib测试·第一个图形 import matplotlib.pyplot as pltplt.plot([3, 1, 4, 5, 2]) plt.ylabel("grade") plt.show()

#极坐标 import numpy as np import matplotlib.pyplot as pltN = 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()

#散点图 import numpy as np import matplotlib.pyplot as pltfig, ax = plt.subplots() ax.plot(10 * np.random.randn(100), 10 * np.random.randn(100), 'o') ax.set_title('Simple Scatter')plt.show()

#pie饼图 import matplotlib.pyplot as pltlabels = '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.axis('equal')#变成圆圆的饼图 plt.show()

#hist直方图 import numpy as np import matplotlib.pyplot as pltnp.random.seed(0) mu, sigma = 100, 20# 均值,标准差 a = np.random.normal(mu, sigma, size=100)plt.hist(a, 40, density=1, histtype='stepfilled', facecolor='b', alpha=0.75) plt.title('Histogram') # 40bin代表直方图个数 plt.show()

#引力波实例 import numpy as np import matplotlib.pyplot as plt from scipy.io import wavfilerate_h, hstrain = wavfile.read(r"H1_Strain.wav", "rb") rate_l, lstrain = wavfile.read(r"L1_Strain.wav", "rb") # reftime, ref_H1 = np.genfromtxt('GW150914_4_NR_waveform_template.txt').transpose() reftime, ref_H1 = np.genfromtxt('wf_template.txt').transpose()# 使用python123.io下载文件htime_interval = 1 / rate_h ltime_interval = 1 / rate_l fig = plt.figure(figsize=(12, 6))# 丢失信号起始点 htime_len = hstrain.shape[0] / rate_h htime = np.arange(-htime_len / 2, htime_len / 2, htime_interval) plth = fig.add_subplot(221) plth.plot(htime, hstrain, 'y') plth.set_xlabel('Time (seconds)') plth.set_ylabel('H1 Strain') plth.set_title('H1 Strain')ltime_len = lstrain.shape[0] / rate_l ltime = np.arange(-ltime_len / 2, ltime_len / 2, ltime_interval) 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')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)

Numpy ndarray:
np.array()生成一个ndarray数组
对象属性:
.nidm 秩,轴的数量或维度的数量
.shape 对象的尺度,n行m列
.size 对象元素的个数,相当于.shape中n*m
.dtype 对象的元素类型
bool True或False
intc 与C语言中int类型一样,一般是int32,int64
intp 用于索引的整数,与C语言中ssize_t一致,int32或int64
int8 字节长度的整数 [-128,127]
int16 16位长度的整数 [-32768,32767]
int32 32位长度的整数 [-231,231-1]
int64 64位长度的整数 [-263,263-1]
uint8 8位无符号整数 [0,255]
uint16 16位无符号整数[0,65535]
uint32 32位无符号整数[0, 232-1]
uint64 64位无符号整数[0, 264-1]
float16 16位半精度浮点数:1位符号位,5位指数,10位尾数
float32 32位半精度浮点数:1位符号位,8位指数,23位尾数
float64 64位半精度浮点数:1位符号位,11位指数,52位尾数
complex64 复数类型,实部和虚部都是32位浮点数
complex128 复数类型,实部和虚部都是64位浮点数
.itemsize 对象中每个元素大小,单位:字节
非同质元素为对象类型 [[1,2],[1]]应避免使用
ndarray数组创建方法:
1.直接从Python中列表元组创建
x = np.array(list/tuple)
x = np.arrar(list/tuple, dtype=np.float32)指定数据类型
2.使用Numpy函数创建ndarray数组
np.arrange(n) 类似range函数,元素从0到n-1
np.ones(shape) 根据shape生成全1数组,shape是元组
np.zeros(shape) 根据shape生成全0数组,shape是元组
np.full(shape,vall) 根据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形状生成一个数组
np.linespace()根据起止数据等间距地填充数据,形成数组
>>>np.linespace(1,10,4) >>>[1.,4.,7.,10.]默认浮点 >>>np.linespace(1,10,4,endpoint=False)最后个元素不算 >>>[1,3.25,5.5,7.75]

np.concatenate((a,b))合并a,b数组
ndarray类型:
.reshape(shape)不改变元素,返回一个shape形状的数组,原不变
.resize(shape)与.reshape一致,但修改原数组
.swapaxes(ax1,ax2)将数组n个维度中两个维度进行调换
.flatten()对数组进行降维,返回折叠后的一维数组,原数组不变
new_a=a.astype(new_type)变换类型
ndarray数组向列表转换:
ls = a.tolist()
多维数组切片:
>>>a=array([[[ 0, 1, 2, 3], [ 4, 5, 6 , 7], [ 8, 9, 10, 11]],[[ 12, 13, 14, 15], [ 16, 14, 18, 19], [ 20, 21, 22, 23]]]) >>>a[:,1,-3] >>>array([5,17]) 分三个维度来取数据

元素级运算函数:
np.abs(x) np.fabs(x) 各元素取绝对值
np.sqrt(x) 各元素平方根
np.square(x) 各元素平方
np.log(x) np.log2(x) 各元素自然对数,2底对数
np.ceil(x) np.floor(x) 各元素的ceiling值或floor值
ceil 向上取整
floor不超过此值最大的整数值 向下取整
np.rint(x) 各元素四舍五入
np.modf(x) 各元素小数和整数部分以两个独立数组形式返回
np.cos(x) np.sin(x) np.tan(x)
np.exp(x) 各元素指数值
np.sign(x) 各元素符号值
np.maximum(x,y) np.fmax()
np.minimum(x,y) np.fmin()元素级最大值最小值计算
np.mod(x,y) 元素级模运算
np.copysign(x,y) 将y中各元素的符号赋值给数组x对应元素
CSV文件:
写入文件:np.savetxt(frame,array,fmt=‘%.18e’,delimiter=None)
frame文件,字符串或产生器 .csv
delimiter分割字符串,默认为空格
fmt格式%d
读入文件:
np.loadtxt(frame,dtype=np.float,delimiter=None,unpack=False)
delimiter分割字符串,默认为空格
非一维二维数据,更广阔的数据类型:
a.tofile(frame,sep= ‘’,format= ‘%s’)
frame:文件 .dat
sep: 分割字符串,如果为空,写入文件为二进制
format:写入数据的格式
np.fromfile(frame,dtype=float,count=-1,sep= ‘’)
【python|Python数据分析课程笔记·嵩天】Numpy便捷文件存取·可记录维数
np.save(fname,array)或np.savez(fname,array)
frame: 文件名.npy 压缩为.npz
np.load(fname)
Numpy随机数:
np.random.+
rand(d0,d1,…,dn) 生成浮点数,[0,1) 均匀分布
randn(d0,d1,…,dn) 生成浮点数,标准正态分布
randint(low[,high,shape])根据shape创建整数数组,范围[low,high)
seed(s) 随机数种子
shuffle(a) 根据数组a的第0轴进行随排列,改变数组x
permutation(a) 根据数组a的第0轴产生一个新数组,不改变数组x
choice(a[,size,replace,p]) 从一堆数组a中以概率p抽取元素,形成size形状新数组 replace表示是否可以重用元素,默认为False
uniform(low,high,size)均匀分布数组
normal(loc,scale,size)正态分布数组loc均值,scale标准差
poisson(lam,size)泊松分布数组,lam随机事件发生率
Numpy的统计函数:
np.
sum(a,axis=None) 根据定轴axis计算数组a相关元素和
mean(a,axis=None) 根据定轴axis计算数组a相关元素算数平均和(期望)
average(a,axis=None,weights=None) 根据定轴axis计算数组a相关元素的加权平均值
std(a,axis=None) 根据定轴axis计算数组a相关元素标准差
var(a,axis=None) 根据定轴axis计算数组a相关元素方差
min(a),max(a) 计算数组中最小值和最大值
argmin(a) argmax(a)计算数组中元素最小值,最大值的降一维后下标
unravel_index(index,shape)根据shape将一维下标转换成多维下标
ptp(a)计算数组中最大值与最小值的差
median(a)计算数组中元素的中位数
Numpy的梯度函数:
np.gradient(f) 计算数组f中元素的梯度,当f为多维时,返回每个维度的
#numpy测试 import numpy as npa = np.array([0, 1, 2, 3, 4]) b = np.array([9, 8, 7, 6, 5]) c = a ** 2 + b ** 3 print(c)

#手绘效果 from PIL import Image import numpy as npa = np.asarray(Image.open('1.png').convert('L')).astype('float')depth = 10.# (0-100) 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. / Avec_el = np.pi / 2.2# 光源的俯视角度,弧度值 vec_az = np.pi / 4.# 光源的方位角度,弧度值 dx = np.cos(vec_el) * np.cos(vec_az)# 光源对x 轴的影响 dy = np.cos(vec_el) * np.sin(vec_az)# 光源对y 轴的影响 dz = np.sin(vec_el)# 光源对z 轴的影响b = 255 * (dx * uni_x + dy * uni_y + dz * uni_z)# 光源归一化 b = b.clip(0, 255)im = Image.fromarray(b.astype('uint8'))# 重构图像 im.save('2.jpg')

#图像变换 from PIL import Image import numpy as npa = np.array(Image.open("1.jpg")) b = [255, 255, 255] - a im = Image.fromarray((b.astype('uint8'))) im.save("2.jpg")

Pandas import pandas as pd
两个数据类型:Series,DataFrame
Numpy 基础数据类型 关注数据的结构表达 维度:数据间关系
Pandas 扩展数据类型 关注数据的应用表达 数据与索引间的关系
Series类型:#一维带标签数据类型
自动索引 index_0 index_1
也可以自定义索引 ,index=[‘a’, ‘b’, ‘c’]
创建方式:
Python列表 标量值 Python字典 ndarray 其他函数
s = pd.Series(25,index=[‘a’, ‘b’])
s = pd.Series({‘a’:9, ‘b’:8})
n = pd.Series(np.arrange(5))
用户自定义索引和自动生成的索引都可以调用数据,是并存关系
b.index 取出索引
b.values 取出数据
操作方式:
切片[:]
取数值 b[]
取数值 in
取对应值 b.get(‘a’,100) 提取,若不存在则返回100
也可以直接对Series+Series 返回,索引相同的进行运算,不同的NaN
每一个Series都可以起名字 b.name = “Series对象”
DataFrame类型: #二维带标签数据类型
由索引加多类数据构成
index_0 → data_a data_1 data_w
index_0 → data_b data_2 data_x
纵向的称为index 横向的称为column 每列值类型可以不同
创建方式:
d = pd.DataFrame(np.arrange(10).reshape(2,5))
生成后会自动生成纵索引和横索引
从字典形式创建:
d = {‘one’:[1,2,3,4], ‘two’:[9,8,7,6]}
d = pd.DataFrame(d, index = [‘a’, ‘b’, ‘c’, ‘d’])
b.index 取出纵向索引
b.columns 取出横向索引
b.values 取出数据
b.[‘column’]取出一列
b.in[‘index_x’]取出一行
b[‘column’][‘index_x’]取出某个值
重新索引 .reindex()改变或重排Series和DataFrame索引
直接改变横或列的顺序
.reindex(index=None,columns=None,…):
index,columns 新的自定义索引顺序
fill_valus 重填索引,用于填充缺失位置的值
method 填充方法,ffill当前值向前填充,bfill向后填充
limit 最大填充量
copy 默认True,生成新的对象,False时,新旧相等不复制
索引类型的常用方法:d.index.+
.append(idx) 连接另一个Index对象,产生新的Index对象
.diff(idx) 计算差集,产生新的Index对象
.intersection(idx) 计算交集
.union(idx) 计算并集
.delete(idx) 删除loc位置处的元素
.insert(loc,e) 在loc位置增加一个元素e
删除索引: .drop() 删除指定行或者索引列axis=1来删除二维数据的第一列
数据类型的算术运算:计算结果为float
.add(d,**argws)加
.sub(d,**argws)减
.mul(d,**argws)乘
.div(d,**argws)除
fill_value = https://www.it610.com/article/100 NaN部分用100填充
进行广播运算,不同维度默认在1轴
数据排序:
.sort_index()方法在指定轴上根据索引进行排序,升序
.sort_index(axis=0,ascending=True升序为True,降序为False)
.sort_values(axis=0,ascending=True)根据数值进行排序,默认升序
Series.sort_values(axis=0,ascending=True)
DataFrame.sort_values(by,axis=0,ascending=True)
by:axis轴上的某个索引或索引列表
NaN统一放到末尾
基本的统计分析函数:
适用于Series和DataFrame类型:
.sum() 计算数据的总和,按0轴计算,下同
.count() 非NaN值的数量
.mean() .median() 计算数据的算数平均值,算术中位数
.var() .std() 计算数据方差,标准差
.min() .max() 计算数据的最小值,最大值
.describe() 针对0轴(各列)的统计汇总
适用于Series类型:
.argmin() .argmax() 计算数据最大值,最小值所在位置的索引位置
.idxmin() .idxmax()计算数据最大值,最小值所在位置的索引(自定义)
累计统计分析函数:
适用于Series和DataFrame类型:
.cumsum() 依次给出前1,2,…,n个数的和
.cumprod() 依次给出前1,2,…,n个数的积
.cummax() 依次给出前1,2,…,n个数的最大值
.cummin() 依次给出前1,2,…,n个数的最小值
适用于Series和DataFrame类型,滚动计算:
.rolling(w).sum() 依次计算相邻w个元素的和
.rolling(w).mean() 依次计算相邻w个元素的算术平均值
.rolling(w).var() 依次计算相邻w个元素的方差
.rolling(w).std() 依次计算相邻w个元素的标准差
.rolling(w).min() .max()依次计算相邻w个元素的最小值最大值
相关分析函数:
适用于Series和DataFrame类型:
.cov() 计算协方差矩阵
.corr() 计算相关系数矩阵,Pearson,Spearman,Kendall等系数
#Pandas库小测 import pandas as pdd = pd.Series(range(20)) print(d) print(d.cumsum())

#探索Series import pandas as pda = pd.Series([9, 8, 7, 6]) print(a) b = pd.Series([5, 4, 3], index=['a', 'b', 'c']) print(b)

    推荐阅读