精彩专栏推荐订阅:在下方主页👇🏻👇🏻👇🏻👇🏻
💖🔥作者主页:计算机毕设木哥🔥 💖
文章目录
- 一、项目介绍
- 二、视频展示
- 三、开发环境
- 四、系统展示
- 五、代码展示
- 六、项目文档展示
- 七、项目总结
- <font color=#fe2c24 >大家可以帮忙点赞、收藏、关注、评论啦 👇🏻
一、项目介绍
全球变暖背景下,极端热力事件频发,传统表格查阅难以从长时序里看出升温节奏、极端峰值和分布波动规律,研究者和业务人员往往缺少一套把挖掘结果直观呈现出来的工具。本文通过开发一个基于大数据的全球极端热力事件挖掘与动态可视化研究系统,用以帮助解决全球格网热力数据多维度分析难、结果展示散的问题。 系统以 Hadoop HDFS 存原始与预处理数据,PySpark 3.3.2 执行清洗聚合与17项统计分析,异常识别用 Isolation Forest、热力分型用 K-Means(k=4),结果经 Django 2.0 写入 MySQL 并对外提供接口;前端 Vue2 搭配 ECharts5 搭建时序演变、极端事件、分布波动三个分析页共17张图,另有8图决策大屏,并支持格网热力数据的增删改查维护。 经过系统测试,本系统能满足气候数据分析、毕业设计演示及管理人员查阅全球热力演变与极端事件的需求,把1940—2024年日尺度统计从离线挖掘到在线可视化串成一条链路,对同类环境热力监测课题的选题与落地有一定参考意义。
二、视频展示
基于大数据的全球极端热力事件挖掘与动态可视化研究
三、开发环境
- 大数据技术:Hadoop、Spark、Hive
- 开发技术:Python、Django框架、Vue、Echarts
- 软件工具:Pycharm、DataGrip、Anaconda
- 可视化 工具 Echarts
四、系统展示
系统页面模块展示:


