这是接昨天的推文,昨天的推文中我用来分析的数据是自己手动输入的少量数据,但是现实中我们需要的数据可能比较大,因此被存储在电子表格中,我们就需要把数据读取并提取需要的内容进行分析,好吧,开始吧,拉次够
首先我们把本次实验所需要的库导入,有pandas,matplotlib,和scipy,他们的作用分析+绘图
import matplotlib.pyplot as pltimport pandas as pd#import numpy as np#from pylab import*from scipy import signal
在Python中,读取excel的xlsx格式数据需要用到pandas库中的read_excel模块,如下,我们来把数据读取进来
tem = pd.read_excel("D:\LIUCAS\Python\TEM.xlsx")
然后我们可以使用潘大师看看数据长啥样
print(tem.shape)#康康tem这个xlsx数据的维度,显示为696行和3列print(tem.columns)#揭开他的面纱看看长啥样(列INDEX),第一列是year,第二列是month,第三列是tem#print(tem.head or tail(X))查看前or后X行,tail有尾巴的意思print(tem.head(300))#瞅瞅前300行啥样,300x3的维度结构
上面,我们已经把xlsx数据读取进来了,但是现实情况是我需要其中的某一列数据来进行分析,在web查阅了相关资料后,其实不难,如下
year = pd.read_excel('TEM.xlsx',skiprows=0)['year']#读取时间,这里的0是指第一行temdata = pd.read_excel('TEM.xlsx',skiprows=0)['tem']#读取tem值
分别把时间和tem读取进来,需要注意的是0值在这里是指第一行,而非第0行
数据读取完毕,现在进行分析step吧
使用scipy库中的detrend函数进行原始数据的去趋势处理:
tem_det=signal.detrend(temdata,axis=-1, type='linear', bp=1)#scipy的signal。detrend模块去趋势,参数后面可选
接下来我们分别构建高通滤波和低通滤波,如下:
m, n = signal.butter(8, 0.2, 'highpass')#构建高通滤波,参数分别是滤波阶数,临界频率和typex, y = signal.butter(8, 0.2, 'lowpass')#F_high = signal.filtfilt(m, n, tem_det,axis = 0)#高通滤波F_low = signal.filtfilt(x, y, tem_det,axis = 0)#低通滤波
上述的数据提取和分析部分就ok了,但是我想把这里的4张图都画在一张纸上,因此我们需要学习一下子图subplot函数的使用,如下:
fig = plt.figure(figsize=(3,3),dpi=100)#建一个画布来画图ax1 = fig.add_subplot(221)plt.plot(year,temdata,c = 'k')#原始数据plt.title('Raw Data')ax2 = fig.add_subplot(222)plt.plot(year,tem_det,c = 'g')#去趋势数据plt.title('Detrend')ax3 = fig.add_subplot(223)plt.plot(year,F_high,c = "r")#高通滤波plt.title('Highpass')ax4 = fig.add_subplot(224)plt.plot(year,F_low,c = "b")#低通滤波plt.title('Lowpass')
先建一个fig画布,长宽为3x3,分辨率为300dpi,设置大的话耗时长
ax1 = fig.add_subplot(221)
建立第一个子图,221代表的的行列和序号,这里就是2x2=4个子图,序号是第1个位置,可以用一个示意图很直观的理解,如下示意图
最后想要看到图的话,需要plt.show()一下,搞定。结果图如下: