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

2024-03-31 10:08

本文主要是介绍数据分析项目一“探索未来气候发展趋势,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

# 数据分析项目一“探索未来气候发展趋势” ## 一、概览 概览 在这个项目中,我们将分析本地和全球的气温数据,并比较你居住地的气温走向与全球气温走向。作者位于云南昆明。 使用的工具 整个项目使用的工具包括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()
.dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; }
yearavg_temp
count198.000000198.000000
mean1914.50000014.458976
std57.3018320.666006
min1816.0000008.420000
25%1865.25000014.168764
50%1914.50000014.425000
75%1963.75000014.770000
max2013.00000016.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()

这里写图片描述

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; }
yearcitycountryavg_temp
1972013KunmingChina16.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()

png
这里写图片描述

分析:从全球趋势来看,二十世纪以前,全球气温呈巨幅波动趋势,但全球平均气温基本保持不变。但自进入二十世纪中叶,尤其是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; }
yearavg_temp
11218627.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()

png
这里写图片描述

从分析来看,自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°,当然,不排除这可能是一个异常点。

这篇关于数据分析项目一“探索未来气候发展趋势的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864078

相关文章

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

Ubuntu中Nginx虚拟主机设置的项目实践

《Ubuntu中Nginx虚拟主机设置的项目实践》通过配置虚拟主机,可以在同一台服务器上运行多个独立的网站,本文主要介绍了Ubuntu中Nginx虚拟主机设置的项目实践,具有一定的参考价值,感兴趣的可... 目录简介安装 Nginx创建虚拟主机1. 创建网站目录2. 创建默认索引文件3. 配置 Nginx4

SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法

《SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法》本文主要介绍了SpringBoot项目启动错误:找不到或无法加载主类的几种解决方法,具有一定的参考价值,感兴趣的可以了解一下... 目录方法1:更改IDE配置方法2:在Eclipse中清理项目方法3:使用Maven命令行在开发Sprin

Nginx实现高并发的项目实践

《Nginx实现高并发的项目实践》本文主要介绍了Nginx实现高并发的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用最新稳定版本的Nginx合理配置工作进程(workers)配置工作进程连接数(worker_co

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

SpringBoot项目注入 traceId 追踪整个请求的日志链路(过程详解)

《SpringBoot项目注入traceId追踪整个请求的日志链路(过程详解)》本文介绍了如何在单体SpringBoot项目中通过手动实现过滤器或拦截器来注入traceId,以追踪整个请求的日志链... SpringBoot项目注入 traceId 来追踪整个请求的日志链路,有了 traceId, 我们在排