大数据毕业设计选题:【基于大数据的全球地震数据分析与可视化】PySpark 六维分析+可视化大屏

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

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

一、项目介绍

全球中强震目录跨年跨区,字段里既有震级深度,也有台站几何与定位误差一类观测信息,体量到八万多条后,靠表格翻找很难同时看清时空活跃、地理热点和异常突出事件。业务上又希望把结果落到分维页面和大屏,手工做统计和聚类门槛偏高。本文通过开发一个基于大数据的全球地震数据分析与可视化系统,用以帮助解决全球地震目录难汇总、难分群和难可视化阅读的问题。
本系统采用 Hadoop 与 Spark 做数据上传、预处理和分维统计,并用 Python 与 scikit-learn 落地 DBSCAN、K-Means 与 Isolation Forest。后端 Django 把分析结果接口化,前端 Vue 配合 ECharts 呈现分析页与可视化大屏,功能覆盖时空分布、震级深度、地理热点、事件属性、观测指标和风险洞察,并带地震数据维护与登录后的大屏浏览。
经过系统测试,本系统能满足地震业务观察人员、数据分析人员和计算机专业学生在全球地震目录对照、热点分群与可视化展示方面的需求。八万余条 USGS 风格记录整理成可筛选的分析页和大屏后,阅读门槛会低一些,对教学演示和业务阅读都有实际帮助。

二、视频展示

基于大数据的全球地震数据分析与可视化

三、开发环境

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

四、系统展示

登录模块:
在这里插入图片描述
在这里插入图片描述

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

五、代码展示

# Hadoop_Spark/risk_insight_analysis.py — source_feature_cluster_analysis
def source_feature_cluster_analysis(input_df):
    """震源特征分群:mag/depth/gap/rms → 轮廓系数选 K → Spark KMeans → 中文标签。"""
    work = input_df.filter(
        col('mag').isNotNull() & col('depth').isNotNull()
        & col('gap').isNotNull() & col('rms').isNotNull()
    ).select('mag', 'depth', 'gap', 'rms')
    sampled, sn = _sample_spark(work, SAMPLE_LIMIT)

    # 特征组装 + 标准化
    assembler = VectorAssembler(
        inputCols=['mag', 'depth', 'gap', 'rms'], outputCol='features_raw')
    assembled = assembler.transform(sampled)
    scaler = StandardScaler(
        inputCol='features_raw', outputCol='features', withMean=True, withStd=True)
    scaled = scaler.fit(assembled).transform(assembled)

    # 轮廓系数在 K=3~6 中选优
    pdf_feat = scaled.select('mag', 'depth', 'gap', 'rms').toPandas()
    from sklearn.metrics import silhouette_score
    from sklearn.cluster import KMeans as SkKMeans
    from sklearn.preprocessing import StandardScaler as SkScaler

    X = pdf_feat[['mag', 'depth', 'gap', 'rms']].astype(float).values
    Xs = SkScaler().fit_transform(X)
    best_k, best_score = 4, -1.0
    for k in range(3, 7):
        labs = SkKMeans(n_clusters=k, random_state=RANDOM_SEED, n_init=10).fit_predict(Xs)
        score = float(silhouette_score(Xs, labs))
        logger.info(f"轮廓系数选K: k={k}, silhouette={score:.4f}")
        if score > best_score:
            best_k, best_score = k, score
    logger.info(f"选定 K={best_k}(轮廓系数最高 {best_score:.4f})")

    # Spark MLlib 正式聚类
    kmeans = SparkKMeans(
        k=best_k, seed=RANDOM_SEED,
        featuresCol='features', predictionCol='cluster_id')
    pred = kmeans.fit(scaled).transform(scaled)

    # 按簇心相对排序贴中文业务标签
    centers = pred.groupBy('cluster_id').agg(
        spark_count(lit(1)).alias('event_count'),
        spark_round(spark_avg('mag'), 2).alias('avg_mag'),
        spark_round(spark_avg('depth'), 2).alias('avg_depth'),
        spark_round(spark_avg('gap'), 2).alias('avg_gap'),
        spark_round(spark_avg('rms'), 2).alias('avg_rms'),
    )
    center_pdf = centers.toPandas().sort_values('avg_mag').reset_index(drop=True)
    n = len(center_pdf)

    depth_sorted = center_pdf.sort_values('avg_depth')['cluster_id'].tolist()
    depth_rank_map = {}
    for i, cid in enumerate(depth_sorted):
        if i == 0:
            depth_rank_map[cid] = '偏浅源'
        elif i == n - 1:
            depth_rank_map[cid] = '偏深源'
        else:
            depth_rank_map[cid] = '中等深度'

    gap_sorted = center_pdf.sort_values('avg_gap')['cluster_id'].tolist()
    gap_rank_map = {}
    for i, cid in enumerate(gap_sorted):
        if i == n - 1:
            gap_rank_map[cid] = '高方位间隙'
        elif i == 0:
            gap_rank_map[cid] = '低方位间隙'
        else:
            gap_rank_map[cid] = '中等方位间隙'

    rows = []
    for i, row in center_pdf.iterrows():
        cid = int(row['cluster_id'])
        tert = int(i * 3 / n) if n >= 3 else 1
        mag_zh = ['低震级', '中震级', '高震级'][min(tert, 2)]
        label = f"{depth_rank_map[cid]}{mag_zh}{gap_rank_map[cid]}群"
        rows.append({
            'cluster_id': cid,
            'cluster_label_zh': label,
            'cluster_desc_zh': (
                f"均震级{float(row['avg_mag']):.2f}/均深度{float(row['avg_depth']):.2f}km/"
                f"均间隙{float(row['avg_gap']):.2f}/均残差{float(row['avg_rms']):.2f}"
            ),
            'event_count': int(row['event_count']),
            'avg_mag': round(float(row['avg_mag']), 2),
            'avg_depth': round(float(row['avg_depth']), 2),
            'avg_gap': round(float(row['avg_gap']), 2),
            'avg_rms': round(float(row['avg_rms']), 2),
            'sample_size': int(sn),
            'k_selected': int(best_k),
            'silhouette': round(float(best_score), 2),
        })

    out_pdf = pd.DataFrame(rows).sort_values('event_count', ascending=False)
    path = _write_csv_pandas(out_pdf, 'source_feature_cluster_analysis.csv')
    logger.info(f"保存到: {path} 成功")
    return out_pdf

六、项目文档展示

在这里插入图片描述

七、项目总结

本课题围绕 USGS 十年全球 M≥4.5 地震目录,开发了基于大数据的全球地震数据分析与可视化系统。系统以 Hadoop 与 Spark 完成数据上传、预处理和分维统计,用 Python 与 scikit-learn 落地 DBSCAN 震中热点聚类、K-Means 震源特征分群和 Isolation Forest 异常识别;后端 Django 提供分析接口,前端 Vue 与 ECharts 呈现时空分布、震级深度、地理热点、事件属性、观测指标、风险洞察六维分析页及可视化大屏,并支持地震数据维护。约八万条记录经清洗聚合后,可按维度对照活跃趋势、空间热点与异常事件,降低了目录阅读与分群解读的门槛。系统测试表明,本系统能够满足业务观察、数据分析与教学演示等场景对全球地震数据汇总、分群与可视化展示的需求,对同类大数据毕设具有一定参考价值。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值