农村气候变化:为气候战士提供的 Python 项目

添加图片注释,不超过 140 字(可选)

什么是热岛?欢迎来到雲闪世界。 根据美国环保署的说法,热岛是指城市化地区温度高于周边地区。人工建筑(如建筑物和道路)比自然景观(如森林和湖泊)吸收和重新散发的太阳热量更多。人类活动(包括驾驶汽车和给建筑物降温)会产生额外的热量。在这些建筑和活动高度集中的大城市中,相对于周围的乡村,形成了温度较高的“岛屿”。

添加图片注释,不超过 140 字(可选)

由于城市热岛效应,城市通常白天较热,夜间较暖。白天温度比农村地区高 1-7°F,夜间温度比农村地区高 2-5°F。 如果只显示大型发展城市的气温数据,人们会觉得全球气温比真实的全球平均气温更高,上升速度也更快。为了验证这一点,我们只需比较大城市地区和小得多的乡村城镇的历史气温曲线。 策略 我们将考察两个大城市和四个乡村小镇,其中三个位于德克萨斯州北部,三个位于德克萨斯州南部。在北部,我们将考察达拉斯,其西边是奥尔巴尼,东边是萨尔弗斯普林斯。

添加图片注释,不超过 140 字(可选)

在南边,我们将使用圣安东尼奥 (San Antonio),西边是洪多 (Hondo),东边是卢灵 (Luling)。

添加图片注释,不超过 140 字(可选)

根据美国人口普查公开数据,下表总结了 1950 年和 2023 年这些城市的人口情况。达拉斯和圣安东尼奥代表了大城市地区。

添加图片注释,不超过 140 字(可选)

这里的目标是使用大致位于同一纬度线上的相对接近的城市。德克萨斯州盛行的风来自西部,冷锋往往从北部沿平原向下移动。让城市保持相当接近并处于同一纬度意味着它们应该会经历类似的天气。 有了这些数据,我们可以绘制并比较大城市和小城市的温度曲线,看看它们是否遵循相似的趋势。

数据 在他的著作《未解决的问题:气候科学告诉我们什么、它没有告诉我们什么以及为什么它很重要》中,史蒂文·库宁利用美国政府的 2017 年气候科学特别报告表明,每日记录的低温测量值数量一直在下降,下降速度快于每日记录的高温测量值的上升速度。因此,低温中隐藏着一个重要的气候变化信号,因此我们应该同时关注高温和低温测量值。 我们可以在美国国家海洋和大气管理局 ( NOAA ) 管理的公共记录中找到所选城市的平均年最低和最高气温。我们将研究 1950 年至 2023 年之间的时期。这将为我们提供近 75 个数据点,并包括 1980 年左右气温快速上升之前的几年的情况。 为了方便起见,我已经收集了这些数据并将其存储在Gist中。我们将使用 URL 地址以编程方式访问它。

代码 以下代码是在 Jupyter Lab 中编写的。 导入库 对于该项目的主要部分,我们只需要三个第三方库:Matplotlib、pandas 和 GeoPandas。 Matplotlib是 Python 最流行的绘图库。您可以在此处找到安装和使用说明。 Pandas是 Python 的主要数据分析库。您可以在此处找到其安装和快速入门指南。 GeoPandas扩展了 pandas 的功能,使其能够处理地理空间数据。您可以在此处找到其安装和用户指南。

 
 

导入matplotlib.pyplot作为plt 导入pandas作为pd 导入geopandas作为gpd

加载城市地理空间数据 此类研究总是包含一张显示感兴趣区域的“索引图”。因此,我们首先绘制德克萨斯州的轮廓,其中城市位于其适当的地理空间位置,并按其人口比例缩放。 以下代码使用 pandas 的read_csv()方法从 URL 加载城市纬度、经度和人口数据。然后显示完整的 DataFrame。

 
 

# 加载城市数据: df_map = pd.read_csv( 'https://bit.ly/3XgMpIu' ) df_map.head( 6 )

添加图片注释,不超过 140 字(可选)

