本文主要是介绍数据分析项目一“探索未来气候发展趋势,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
# 数据分析项目一“探索未来气候发展趋势” ## 一、概览 概览 在这个项目中,我们将分析本地和全球的气温数据,并比较你居住地的气温走向与全球气温走向。作者位于云南昆明。 使用的工具 整个项目使用的工具包括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/<username>/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 pointa=ib=idu=[0,0,0,0,0] #窗口数据k=0 #窗口数据索引while k<kc:b=b-1a=a+1#print("{}::{}:{},{}:{},{}:{},{}:{}".format("before:","i",i,"a",a,"b",b,"k",k)) #test pointif k<kc and b>=0 and (~np.isnan(data[b])):du[k]=data[b]k=k+1#print("{}:{}".format("finded b valid number",data[b])) #test pointif k<kc and a<len(data) and (~np.isnan(data[a])):du[k]=data[a]k=k+1#print("{}:{}".format("finded a valid number",data[a])) #test pointif b<0 and a>=len(data):break#print("{}::{}:{},{}:{},{}:{},{}:{}".format("after:","i",i,"a",a,"b",b,"k",k)) #test point#窗口数据存入du,剔零print(du) #test pointwhile 0 in du:du.remove(0)#窗口数据的均值替换原数据中的Nonedy=sum(du)/len(du)#print("{}:{}".format("Changed the None to",dy)) #test pointdata[i]=dy#print(data) #test pointreturn 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()
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 |
#计算移动平均值
#定义移动窗口和权重
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()
oridata_Kunming[oridata_Kunming.year==2013]
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()
分析:从全球趋势来看,二十世纪以前,全球气温呈巨幅波动趋势,但全球平均气温基本保持不变。但自进入二十世纪中叶,尤其是1970年以后,全球气温呈持续上升态势,自1970年8.7°上升至2015年9.83°,全球气温上升了1.13°。
oridata_Global[oridata_Global.year==1862]
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()
从分析来看,自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°,当然,不排除这可能是一个异常点。
这篇关于数据分析项目一“探索未来气候发展趋势的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!