精彩专栏推荐订阅:在下方主页👇🏻👇🏻👇🏻👇🏻
💖🔥作者主页:计算机毕设木哥🔥 💖
一、项目介绍
气象站地面观测数据体量大、要素杂,气温降水风速风向气压湿度能见度往往散落在长表里,靠人工翻表和简单统计,很难看清季节变化,也难做天气分型和异常时次筛查。业务与教学场景都缺一套能把海量实况洗干净、算明白、再直观看出来的工具。本文通过开发一个基于大数据的气象站地面观测数据分析与可视化系统,用以帮助解决地面观测数据难清洗、难挖掘、难直观呈现的问题。
本系统采用 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 以分析页和可视化大屏呈现,同时支持观测业务数据管理。经系统测试,本系统能够支撑气象业务相关人员查看实况规律、开展天气分型与异常筛查,也便于数据分析方向学习者把大数据处理、挖掘与可视化串成可演示流程,对地面观测数据的业务应用与毕业设计实践具有参考价值。
大家可以帮忙点赞、收藏、关注、评论啦 👇🏻
💖🔥作者主页:计算机毕设木哥🔥 💖

259

被折叠的 条评论
为什么被折叠?



