数据分析项目一“探索未来气候发展趋势

# 数据分析项目一“探索未来气候发展趋势” ## 一、概览 概览 在这个项目中,我们将分析本地和全球的气温数据,并比较你居住地的气温走向与全球气温走向。作者位于云南昆明。 使用的工具 整个项目使用的工具包括SQL、Python。其中数据收集时用到了SQL,数据整理、数据可视化与数据分析均采用Python。 ## 二、数据收集 ### 使用的工具:SQL 首先从气温数据库中提取数据,然后将结果下载为 CSV 文件。 编写一个 SQL 查询来提取城市级别的数据,导出为CSV。 select * from city_list where country=’China’ order by city; –Kunming,China SQL语句为:select * from city_data where country=’China’ and city=’Kunming’ order by year; 编写一个 SQL 查询来提取全球数据,导出为CSV。 SQL语句为:select * from global_data order by year; ##三、读入数据
#配置工作目录
import os
os.chdir(r'C:\Users\Administrator\Desktop\数据分析(入门)-正式班-项目一“探索未来气候发展趋势”') # 将当前工作目录改变为`/Users//Desktop/`
print(os.getcwd()) # 打印当前工作目录
C:\Users\Administrator\Desktop\数据分析(入门)-正式班-项目一“探索未来气候发展趋势”
import csv
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.ticker import MultipleLocator, FormatStrFormatter  #设置图表刻度值时用到
oridata_Kunming = pd.read_csv('ori_Kunming.csv')
oridata_Global = pd.read_csv('ori_Global.csv')
#检查数据缺失值情况
#oridata_Kunming.isnull().sum()
#oridata_Global.isnull().sum()
#查看数据概况
oridata_Kunming.info()   #数据范围:1914-2013,有10个缺失
oridata_Kunming.describe()
#oridata_Global.info()   #数据范围:1882-2015,无缺失
#oridata_Global.describe()
##四、数据整理 ###缺失值处理
# 定义一个数据预处理函数,将缺失值采用左右最邻近5个非空值的均值进行替换
# function: 传入数组中的空值处理,将空值None采用左右最近的5个非空数的平均值进行替换
# input: 一组ndarray数组
# return: 输入数组,在传入数组上updata
def coprocessing(data):
    kc=5   #窗口长度
    for i in range(len(data)):
        if np.isnan(data[i]):
            #print("{}:{}:{}".format("finded a None to process",i,data[i]))  #test point
            a=i
            b=i
            du=[0,0,0,0,0]  #窗口数据
            k=0 #窗口数据索引
            while k1
                a=a+1
                #print("{}::{}:{},{}:{},{}:{},{}:{}".format("before:","i",i,"a",a,"b",b,"k",k))  #test point
                if kand b>=0 and (~np.isnan(data[b])):
                    du[k]=data[b]
                    k=k+1
                    #print("{}:{}".format("finded b valid number",data[b]))  #test point
                if kand aand (~np.isnan(data[a])):
                    du[k]=data[a]
                    k=k+1
                    #print("{}:{}".format("finded a valid number",data[a]))  #test point
                if b<0 and a>=len(data):
                    break
                #print("{}::{}:{},{}:{},{}:{},{}:{}".format("after:","i",i,"a",a,"b",b,"k",k))  #test point
            #窗口数据存入du,剔零
            print(du)  #test point
            while 0 in du:
                du.remove(0)
            #窗口数据的均值替换原数据中的None
            dy=sum(du)/len(du)
            #print("{}:{}".format("Changed the None to",dy))  #test point
            data[i]=dy
            #print(data)   #test point
    return data