五、代码展示
from pyspark.sql import SparkSession, Window
from pyspark.sql.functions import (
avg as spark_avg, col, count as spark_count, desc,
lit, max as spark_max, row_number, round as spark_round,
stddev as spark_stddev, sum as spark_sum, when,
)
from pyspark.sql.types import DoubleType, IntegerType
from sklearn.cluster import KMeans
from sklearn.ensemble import IsolationForest
from sklearn.preprocessing import StandardScaler
HDFS_PREPROCESSED = (
'hdfs://127.0.0.1:9000/GlobalHeatEventSystem/output/global_gridded_thermal_preprocessed_data.csv'
)
def create_spark():
return SparkSession.builder.appName('GlobalHeatEventSystem_analysis').getOrCreate()
def load_preprocessed(spark):
df = spark.read.csv(HDFS_PREPROCESSED, header=True, inferSchema=False)
for column in NUMERIC_COLS + ['year', 'month', 'decade']:
if column in df.columns:
df = df.withColumn(column, col(column).cast(DoubleType()))
return df.withColumn('year', col('year').cast(IntegerType())) \\
.withColumn('month', col('month').cast(IntegerType())) \\
.withColumn('decade', col('decade').cast(IntegerType()))
def annual_trend_analysis(spark, df, logger_obj, output_dir):
"""A01 年度趋势:按 year 聚合 Mean/Max/Min/Std"""
result = df.groupBy('year').agg(
spark_round(spark_avg('Mean'), 2).alias('avg_mean'),
spark_round(spark_avg('Max'), 2).alias('avg_max'),
spark_round(spark_avg('Min'), 2).alias('avg_min'),
spark_round(spark_avg('Std'), 2).alias('avg_std'),
spark_count(lit(1)).alias('record_count'),
).orderBy('year')
write_csv(result, os.path.join(output_dir, 'annual_trend.csv'))
def warming_rate_analysis(spark, df, logger_obj, output_dir):
"""A05 升温速率:年度均值 → 线性回归斜率"""
pdf = df.groupBy('year').agg(
spark_round(spark_avg('Mean'), 2).alias('avg_mean')
).orderBy('year').toPandas()
years = pdf['year'].astype(float).values
means = pdf['avg_mean'].astype(float).values
slope, intercept = np.polyfit(years, means, 1)
trend = slope * years + intercept
pd.DataFrame({
'year': pdf['year'],
'avg_mean': pdf['avg_mean'],
'trend_line': np.round(trend, 2),
}).to_csv(os.path.join(output_dir, 'warming_rate.csv'), encoding='utf-8', index=False)
def high_heat_day_count_analysis(spark, df, logger_obj, output_dir):
"""A07 高温日数:Mean > p95 标记为高温日"""
flagged = df.filter(col('Mean').isNotNull() & col('p95').isNotNull()).withColumn(
'is_high_heat', when(col('Mean') > col('p95'), 1).otherwise(0)
)
result = flagged.groupBy('year').agg(
spark_sum('is_high_heat').alias('high_heat_days'),
spark_count(lit(1)).alias('total_days'),
).withColumn(
'high_heat_ratio',
spark_round(col('high_heat_days') / col('total_days') * 100, 2)
).orderBy('year')
write_csv(result, os.path.join(output_dir, 'high_heat_day_count.csv'))
def anomaly_detection_analysis(spark, df, logger_obj, output_dir):
"""A11 异常识别:Spark 月聚合 → sklearn IsolationForest"""
monthly = df.filter(
col('year').isNotNull() & col('month').isNotNull()
& col('Mean').isNotNull() & col('Max').isNotNull()
& col('Std').isNotNull() & col('p99').isNotNull()
).groupBy('year', 'month').agg(
spark_avg('Mean').alias('avg_mean'),
spark_avg('Max').alias('avg_max'),
spark_avg('Std').alias('avg_std'),
spark_avg('p99').alias('avg_p99'),
)
feature_pdf = monthly.toPandas()
feature_cols = ['avg_mean', 'avg_max', 'avg_std', 'avg_p99']
scaled = StandardScaler().fit_transform(feature_pdf[feature_cols].astype(float).values)
model = IsolationForest(contamination=0.05, random_state=42)
labels = model.fit_predict(scaled)
scores = model.decision_function(scaled)
pd.DataFrame({
'year': feature_pdf['year'].astype(int),
'month': feature_pdf['month'].astype(int),
'anomaly_count': (labels == -1).astype(int),
'avg_anomaly_score': np.round(scores.astype(float), 2),
}).to_csv(os.path.join(output_dir, 'anomaly_detection.csv'), encoding='utf-8', index=False)
def consecutive_heat_analysis(spark, df, logger_obj, output_dir):
"""A12 连续高温:按年统计最长连续超过 p95 的天数"""
pdf = df.filter(
col('Date').isNotNull() & col('Mean').isNotNull() & col('p95').isNotNull()
).select('Date', 'year', 'Mean', 'p95').orderBy('Date').toPandas()
pdf['is_high'] = pdf['Mean'] > pdf['p95']
rows = []
for year, group in pdf.groupby('year'):
streaks, current = [], 0
for is_high in group.sort_values('Date')['is_high']:
if is_high:
current += 1
else:
if current > 0: streaks.append(current)
current = 0
if current > 0: streaks.append(current)
rows.append({
'year': int(year),
'max_consecutive_days': max(streaks) if streaks else 0,
'heat_event_count': len(streaks),
'avg_event_length': round(float(np.mean(streaks)), 2) if streaks else 0.0,
})
pd.DataFrame(rows).sort_values('year').to_csv(
os.path.join(output_dir, 'consecutive_heat.csv'), encoding='utf-8', index=False
)
def thermal_cluster_profile_analysis(spark, df, logger_obj, output_dir):
"""A17 热力分型:5 维特征 → StandardScaler → K-Means(k=4)"""
monthly = df.groupBy('year', 'month').agg(
spark_avg('Mean').alias('avg_mean'),
spark_avg('Max').alias('avg_max'),
spark_avg('Std').alias('avg_std'),
spark_avg('p99').alias('avg_p99'),
spark_avg('p95').alias('avg_p95'),
)
feature_pdf = monthly.toPandas()
feature_cols = ['avg_mean', 'avg_max', 'avg_std', 'avg_p99', 'avg_p95']
scaler = StandardScaler()
scaled = scaler.fit_transform(feature_pdf[feature_cols].astype(float).values)
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
labels = kmeans.fit_predict(scaled)
feature_pdf['cluster_id'] = labels
center_original = scaler.inverse_transform(kmeans.cluster_centers_)
cluster_labels = {0: '高稳态型', 1: '高波动型', 2: '极端尾部型', 3: '温和过渡型'}
rows = []
for cluster_id in range(4):
center = center_original[cluster_id]
rows.append({
'cluster_id': cluster_id,
'cluster_label': cluster_labels.get(cluster_id, f'簇群{cluster_id}'),
'sample_count': int((labels == cluster_id).sum()),
'center_mean': round(float(center[0]), 2),
'center_max': round(float(center[1]), 2),
'center_std': round(float(center[2]), 2),
'center_p99': round(float(center[3]), 2),
})
pd.DataFrame(rows).to_csv(
os.path.join(output_dir, 'thermal_cluster_profile.csv'), encoding='utf-8', index=False
)
def main():
spark = create_spark()
try:
df = load_preprocessed(spark)
logger.info('从 HDFS 读取成功,行数 %s', df.count())
annual_trend_analysis(spark, df, logger, OUTPUT_DIR)
monthly_distribution_analysis(spark, df, logger, OUTPUT_DIR)
decade_comparison_analysis(spark, df, logger, OUTPUT_DIR)
seasonal_fluctuation_analysis(spark, df, logger, OUTPUT_DIR)
warming_rate_analysis(spark, df, logger, OUTPUT_DIR)
peak_year_ranking_analysis(spark, df, logger, OUTPUT_DIR)
high_heat_day_count_analysis(spark, df, logger, OUTPUT_DIR)
extreme_peak_tracking_analysis(spark, df, logger, OUTPUT_DIR)
percentile_comparison_analysis(spark, df, logger, OUTPUT_DIR)
heatwave_intensity_analysis(spark, df, logger, OUTPUT_DIR)
anomaly_detection_analysis(spark, df, logger, OUTPUT_DIR)
consecutive_heat_analysis(spark, df, logger, OUTPUT_DIR)
volatility_year_change_analysis(spark, df, logger, OUTPUT_DIR)
ci_width_analysis(spark, df, logger, OUTPUT_DIR)
range_comparison_analysis(spark, df, logger, OUTPUT_DIR)
percentile_structure_analysis(spark, df, logger, OUTPUT_DIR)
thermal_cluster_profile_analysis(spark, df, logger, OUTPUT_DIR)
logger.info('全部分析执行完毕')
finally:
spark.stop()
六、项目文档展示