创建 GeoDataFrame 接下来,我们将 pandas DataFrame 转换为 GeoPandas GeoDataFrame,并添加一个新列“几何”。此列以“点”几何格式保存经度和纬度数据。稍后,我们将使用这些点在地图上绘制城市。

gdf = gpd.GeoDataFrame(df_map,geometry=gpd.points_from_xy(df_map.经度, df_map.纬度)) gdf.head(6)6)

添加图片注释,不超过 140 字(可选)

绘制索引图 以下代码使用 Matplolib 绘制索引图。不过,在执行此操作之前,我们需要德克萨斯州的轮廓,或者更具体地说,德克萨斯州的Shapefile。 Shapefile是地理信息系统 (GIS) 软件中常见的地理空间矢量数据格式。虽然我们使用点几何来表示城市位置,但我们将使用多边形来表示州边界。 查找 Shapefile 的一个方便的地方是Natural Earth 公共域数据集。只需导航到此站点并单击下面以黄色突出显示的下载链接(版本号可能会随时间而变化):

添加图片注释,不超过 140 字(可选)

将压缩文件移动到包含 Python 脚本或笔记本的文件夹中,然后运行以下代码(不需要解压文件夹)。

 
 

# 设置索引图: fig, ax = plt.subplots(figsize=( 7 , 6 )) # 将各州 Shapefile 加载为 GeoDataFrame: states = 'ne_110m_admin_1_states_provinces.zip' usa = gpd.read_file(states) # 仅使用德克萨斯州创建一个新的 GeoDataFrame: tx = usa[(usa.name == 'Texas' )] # 绘制德克萨斯州的轮廓: tx.boundary.plot(ax=ax, linewidth= 1 , edgecolor= 'black' ) # 按人口比例绘制城市: gdf.plot(ax=ax, markersize=gdf[ 'Population' ] / 2000 , color= 'firebrick' ) # 注释以标记为中心的城市名称: for x, y, label in zip (gdf.geometry.x, gdf.geometry.y,gdf [ 'City' ]): 如果label == 'Hondo': horiz_align = ' right'vert_align = 'bottom'否则 : horiz_align = 'left'vert_align = 'center'ax.annotate (label, xy =(x,y), xytext =(5,2), textcoords = “偏移点”, fontsize = 8, ha = horiz_align, va = vert_align)plt.title('研究中使用的德克萨斯州城市(按人口缩放)')plt.xlabel ('经度')plt.ylabel('纬度')plt.show()

添加图片注释,不超过 140 字(可选)

再次强调,标记大小代表城市的人口,而不是城市范围。 加载温度数据 现在我们将每个城市的温度数据(以 CSV 文件形式在线存储)加载为 pandas DataFrame。 # 读取城市温度数据:

 
 

df_dallas = pd.read_csv( 'https://bit.ly/3WVtW2R' ) df_albany = pd.read_csv( 'https://bit.ly/476rQSw' ) df_sulphur = pd.read_csv( 'https://bit.ly/3Mhg6Tp' ) df_san_antonio = pd.read_csv( 'https://bit.ly/3AKLQOa' ) df_luling = pd.read_csv( 'https://bit.ly/4dSZ5e6' ) df_hondo = pd.read_csv( 'https://bit.ly/4cCaMVC' )

为了检查,显示达拉斯数据集中的前五条记录:

 
 

df_dallas.head()

添加图片注释,不超过 140 字(可选)

定义一个函数来绘制年平均高温 我们需要绘制多个图,因此接下来我们将定义一个函数,该函数以两个 DataFrames 作为参数,并在同一张图中将每个 DataFrames 的高温测量值绘制为折线图。我只使用两个DataFrames,因为我发现很难理解同一张图中的三条或更多条曲线。

 
 

def plot_highs ( df1, df2 ): plt.plot(df1.Year, df1.High, color= 'firebrick' , label=df1.City[ 0 ]) plt.plot(df2.Year, df2.High, color= 'grey' , label=df2.City[ 0 ]) plt.title( '年平均最高气温(华氏度)' ) plt.xlabel( '年份' ) plt.ylabel( '年平均最高气温(华氏度)' ) plt.legend() plt.grid() plt.legend();