### 处理昆明的缺失值
#数据预处理
coprocessing(oridata_Kunming['avg_temp'].values)  #预处理
oridata_Kunming['avg_temp'].values[np.isnan(oridata_Kunming['avg_temp'].values)]  #检查
array([], dtype=float64) 从上述输出结果可见,原始数据中的缺失值已按照我们定义的算法进行了替换,昆明的年平均气温已经没有缺失值了。但我们有必要就预处理对原始数据的整体影响情况进一步分析,判断我们采取的预处理算法是否合理,具体如下:
oridata_Kunming.describe()
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
year avg_temp
count 198.000000 198.000000
mean 1914.500000 14.458976
std 57.301832 0.666006
min 1816.000000 8.420000
25% 1865.250000 14.168764
50% 1914.500000 14.425000
75% 1963.750000 14.770000
max 2013.000000 16.530000
####与预处理前进行比较,我们可以看出:预处理算法并没有改变昆明年平均气温最低值8.42和最高值16.53,平均值由原来的14.473改变为14.459,且填充的缺失值也都在14.0~14.2区间,在平均值的偏下方,与前后历史数据相比,是较为合理的。因此,我们认为,特定于昆明的数据集,我们采用最邻近5个非零值的均值替换,这种处理是可以接受的。 根据前面的数据概况,鉴于全球的数据集并不存在缺失值的情况,因此,无需对全球的数据集进行预处理。 ##五、数据可视化与分析 ###第一步,首先绘制昆明的年均值曲线及其移动平均值线 说明:本次项目分析考虑使用Python完成,不使用Excel,因此上网查到了Python计算移动平均值的方案,即采用numpy中的卷积函数convolve()计算。笔者只需要在截取区间的时候控制得当即可(该函数的计算结果需自行查看一下,否则难以理解如何截取有效值)。 另外,在决定如何可视化气温走向时,我主要考虑的因素是:第一点鉴于全球和昆明的数据范围不同,因此需截取相对合理的数据区间(以两个数据集中的较窄的一组为基准,即昆明)进行可视化;第二点是为利于比较分析,将全球和昆明的气温移动平均值绘制到同一张图中。
#计算移动平均值
#定义移动窗口和权重
N=5
n=np.ones(N)
weights=n/N
#调用convolve函数,计算移动平均值。
sp1=oridata_Kunming['avg_temp'].values   #年平均值(原数据集区间:1816-2013,共计198个值),下一步绘图时仅截取1820-2013,共计194个值
sma1=np.convolve(weights,sp1)[N-1:-N+1]   #移动平均值,并截取1820-2013,共计194个值
参考文献:https://blog.csdn.net/qq_24330285/article/details/51594334 ####分析:综合考虑昆明数据集(1816-2013)和全球数据集(1750-2015),以及计算移动平均值的移动窗口宽度(5),为尽可能完全透视数据集,充分发挥数据价值,我们截取1820-2013年的时间区间进行绘图。
#plt.title('昆明年平均值、移动平均值')
t1=oridata_Kunming['year'].values[N-1:]  #1820-2013,共计194个值
xmajorLocator   = MultipleLocator(10) #将x主刻度标签设置为10的倍数
xmajorFormatter = FormatStrFormatter('%d') #设置x轴标签文本的格式
xminorLocator   = MultipleLocator(5) #将x轴次刻度标签设置为5的倍数
ymajorLocator   = MultipleLocator(0.5) #将y轴主刻度标签设置为0.5的倍数
ymajorFormatter = FormatStrFormatter('%1.1f') #设置y轴标签文本的格式
yminorLocator   = MultipleLocator(0.5) #将此y轴次刻度标签设置为0.5的倍数

plt.rcParams['font.sans-serif']=['SimHei'] #解决标题中文显示问题
plt.figure(figsize=(18,6))
ax = plt.subplot(111) #注意:一般都在ax中设置,不再plot中设置
ax.set_title('图1 昆明气温年均值、移动平均值曲线')
plt.plot(t1,sp1[N-1:],lw=1,color="blue",label=u'y=kunming year average')
plt.plot(t1,sma1,lw=2,color="red",label=u'y=kunming mobile average')
plt.xlabel(u"year:1820-2013")
plt.ylabel(u"Weather Value")
#设置主刻度标签的位置,标签文本的格式
ax.xaxis.set_major_locator(xmajorLocator)
ax.xaxis.set_major_formatter(xmajorFormatter)
ax.yaxis.set_major_locator(ymajorLocator)
ax.yaxis.set_major_formatter(ymajorFormatter)
#显示次刻度标签的位置,没有标签文本
ax.xaxis.set_minor_locator(xminorLocator)
ax.yaxis.set_minor_locator(yminorLocator)
ax.xaxis.grid(True, which='major') #x坐标轴的网格使用主刻度
ax.yaxis.grid(True, which='minor') #y坐标轴的网格使用次刻度
plt.legend() #让图例生效
plt.show()

数据分析项目一“探索未来气候发展趋势_第1张图片

oridata_Kunming[oridata_Kunming.year==2013]
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
year city country avg_temp
197 2013 Kunming China 16.53

分析:从上图可以看出,移动平均值线比年均值曲线更为平缓,对一些显著的异常点进行了平滑处理,能够更为真实的展示年均温度走向。

