计算机毕业设计选题推荐【基于大数据的气象站地面观测数据分析与可视化】Hadoop+Spark+K-Means

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

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

一、项目介绍

气象站地面观测数据体量大、要素杂,气温降水风速风向气压湿度能见度往往散落在长表里,靠人工翻表和简单统计,很难看清季节变化,也难做天气分型和异常时次筛查。业务与教学场景都缺一套能把海量实况洗干净、算明白、再直观看出来的工具。本文通过开发一个基于大数据的气象站地面观测数据分析与可视化系统,用以帮助解决地面观测数据难清洗、难挖掘、难直观呈现的问题。
本系统采用 Hadoop、Spark(PySpark)、Python、Django、Vue、MySQL 与 ECharts,算法侧用到 K-Means、Isolation Forest 和气温季节分解。功能覆盖地面观测数据管理,以及气温变化、降水特征、风场结构、湿压协同、能见视程等多维统计分析,并完成天气画像里的类型聚类与异常侦测,前端用分析页和可视化大屏把结果展示出来。
经过系统测试,本系统能满足气象业务相关人员查看实况规律、做天气分型与异常筛查的需求,也方便数据分析方向的学生把大数据处理、挖掘和可视化串成一套可演示流程,对地面观测数据的业务应用和毕设实践都挺有参考意义。

二、视频展示

计算机毕业设计选题推荐【基于大数据的气象站地面观测数据分析

三、开发环境

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

四、系统展示

系统页面模块展示:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

五、代码展示

# Hadoop_Spark/weather_profile_analysis.py(算法核心)
FEATURE_COLS = [
    'temperature_c', 'relative_humidity_pct', 'pressure_hpa',
    'wind_speed_ms', 'visibility_m',
]

def _feature_pdf(input_df):
    feat = input_df.select(
        col('observe_time').cast('string').alias('observe_time'),
        col('observe_date').cast('string').alias('observe_date'),
        col('month'), col('season'),
        *[col(c).cast('double').alias(c) for c in FEATURE_COLS],
    )
    for c in FEATURE_COLS:
        feat = feat.filter(col(c).isNotNull())
    return feat.toPandas()

def _rank_label(values, labels_high_mid_low):
    order = np.argsort(values)
    n = len(values)
    result = [''] * n
    if n == 1:
        result[0] = labels_high_mid_low[1]
        return result
    if n == 2:
        result[order[0]] = labels_high_mid_low[2]
        result[order[1]] = labels_high_mid_low[0]
        return result
    result[order[0]] = labels_high_mid_low[2]
    result[order[-1]] = labels_high_mid_low[0]
    for i in order[1:-1]:
        result[i] = labels_high_mid_low[1]
    return result

def _build_cluster_labels(centers):
    temp_r = _rank_label(centers[:, 0], ['高温', '中温', '低温'])
    rh_r = _rank_label(centers[:, 1], ['高湿', '中湿', '低湿'])
    wind_r = _rank_label(centers[:, 3], ['大风', '中风', '静稳'])
    vis_r = _rank_label(centers[:, 4], ['高能见', '中能见', '低能见'])
    return [f"{temp_r[i]}{rh_r[i]}{wind_r[i]}{vis_r[i]}型" for i in range(centers.shape[0])]

def weather_type_cluster_analysis(input_df):
    pdf = _feature_pdf(input_df)
    X = pdf[FEATURE_COLS].astype(float).values
    scaler = StandardScaler()
    Xs = scaler.fit_transform(X)

    best_k, best_score, best_model = None, -1.0, None
    sample_idx = np.random.RandomState(42).choice(len(pdf), size=min(8000, len(pdf)), replace=False)
    for k in range(3, 7):
        model = KMeans(n_clusters=k, random_state=42, n_init=10)
        labels = model.fit_predict(Xs)
        score = silhouette_score(Xs[sample_idx], labels[sample_idx])
        if score > best_score:
            best_k, best_score, best_model = k, score, model

    cluster_ids = best_model.predict(Xs)
    centers_raw = scaler.inverse_transform(best_model.cluster_centers_)
    cluster_labels = _build_cluster_labels(centers_raw)

    rows = []
    total = float(len(pdf))
    for i in range(best_k):
        cnt = int((cluster_ids == i).sum())
        rows.append({
            'cluster_id': i,
            'cluster_label': cluster_labels[i],
            'sample_count': cnt,
            'ratio_pct': round(cnt * 100.0 / total, 2),
            'avg_temperature_c': round(float(centers_raw[i, 0]), 2),
            'avg_humidity_pct': round(float(centers_raw[i, 1]), 2),
            'avg_pressure_hpa': round(float(centers_raw[i, 2]), 2),
            'avg_wind_speed_ms': round(float(centers_raw[i, 3]), 2),
            'avg_visibility_m': round(float(centers_raw[i, 4]), 2),
            'silhouette_k': best_k,
            'silhouette_score': round(float(best_score), 2),
        })
    out = pd.DataFrame(rows).sort_values('cluster_id')
    path = _write_pandas(out, 'weather_type_cluster_analysis')
    return out

def abnormal_weather_detect_analysis(input_df):
    pdf = _feature_pdf(input_df)
    Xs = StandardScaler().fit_transform(pdf[FEATURE_COLS].astype(float).values)
    clf = IsolationForest(
        n_estimators=200, contamination=0.05, random_state=42, n_jobs=-1
    )
    pred = clf.fit_predict(Xs)          # -1 异常, 1 正常
    scores = clf.decision_function(Xs)
    pdf = pdf.copy()
    pdf['anomaly_score'] = scores
    pdf['anomaly_status'] = np.where(pred == -1, '异常', '正常')
    abn = pdf[pdf['anomaly_status'] == '异常'].sort_values('anomaly_score')
    keep = ['observe_time', 'observe_date', 'month', 'season'] + FEATURE_COLS + [
        'anomaly_score', 'anomaly_status'
    ]
    path = _write_pandas(abn[keep], 'abnormal_weather_detect_analysis')
    return abn

六、项目文档展示

在这里插入图片描述

七、项目总结

本课题围绕气象站地面观测数据体量大、要素多、人工翻表难成规律的问题,设计并实现了《基于大数据的气象站地面观测数据分析与可视化》系统。系统以 Hadoop、Spark(PySpark)完成约 10 万条观测数据的清洗与多维统计,覆盖气温变化、降水特征、风场结构、湿压协同、能见视程与天气画像等分析;天气画像侧采用 K-Means 做天气类型聚类、Isolation Forest 做异常时次侦测,并结合气温季节分解解释冷暖节律。结果经 Django、Vue、MySQL 与 ECharts 以分析页和可视化大屏呈现,同时支持观测业务数据管理。经系统测试,本系统能够支撑气象业务相关人员查看实况规律、开展天气分型与异常筛查,也便于数据分析方向学习者把大数据处理、挖掘与可视化串成可演示流程,对地面观测数据的业务应用与毕业设计实践具有参考价值。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值