精彩专栏推荐订阅:在下方主页👇🏻👇🏻👇🏻👇🏻
💖🔥作者主页 :计算机毕设木哥🔥 💖
文章目录
- 一、项目介绍
- 二、视频展示
- 三、开发环境
- 四、系统展示
- 五、代码展示
- 六、项目文档展示
- 七、项目总结
- [<font color=#fe2c24 >大家可以帮忙点赞、收藏、关注、评论啦 👇🏻](#fe2c24 >大家可以帮忙点赞、收藏、关注、评论啦 👇🏻)
一、项目介绍
全球气候变暖已成为本世纪最严峻的环境议题之一,气象观测数据显示过去百年间地表温度持续攀升,极端天气事件频次明显增加。各国政府和科研机构迫切需要一套系统性的数据分析工具,用于从海量历史温度记录中提取气候演变规律、识别不同区域的升温特征。本文通过开发一个基于大数据的全球气温历史演变分析与可视化系统,用以帮助解决气候数据的多维度分析需求。
系统采用Hadoop分布式存储与Spark计算引擎处理Berkeley Earth提供的全球温度数据集,涵盖全球、国家、城市三个空间层级的近900万条记录。后端用PySpark完成数据预处理、温度缺失值填补、时间维度拆解,计算年均温、年代际距平、升温速率等核心指标。算法层面实现K-Means国家气候画像聚类、层次聚类城市分组、GMM软聚类识别升温模式、PCA降维可视化,覆盖七个分析维度。前端配合可视化大屏展示距平曲线、排名、雷达图等图表结果。
经过系统测试,本平台能够满足气候研究人员、地理学者和高校师生对历史温度数据的探索性分析需求,为气候变暖趋势研判和跨国对比研究提供数据支撑。
二、视频展示
三、开发环境
- 大数据技术:Hadoop、Spark、Hive
- 开发技术:Python、Django框架、Vue、Echarts
- 软件工具:Pycharm、DataGrip、Anaconda
- 可视化 工具 Echarts
四、系统展示
系统页面模块展示:








五、代码展示
bash
# -*- coding: utf-8 -*-
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, year, month, floor, median, avg, when, lit
from pyspark.sql.types import DoubleType
import os
import pandas as pd
spark = SparkSession.builder.appName("TemperatureETL").getOrCreate()
def load_and_preprocess_all_datasets():
"""
加载全部五个数据集并执行统一预处理:
1. dt解析为year/month/season
2. 温度缺失值按十年窗口分组中位数填补
3. 经纬度解析为带符号float
4. 国家/城市名称转中文
5. 大洲聚合行标记
"""
# 读取五个数据集
global_df = spark.read.csv("dataset/GlobalTemperatures.csv", header=True, inferSchema=True)
country_df = spark.read.csv("dataset/GlobalLandTemperaturesByCountry.csv", header=True, inferSchema=True)
state_df = spark.read.csv("dataset/GlobalLandTemperaturesByState.csv", header=True, inferSchema=True)
major_city_df = spark.read.csv("dataset/GlobalLandTemperaturesByMajorCity.csv", header=True, inferSchema=True)
city_df = spark.read.csv("dataset/GlobalLandTemperaturesByCity.csv", header=True, inferSchema=True)
# 通用预处理函数
def preprocess_temperature(df, temp_col="AverageTemperature", uncertainty_col="AverageTemperatureUncertainty"):
# 解析dt为year/month
df = df.withColumn("year", year(col("dt"))) \
.withColumn("month", month(col("dt")))
# 映射季节(北半球)
df = df.withColumn("season",
when(col("month").isin([12, 1, 2]), "冬")
.when(col("month").isin([3, 4, 5]), "春")
.when(col("month").isin([6, 7, 8]), "夏")
.when(col("month").isin([9, 10, 11]), "秋")
)
# 计算十年窗口
df = df.withColumn("decade", (floor(col("year") / 10) * 10).cast("int"))
# 按十年窗口+月份分组计算中位数
window_medians = df.groupBy("decade", "month") \
.agg(median(col(temp_col)).alias("window_median"))
# 全球同期中位数(兜底)
global_medians = df.groupBy("month") \
.agg(median(col(temp_col)).alias("global_median"))
# 先关联窗口填补
df_filled = df.join(window_medians, on=["decade", "month"], how="left")
df_filled = df_filled.withColumn(
"temp_filled",
when(col(temp_col).isNull(), col("window_median"))
.otherwise(col(temp_col))
)
# 窗口全缺失则用全球中位数兜底
df_filled = df_filled.join(global_medians, on=["month"], how="left")
df_filled = df_filled.withColumn(
"temp_final",
when(col("temp_filled").isNull(), col("global_median"))
.otherwise(col("temp_filled"))
).drop("window_median", "global_median", "temp_filled")
return df_filled
# 对各个数据集执行预处理
global_preprocessed = preprocess_temperature(global_df, "LandAverageTemperature")
country_preprocessed = preprocess_temperature(country_df)
state_preprocessed = preprocess_temperature(state_df)
major_city_preprocessed = preprocess_temperature(major_city_df)
city_preprocessed = preprocess_temperature(city_df)
# 经纬度解析函数
def parse_lat_lon(df, lat_col="Latitude", lon_col="Longitude"):
def parse_lat(lat_str):
if lat_str is None:
return None
lat_str = lat_str.strip()
if lat_str.endswith("N"):
return float(lat_str[:-1])
elif lat_str.endswith("S"):
return -float(lat_str[:-1])
else:
try:
return float(lat_str)
except:
return None
def parse_lon(lon_str):
if lon_str is None:
return None
lon_str = lon_str.strip()
if lon_str.endswith("E"):
return float(lon_str[:-1])
elif lon_str.endswith("W"):
return -float(lon_str[:-1])
else:
try:
return float(lon_str)
except:
return None
# 注册UDF
from pyspark.sql.functions import udf
parse_lat_udf = udf(parse_lat, DoubleType())
parse_lon_udf = udf(parse_lon, DoubleType())
df = df.withColumn("latitude_parsed", parse_lat_udf(col(lat_col))) \
.withColumn("longitude_parsed", parse_lon_udf(col(lon_col)))
return df
# 对含经纬度的数据集执行解析
if "Latitude" in major_city_df.columns:
major_city_preprocessed = parse_lat_lon(major_city_preprocessed)
city_preprocessed = parse_lat_lon(city_preprocessed)
# 大洲聚合行标记
continents = ["Africa", "Asia", "Europe", "North America", "South America", "Oceania", "Antarctica"]
country_preprocessed = country_preprocessed.withColumn(
"is_continent",
when(col("Country").isin(continents), lit(True)).otherwise(lit(False))
)
# 统一列名转数据库命名规范
column_mapping = {
"AverageTemperature": "avg_temperature",
"AverageTemperatureUncertainty": "uncertainty",
"LandAverageTemperature": "avg_temperature",
"LandAverageTemperatureUncertainty": "uncertainty",
"Country": "country_name",
"State": "state_name",
"City": "city_name",
"dt": "record_date",
"season": "season_cn"
}
for old_name, new_name in column_mapping.items():
if old_name in country_preprocessed.columns:
country_preprocessed = country_preprocessed.withColumnRenamed(old_name, new_name)
if old_name in state_preprocessed.columns:
state_preprocessed = state_preprocessed.withColumnRenamed(old_name, new_name)
if old_name in major_city_preprocessed.columns:
major_city_preprocessed = major_city_preprocessed.withColumnRenamed(old_name, new_name)
if old_name in city_preprocessed.columns:
city_preprocessed = city_preprocessed.withColumnRenamed(old_name, new_name)
if old_name in global_preprocessed.columns:
global_preprocessed = global_preprocessed.withColumnRenamed(old_name, new_name)
# 合并所有预处理结果(按需)
all_processed = country_preprocessed.unionByName(major_city_preprocessed, allowMissingColumns=True)
all_processed = all_processed.unionByName(city_preprocessed, allowMissingColumns=True)
all_processed = all_processed.unionByName(state_preprocessed, allowMissingColumns=True)
all_processed = all_processed.unionByName(global_preprocessed, allowMissingColumns=True)
# 输出到单个
六、项目文档展示

七、项目总结
本文基于Berkeley Earth全球地表温度数据集,设计并实现了一个基于大数据的全球气温历史演变分析与可视化系统。数据层面覆盖全球、国家、城市三个空间粒度,时间跨度为1743年至2015年,总数据量近900万条。技术架构采用Hadoop HDFS进行分布式存储,Spark作为计算引擎完成数据预处理与指标计算,解决了温度字段早期缺失值填补、经纬度坐标解析、时间维度拆解等关键问题。分析层面规划了全球趋势、季节波动、极值特征、海陆对比、国家差异、城市气候、算法洞察七个业务维度,涵盖年均温演变、年代际距平、升温速率、季节性强度、极端记录等核心分析场景。
算法层面引入了四种无监督学习方法:K-Means对国家按月均温12维特征进行气候画像聚类、层次聚类对100个大城市做分组、GMM软聚类识别不同国家的升温模式归属、PCA降维到二维空间实现国家气候特征的可视化分布。这些算法从不同角度揭示了全球气候的空间异质性和时间演变规律。系统后端采用Django提供API服务,前端基于Vue3和ECharts构建可视化大屏,将距平曲线、排名列表、雷达图、散点图等图表结果集中呈现。
经过系统测试,本平台能够为气候研究人员和高校师生提供历史温度数据的探索性分析工具,支持从全球尺度到城市尺度的多层级数据透视,在气候变暖趋势研判和跨国对比研究中具有一定参考价值
大家可以帮忙点赞、收藏、关注、评论啦 👇🏻
💖🔥作者主页 :计算机毕设木哥🔥 💖