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

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

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

SpringBoot项目是如何启动

启动步骤 概念 运行main方法,初始化SpringApplication 从spring.factories读取listener ApplicationContentInitializer运行run方法读取环境变量,配置信息创建SpringApplication上下文预初始化上下文,将启动类作为配置类进行读取调用 refresh 加载 IOC容器,加载所有的自动配置类,创建容器在这个过程

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免