定义一个函数来绘制年平均低温 接下来,我们重复前面的代码进行低温测量。

 
 

def plot_lows ( df1, df2 ): plt.plot(df1.Year, df1.Low, color= 'firebrick' , label=df1.City[ 0 ]) plt.plot(df2.Year, df2.Low, color= 'gray' , label=df2.City[ 0 ]) plt.title( '年平均最低气温(华氏度)' ) plt.xlabel( '年份' ) plt.ylabel( '年平均最低气温(华氏度)' ) plt.grid() plt.legend();

达拉斯和硫磺泉的高温对比 首先,我们来看看达拉斯和东北约 80 英里(128 公里)的乡村小镇硫磺泉。 绘图高点(df_dallas,df_sulphur)

达拉斯和硫磺泉的年平均最高气温

这张图上有几件事情很突出。达拉斯的温度往往比现在高几度,这与热岛效应一致。在 20 世纪 50 年代的历史性干旱期间,气温非常高,然后在 20 世纪 60 年代和 70 年代有所下降(归因于高浓度的工业和火山相关的硫酸盐气溶胶将阳光反射到太空中)。从 1980 年左右开始,气温一直上升到现在。 两个城市的气温数据显示出相同的总体趋势。如果变暖是由于热岛效应造成的,我们预计萨尔弗斯普林斯的曲线将在 1980 年后趋于平缓,而不是遵循达拉斯的曲线。 达拉斯和奥尔巴尼的高点对比 现在让我们看看达拉斯和其西边约 150 英里(240 公里)的乡村小镇奥尔巴尼。

 
 

绘图高点(df_dallas,df_albany)

添加图片注释,不超过 140 字(可选)

曲线相似且遵循相同的趋势。 圣安东尼奥和洪都的高点对比 现在让我们向南移动约 270 英里(432 公里),看看圣安东尼奥和西边约 44 英里(70 公里)的乡村小镇洪多。 绘图高点(df_san_antonio,df_hondo)

添加图片注释,不超过 140 字(可选)

奇怪的是,洪多的温度往往比大得多的圣安东尼奥市的温度要高。然而,它们显示出相同的趋势,这表明热岛效应不会对结果造成偏差。 圣安东尼奥和卢灵的高点对比 这是圣安东尼奥与东北约 57 英里(91 公里)处乡村小镇卢灵的比赛结果。 绘图高点(df_san_antonio,df_luling)

添加图片注释,不超过 140 字(可选)

这些曲线非常相似,除了一些像差外,都能很好地相互跟踪。 达拉斯和硫磺泉的低温比较 现在让我们看看低温数据。请记住,气候变化的一个方面似乎是创纪录的低温数量随着时间的推移而减少。 以下是达拉斯和硫磺泉的比较: 绘图低点(df_dallas,df_sulphur)

添加图片注释,不超过 140 字(可选)

此处的温度分离很明显,但仍在热岛效应的观测范围内。关键点在于,自 20 世纪 80 年代初以来,两条曲线的增长速度大致相同。 达拉斯和奥尔巴尼的低点对比 以下是达拉斯和奥尔巴尼的低温比较: 绘图低点(df_dallas,df_albany)

添加图片注释,不超过 140 字(可选)

如果气候变化相关的温度变化受到热岛效应的严重影响,此图更接近我所期望的结果。 1980 年左右后,达拉斯的年平均低温总体上升,而奥尔巴尼农村的年平均低温趋于平稳,尽管在过去十年左右,它们与达拉斯的状况更加接近。 圣安东尼奥和洪都的低谷对比 以下是圣安东尼奥和洪多的低温比较: 情节(df_san_antonio,df_hondo)

添加图片注释,不超过 140 字(可选)

这两条曲线往往能够很好地相互跟踪,尽管从 1980 年到 2010 年,Hondo 曲线似乎相当平坦。

添加图片注释,不超过 140 字(可选)

以下是圣安东尼奥和卢灵的低温比较: 绘图低点(df_san_antonio,df_luling)

添加图片注释,不超过 140 字(可选)