###第二步,然后绘制全球的年均值曲线及其移动平均值线
#计算移动平均值
#定义移动窗口和权重
N=5
n=np.ones(N)
weights=n/N
#调用convolve函数,计算移动平均值。
sp2=oridata_Global['avg_temp'].values   #年平均值(原数据集区间:1750-2015,共计266个值),下一步绘图时仅截取1754-2015,共计262个值
sma2=np.convolve(weights,sp2)[N-1:-N+1]   #移动平均值,并截取1754-2015,共计262个值
#plt.title('全球年平均值、移动平均值')
xmajorLocator   = MultipleLocator(10) #将x主刻度标签设置为10的倍数
xmajorFormatter = FormatStrFormatter('%d') #设置x轴标签文本的格式
xminorLocator   = MultipleLocator(5) #将x轴次刻度标签设置为5的倍数
ymajorLocator   = MultipleLocator(0.5) #将y轴主刻度标签设置为0.5的倍数
ymajorFormatter = FormatStrFormatter('%1.1f') #设置y轴标签文本的格式
yminorLocator   = MultipleLocator(0.1) #将此y轴次刻度标签设置为0.1的倍数

t2=oridata_Global['year'].values[N-1:]  #截取1754-2015,共计262个值
plt.rcParams['font.sans-serif']=['SimHei'] #解决标题中文显示问题
plt.figure(figsize=(18,6)) # 设定画图板尺寸
ax = plt.subplot(111) #注意:一般都在ax中设置,不再plot中设置
ax.set_title('图2 全球气温年均值、移动平均值曲线')
plt.plot(t2,sp2[N-1:],lw=1,color="blue",label=u'y=global year average')
plt.plot(t2,sma2,lw=2,color="red",label=u'y=global mobile average')
plt.xlabel(u"year:1754-2015")
plt.ylabel(u"Weather Value")
#设置主刻度标签的位置,标签文本的格式
ax.xaxis.set_major_locator(xmajorLocator)
ax.xaxis.set_major_formatter(xmajorFormatter)
ax.yaxis.set_major_locator(ymajorLocator)
ax.yaxis.set_major_formatter(ymajorFormatter)
#显示次刻度标签的位置,没有标签文本
ax.xaxis.set_minor_locator(xminorLocator)
ax.yaxis.set_minor_locator(yminorLocator)
ax.xaxis.grid(True, which='major') #x坐标轴的网格使用主刻度
ax.yaxis.grid(True, which='minor') #y坐标轴的网格使用次刻度
plt.legend() #让图例生效
plt.show()


数据分析项目一“探索未来气候发展趋势_第2张图片

分析:从全球趋势来看,二十世纪以前,全球气温呈巨幅波动趋势,但全球平均气温基本保持不变。但自进入二十世纪中叶,尤其是1970年以后,全球气温呈持续上升态势,自1970年8.7°上升至2015年9.83°,全球气温上升了1.13°。

oridata_Global[oridata_Global.year==1862]
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
year avg_temp
112 1862 7.56

第三步,最后以移动平均值线为基准,绘制昆明和全球的移动平均值线

分析:鉴于昆明移动平均线的有效时间区间为1820-2013共计194个值,全球的为1754-2015共计262个值,为增强数据可视化结果的可读性和比较性,决定统一截取昆明、全球的1820-2013年共计194个值进行曲线叠加绘制。

t2_1=t2[len(t2)-2-194:len(t2)-2]
sma2_1=sma2[len(sma2)-2-194:len(sma2)-2]
#plt.title('昆明、全球的移动平均值')
xmajorLocator   = MultipleLocator(10) #将x主刻度标签设置为20的倍数
xmajorFormatter = FormatStrFormatter('%d') #设置x轴标签文本的格式
xminorLocator   = MultipleLocator(10) #将x轴次刻度标签设置为5的倍数
ymajorLocator   = MultipleLocator(0.5) #将y轴主刻度标签设置为0.5的倍数
ymajorFormatter = FormatStrFormatter('%1.1f') #设置y轴标签文本的格式
yminorLocator   = MultipleLocator(0.5) #将此y轴次刻度标签设置为0.1的倍数

