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

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

相关文章

JAVA项目swing转javafx语法规则以及示例代码

《JAVA项目swing转javafx语法规则以及示例代码》:本文主要介绍JAVA项目swing转javafx语法规则以及示例代码的相关资料,文中详细讲解了主类继承、窗口创建、布局管理、控件替换、... 目录最常用的“一行换一行”速查表(直接全局替换)实际转换示例(JFramejs → JavaFX)迁移建

JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)

《JavaWeb项目创建、部署、连接数据库保姆级教程(tomcat)》:本文主要介绍如何在IntelliJIDEA2020.1中创建和部署一个JavaWeb项目,包括创建项目、配置Tomcat服务... 目录简介:一、创建项目二、tomcat部署1、将tomcat解压在一个自己找得到路径2、在idea中添加

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

python项目环境切换的几种实现方式

《python项目环境切换的几种实现方式》本文主要介绍了python项目环境切换的几种实现方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 如何在不同python项目中,安装不同的依赖2. 如何切换到不同项目的工作空间3.创建项目

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

python项目打包成docker容器镜像的两种方法实现

《python项目打包成docker容器镜像的两种方法实现》本文介绍两种将Python项目打包为Docker镜像的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 目录简单版:(一次成功,后续下载对应的软件依赖)第一步:肯定是构建dockerfile,如下:第二步

Python + Streamlit项目部署方案超详细教程(非Docker版)

《Python+Streamlit项目部署方案超详细教程(非Docker版)》Streamlit是一款强大的Python框架,专为机器学习及数据可视化打造,:本文主要介绍Python+St... 目录一、针对 Alibaba Cloud linux/Centos 系统的完整部署方案1. 服务器基础配置(阿里

SpringBoot整合Apache Spark实现一个简单的数据分析功能

《SpringBoot整合ApacheSpark实现一个简单的数据分析功能》ApacheSpark是一个开源的大数据处理框架,它提供了丰富的功能和API,用于分布式数据处理、数据分析和机器学习等任务... 目录第一步、添加android依赖第二步、编写配置类第三步、编写控制类启动项目并测试总结ApacheS

在SpringBoot+MyBatis项目中实现MySQL读写分离的实战指南

《在SpringBoot+MyBatis项目中实现MySQL读写分离的实战指南》在SpringBoot和MyBatis项目中实现MySQL读写分离,主要有两种思路:一种是在应用层通过代码和配置手动控制... 目录如何选择实现方案核心实现:应用层手动分离实施中的关键问题与解决方案总结在Spring Boot和

gitlab项目实现添加新成员

《gitlab项目实现添加新成员》:本文主要介绍gitlab项目实现添加新成员方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录gitlabhttp://www.chinasem.cn项目添加新成员1、进入项目2、手动输入要添加成员的账号或者搜索总结gitlab项