七、项目总结
本课题围绕全球格网热力日尺度数据,完成了从离线挖掘到在线展示的闭环建设。数据侧以1940—2024年共31047条记录为对象,针对源文件中欧式千分位与科学计数法混排问题,完成数值清洗与时间衍生,并经由Hadoop HDFS完成存储分发;分析侧基于PySpark构建17项统计任务,按时序演变、极端事件、分布波动三个维度展开,涵盖年度升温趋势、高温日与连续热浪、分位结构与波动年际变化等内容,其中异常识别采用Isolation Forest无监督检测离群月份,热力分型采用K-Means将月尺度特征划分为四类模式。 系统侧采用Django与MySQL承载分析结果与格网数据管理,前端以Vue2结合ECharts实现三个分析页共17张图及8图决策大屏,支持从宏观走势到极端尾部、从算法输出到业务图表的一屏总览,并提供格网热力数据的维护能力。实践表明,Spark负责规模化聚合、sklearn补算法短板、Web端负责交互呈现的分工,适合同类环境时序课题复用。 不足之处在于数据为全球日聚合口径,尚未细化到格网点位空间对比;算法目前仅覆盖异常检测与聚类两类,后续可引入更多时序预测或空间插值方法。总体而言,本课题把“极端热力事件挖掘”与“动态可视化”落到可运行系统,对气候数据分析类毕业设计具有参考意义。
大家可以帮忙点赞、收藏、关注、评论啦 👇🏻
💖🔥作者主页:计算机毕设木哥🔥 💖