plt.figure(figsize=(18,6))
ax = plt.subplot(111) #注意:一般都在ax中设置,不再plot中设置
ax.set_title('图3 全球和昆明移动平均值曲线')
plt.plot(t1,sma1,lw=1,color="blue",label=u'y=kunming mobile average')
plt.plot(t2_1,sma2_1,lw=2,color="red",label=u'y=global mobile average')
plt.xlabel(u"year:1820-2013")
plt.ylabel(u"Weather Value")

#设置主刻度标签的位置,标签文本的格式
ax.xaxis.set_major_locator(xmajorLocator)
ax.xaxis.set_major_formatter(xmajorFormatter)
ax.yaxis.set_major_locator(ymajorLocator)
ax.yaxis.set_major_formatter(ymajorFormatter)
#显示次刻度标签的位置,没有标签文本
ax.xaxis.set_minor_locator(xminorLocator)
ax.yaxis.set_minor_locator(yminorLocator)
ax.xaxis.grid(True, which='major') #x坐标轴的网格使用主刻度
ax.yaxis.grid(True, which='minor') #y坐标轴的网格使用次刻度
plt.legend() #让图例生效
plt.show()


数据分析项目一“探索未来气候发展趋势_第3张图片

从分析来看,自1820年至2013年,昆明的年均气温为14.45°,全球的年均气温为8.44°,昆明比全球平均气温高出6°左右。从上图也可以看出,昆明的气温一直高于全球气温。

气温走向相似性/差异性方面的问题一:根据已有监测数据,全球气候变化呈何种趋势?

问题一观察结论:

数据概况:全球气候年均值的数据集包括1750~2015年共计266个值,经过移动平均值后数据集为1754~2015年共计262个值。

分析结论:单独研究上面显示全球气候变化的图2,可以看出,在二十世纪以前,全球气温变化的振幅较大,但总体都在7~9之间上下波动,全球气候基本平衡。自进入二十世纪中叶,尤其是1970年以后,全球气候温度虽然逐年波动幅度不大,但总体呈现持续上升的趋势,自1970年的8.7°上升至2015年的9.83°,上升了1.13°,绝对涨幅12.99%,涨幅较大。全球气候温度在最近40年以来呈现总体持续上升、涨幅较快的情况,是一个非常值得关注的情况,地球温度的上升会导致冰川融化、海平面上升以及随着引发的一系列环境变化问题,可能会影响生态平衡,甚至导致物种的灭绝,最终影响和改变了人类赖以生存的环境。

气温走向相似性/差异性方面的问题二:根据已有监测数据,昆明气候变化呈何种趋势?

问题二观察结论:

数据概况:昆明气候年均值的数据集包括1816~2013年共计198个值,其中的10个缺失值,我们采用最邻近5个非零值取均值的方式处理替换,通过前面的分析,我们认为针对该数据集采取这种方式处理是比较合理的;经过移动平均值后数据集为1820~2013年共计194个值。
分析结论:单独研究上面显示昆明气候变化的图1,可以看出,自1816~2000年的近200年间,昆明的年平均气候温度变化不大,基本围绕14°上下波动。自2000年起,年均气温有持续上升的趋势,自2000年的14.53°上升至2013年的16.53°,上升了2°,绝对涨幅13.76%,涨幅较大。

气温走向相似性/差异性方面的问题三:根据已有监测数据,昆明与全球的气候变化趋势有何相似性?

问题三观察结论:

1930年以前,全球年均气温基本在8.5°以下徘徊,昆明年均气温基本在14.5°以下徘徊,在此之后,全球年均气温保持在8.5°以上,昆明年均气温保持在14.5°以上。自1980年以后,全球气温和昆明气温均呈现出较为明显的总体持续上升趋势,在数据集的末尾处,2013年,均达到了历史峰值,全球年均气温9.83°,昆明年均16.53°。这体现出了全球与昆明年均气温变化趋势的相似性。

气温走向相似性/差异性方面的问题四:根据已有监测数据,昆明与全球的气候变化趋势有何显著差异?

问题四观察结论:

通过前面的分析,我们知道昆明的气温比全球气温均值高出6°左右,气温走向呈总体一致。不同的是,我们注意到在1862年,昆明的年均气温出现了该地区历史上的低位8.42°,而当年全球平均气温7.56°,属于正常水平,这是昆明年均气温与全球年均气温最为接近的一年。查阅网络,我们难以考证历史上这一年昆明发生了什么,为什么气温会低于历史年均气温6°,当然,不排除这可能是一个异常点。

你可能感兴趣的:(数据分析类,数据分析,气候变化,python,移动平均线,数据可视化)