与圣安东尼奥-洪多曲线相比,卢灵的农村测量值与圣安东尼奥读数在 1999 年至 2013 年之间的差异更大。此后,它们迅速恢复并紧密跟随大城市的行为。 圣安东尼奥与达拉斯的比较 为了好玩,我们来比较一下圣安东尼奥和达拉斯。由于圣安东尼奥位于更靠南的地方,我们应该认为那里会更暖和,事实也确实如此。曲线也以类似的斜率上升。 绘图高点(df_san_antonio,df_dallas)

添加图片注释,不超过 140 字(可选)

绘图低点(df_san_antonio,df_dallas)

添加图片注释,不超过 140 字(可选)

最后两条曲线无助于解决城市与农村的问题,但它们表明过去 73 年整个德克萨斯州的气温变化相似。 量化气温升高(1980 - 2023 年) 更定量的观察方法是将北方和南方农村数据集过滤到 1980 年至 2023 年的时间段后,分别拟合回归线。这代表了近期变暖趋势形成的时期。 我们需要NumPy(数值 Python)和scikit-learn(机器学习)库。您可以在前面的链接中找到安装说明。 以下是合并和绘制南部 Hondo 和 Luling DataFrames 的示例代码片段:

 
 

import numpy as np from sklearn.metrics import r2_score # 过滤 1980 年及之后的南部农村 Dfs: df_hondo_80 = df_hondo[df_hondo[ 'Year' ] >= 1980 ] df_luling_80 = df_luling[df_luling[ 'Year' ] >= 1980 ] # 将 DF 合并为一个: Rural_south_df = pd.concat([df_hondo_80, df_luling_80], ignore_index= True ) # 绘制散点图: plt.scatter(rural_south_df[ 'Year' ], Rural_south_df[ 'Low' ], color= 'grey' , label= 'Rural South Low Temps' ) # 拟合回归线使用 NumPy: slope, intercept = np.polyfit(rural_south_df[ 'Year' ], Rural_south_df[ 'Low' ], 1 ) return_line = slope * Rural_south_df[ 'Year' ] + intercept plt.plot(rural_south_df[ 'Year' ], return_line, color= 'firebrick' , label= '回归线' ) # 使用 sklearn 计算 R 平方值: r_squared = r2_score(rural_south_df[ 'Low' ], return_line) # 将方程和 R 平方值添加到图中: equation_text = f'y = {slope: .2 f} x + {intercept: .2 f} \n$R^2$ = {r_squared: .2 f} ' plt.text( 0.05 , 0.95 , equation_text, transform=plt.gca().transAxes, fontsize= 12 , verticalalignment= 'top' , bbox= dict (boxstyle= 'round,pad=0.5' , edgecolor= 'black' , facecolor= 'white' )) # 添加标签和标题: plt.xlabel( 'Year' ) plt.ylabel( 'Low' ) plt.title( '南部农村年平均低温 (1980-2023)' ) plt.legend(loc= 'lower right' ) # 显示图表 plt.show()

以下是高温和低温的结果。两条回归线的斜率均为正,表明此期间温度上升:

添加图片注释,不超过 140 字(可选)

北部两个农村城市的结果类似,但较为温和:

添加图片注释,不超过 140 字(可选)

这些回归线证实了我们在线图中观察到的增加。

添加图片注释,不超过 140 字(可选)

通过对六个城市的粗略调查,可以发现城市和农村地区对气候变化的反应相似。全球变暖并不是仅显示热岛数据而导致的城市数据“假象”。

添加图片注释,不超过 140 字(可选)

作为附加项目,将城市的气温趋势与其人口增长进行比较。以下是达拉斯的示例,使用达拉斯-沃斯堡大都会区的人口:

添加图片注释,不超过 140 字(可选)

添加图片注释,不超过 140 字(可选)

根据环境保护署的数据,一个人口只有一百万的城市就可能形成城市热岛。这意味着达拉斯-沃斯堡大都会区早在 20 世纪 50 年代初就已经成为热岛。

感谢关注雲闪世界。(Aws解决方案架构师vs开发人员&GCP解决方案架构师vs开发人员)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值