精彩专栏推荐订阅:在 下方专栏👇🏻👇🏻👇🏻👇🏻

💖🔥作者主页:计算机毕设木哥🔥 💖

一、项目介绍

天气预报预警数据在日常防灾和区域调度里越来越常见,可不少数据仍散落在表格或单一报表里,区域对比、时序变化和风雨风险往往要靠人工翻看,预警关注点也就不容易一眼看出。本文通过开发一个基于大数据的天气预报预警数据可视化与分析系统,用以帮助解决预报预警数据难统一分析、难直观呈现风险线索的问题。

本系统采用 Hadoop 与 Spark 做数据存储和离线分析,后端用 Django 对接 MySQL,前端用 Vue 与 ECharts 做页面展示,风险洞察侧用到 K-Means、Isolation Forest 和 FP-Growth。系统功能覆盖分区逐时预报数据的清洗入库与业务 CRUD,以及区域对比、时序演变、气象要素、天气态势、风雨关联共五类常规分析,再叠加区域气象分群、异常气象识别和天气共现规则,并提供可视化大屏便于集中查看。

经过系统测试,本系统能满足气象相关学习研究与毕业设计演示场景下,对分区预报数据做多维查看、对比筛选和风险线索梳理的需求,也能给需要快速浏览区域天气结构和风雨态势的管理或业务人员提供一个可操作的分析入口,对把预报预警数据从静态表格转成可交互分析有一定实际意义。

二、开发环境

  • 大数据技术:Hadoop、Spark、Hive
  • 开发技术:Python、Django框架、Vue、Echarts
  • 软件工具:Pycharm、DataGrip、Anaconda
  • 可视化 工具 Echarts

三、视频展示

基于大数据的天气预报预警数据可视化与分析

四、项目展示

登录模块:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、代码展示

def region_weather_cluster_analysis(input_df):
    """区域气象分群:Spark 聚合区域画像后用 MLlib K-Means。"""
    work = input_df.filter(col('region_name').isNotNull() & (col('region_name') != ''))
    for c in ['temperature', 'humidity', 'wind_speed', 'rainfall']:
        work = work.filter(col(c).isNotNull())

    # 先按区域聚合画像,避免整表 collect 原始明细
    region_feat = work.groupBy('region_name').agg(
        spark_round(spark_avg('temperature'), 2).alias('avg_temperature'),
        spark_round(spark_avg('humidity'), 2).alias('avg_humidity'),
        spark_round(spark_avg('wind_speed'), 2).alias('avg_wind_speed'),
        spark_round(spark_avg('rainfall'), 2).alias('avg_rainfall'),
        spark_count(lit(1)).alias('sample_count'),
    )
    n_regions = region_feat.count()

    feature_cols = ['avg_temperature', 'avg_humidity', 'avg_wind_speed', 'avg_rainfall']
    assembler = VectorAssembler(inputCols=feature_cols, outputCol='features_raw')
    assembled = assembler.transform(region_feat)
    scaler = StandardScaler(
        inputCol='features_raw', outputCol='features', withStd=True, withMean=True
    )
    scaled = scaler.fit(assembled).transform(assembled)

    # 轮廓系数在 K=2..min(4, n-1) 间择优
    best_k, best_score, best_model, best_pred = None, -1.0, None, None
    k_max = min(4, max(2, n_regions - 1))
    evaluator = ClusteringEvaluator(
        predictionCol='prediction', featuresCol='features', metricName='silhouette'
    )
    for k in range(2, k_max + 1):
        km = KMeans(featuresCol='features', predictionCol='prediction', k=k, seed=42)
        model = km.fit(scaled)
        pred = model.transform(scaled)
        score = float(evaluator.evaluate(pred))
        logger.info(f"K={k} 轮廓系数={score:.4f}")
        if score > best_score:
            best_k, best_score, best_model, best_pred = k, score, model, pred

    # 用原始量纲簇心贴中文标签
    center_pdf = best_pred.groupBy('prediction').agg(
        spark_avg('avg_temperature').alias('c_temp'),
        spark_avg('avg_humidity').alias('c_hum'),
        spark_avg('avg_wind_speed').alias('c_wind'),
        spark_avg('avg_rainfall').alias('c_rain'),
    ).orderBy('prediction').toPandas()

    max_id = int(center_pdf['prediction'].max()) if len(center_pdf) else 0
    aligned = []
    for i in range(max_id + 1):
        match = center_pdf[center_pdf['prediction'] == i]
        if len(match):
            r = match.iloc[0]
            aligned.append([
                float(r['c_temp']), float(r['c_hum']),
                float(r['c_wind']), float(r['c_rain'])
            ])
        else:
            aligned.append([0.0, 0.0, 0.0, 0.0])
    label_map = _label_clusters_by_centers(aligned, feature_cols)

    rows = best_pred.select(
        'region_name', 'avg_temperature', 'avg_humidity', 'avg_wind_speed',
        'avg_rainfall', 'sample_count', 'prediction'
    ).collect()
    out_rows = []
    for r in rows:
        cid = int(r['prediction'])
        name, desc = label_map.get(cid, ('未命名簇', ''))
        out_rows.append(Row(
            region_name=r['region_name'],
            avg_temperature=float(r['avg_temperature']),
            avg_humidity=float(r['avg_humidity']),
            avg_wind_speed=float(r['avg_wind_speed']),
            avg_rainfall=float(r['avg_rainfall']),
            sample_count=int(r['sample_count']),
            cluster_id=cid,
            cluster_label=name,
            cluster_feature_desc=desc,
            chosen_k=int(best_k),
            silhouette_score=float(round(best_score, 2)),
        ))

    schema = StructType([
        StructField('region_name', StringType(), True),
        StructField('avg_temperature', DoubleType(), True),
        StructField('avg_humidity', DoubleType(), True),
        StructField('avg_wind_speed', DoubleType(), True),
        StructField('avg_rainfall', DoubleType(), True),
        StructField('sample_count', IntegerType(), True),
        StructField('cluster_id', IntegerType(), True),
        StructField('cluster_label', StringType(), True),
        StructField('cluster_feature_desc', StringType(), True),
        StructField('chosen_k', IntegerType(), True),
        StructField('silhouette_score', DoubleType(), True),
    ])
    result = spark.createDataFrame(out_rows, schema=schema).orderBy('cluster_id', 'region_name')
    save_analysis_result(result, 'region_weather_cluster_analysis')
    return result

六、项目文档展示

在这里插入图片描述

七、总结

本课题围绕分区逐时天气预报预警数据,完成了「基于大数据的天气预报预警数据可视化与分析」系统。数据侧用 pandas 清洗并落盘,经 Hadoop/Spark 开展离线计算;业务上覆盖区域对比、时序演变、气象要素、天气态势、风雨关联六维分析,风险洞察维再接入 K-Means 区域分群、Isolation Forest 异常识别与 FP-Growth 共现规则。结果写入 MySQL,由 Django 提供分析接口,Vue + ECharts 做分维页面与可视化大屏,并支持预报数据 CRUD。系统把分散表格转成可筛选、可对照的分析视图,便于梳理区域气象结构与风雨风险线索,对学习研究与预警关注演示有实际参考价值。

大家可以帮忙点赞、收藏、关注、评论啦👇🏻👇🏻👇🏻

💖🔥作者主页:计算机毕设木哥🔥 💖

更多推荐