计算机毕业设计:Python城市天气数据挖掘与预测系统 Flask框架 随机森林 K-Means 可视化 数据分析 大数据 机器学习 深度学习(建议收藏)✅

博主介绍:✌全网粉丝50W+,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,选择我们,就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅**感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。**🍅

1、毕业设计:2026年计算机专业毕业设计选题汇总(建议收藏)✅

2、最全计算机大数据专业毕业设计选题大全(建议收藏)✅

1、项目介绍

技术栈

采用 Python 语言开发,基于 Flask 框架搭建后端服务,使用 sqlite 数据库进行数据存储,前端利用 Echarts 实现数据可视化,运用机器学习中的 K-Means 聚类算法进行天气预测,采用随机森林回归算法预测气温。

功能模块

· 首页功能导航

· 天气年度变化分析

· 历史天气查询

· 月度气温变化分析

· 空气质量年度变化

· 空气污染年度占比

· 聚类算法天气预测

· 城市气温预测

· 用户登录

项目介绍

本系统基于数据挖掘技术与机器学习算法,构建城市天气数据分析与预测平台。系统提供天气年度变化分析、历史天气查询、月度气温变化分析、空气质量年度变化及污染占比分析等可视化功能,通过折线图、饼图、柱状图等形式直观呈现气温、天气状况、风力风向及空气质量指标的变化规律。采用 K-Means 聚类算法实现天气数据预测,运用随机森林回归算法预测未来气温趋势,展示历史实际值与预测值的对比。系统还包含用户登录注册功能,保障访问安全。

2、项目界面

基于数据挖掘的城市天气数据分析及预测系统

该系统为城市天气数据分析预测平台,首页展示历史天气查询、天气年度变化分析、空气质量预测等多类功能入口,提供直观的功能导航与说明,帮助用户快速进入各天气数据的分析、查询与预测模块。

基于数据挖掘的城市天气数据分析及预测系统-天气年度变化分析

该页面支持选择城市与时间区间进行分析,通过折线图展示气温变化趋势,搭配饼图呈现天气状况占比,辅以柱状图统计风力风向天数,实现多维度天气年度数据可视化分析。

基于数据挖掘的城市天气数据分析及预测系统

该页面提供历史天气查询功能,支持选择城市、年份与月份,可查询并展示天气状况、最高/最低气温、风力风向等数据,以列表形式呈现历史天气详情,方便快速检索查看。

基于数据挖掘的城市天气数据分析及预测系统-月度气温变化情况

该页面支持选择城市与月份,通过折线图可视化展示多年度平均最高气温与平均最低气温的变化趋势,直观呈现月度气温的年度波动情况,实现气温数据的多维度对比分析。

基于数据挖掘的城市天气数据分析及预测系统-空气质量年度变化

该页面支持选择城市、年份与空气质量指标,通过折线图可视化展示对应指标的年度变化趋势,直观呈现空气质量的年度波动情况,实现空气质量数据的可视化分析。

基于数据挖掘的城市天气数据分析及预测系统-空气污染年度占比

该页面支持选择城市与年份,通过饼图展示不同污染等级的年度占比,搭配多指标折线图呈现各类空气污染物的年度变化趋势,实现空气污染数据的多维度可视化分析。

基于数据挖掘的城市天气数据分析及预测系统-聚类算法天气预测

该页面支持选择城市、年份、月份与日期,通过聚类算法预测对应日期的天气数据,以表格形式展示天气状况、气温、风力风向、AQI指数等预测结果,实现未来天气的智能预测。

基于数据挖掘的城市天气数据分析及预测系统-城市气温预测

该页面支持选择城市,通过机器学习算法预测未来气温趋势,以折线图同步展示历史实际气温与未来预测气温,直观呈现气温变化规律与预测结果,实现城市气温的智能预测与可视化展示。

基于数据挖掘的城市天气数据分析及预测系统-用户登录

该页面是系统的身份验证入口,提供用户名与密码输入框,支持用户登录操作,同时提供注册入口,用于新用户创建账户,保障系统访问的安全性与权限管理。

3、项目说明

一、技术栈简要说明

本系统采用 Python 语言开发,基于 Flask 框架搭建后端服务,使用 sqlite 数据库进行数据存储,前端利用 Echarts 实现数据可视化,运用机器学习中的 K-Means 聚类算法进行天气预测,采用随机森林回归算法预测气温。

二、功能模块详细介绍

· 首页功能导航

该页面为城市天气数据分析预测平台的主入口,展示历史天气查询、天气年度变化分析、空气质量预测等多类功能入口,提供直观的功能导航与说明,帮助用户快速进入各天气数据的分析、查询与预测模块。

· 天气年度变化分析

该页面支持选择城市与时间区间进行分析,通过折线图展示气温变化趋势,搭配饼图呈现天气状况占比,辅以柱状图统计风力风向天数,实现多维度天气年度数据可视化分析,帮助用户全面了解城市年度天气特征。

· 历史天气查询

该页面提供历史天气查询功能,支持选择城市、年份与月份,可查询并展示天气状况、最高气温、最低气温、风力风向等数据,以列表形式呈现历史天气详情,方便用户快速检索和查看特定时间段的历史气象记录。

· 月度气温变化情况

该页面支持选择城市与月份,通过折线图可视化展示多年度平均最高气温与平均最低气温的变化趋势,直观呈现月度气温的年度波动情况,实现气温数据的多维度对比分析,助力用户把握气温的长期变化规律。

· 空气质量年度变化

该页面支持选择城市、年份与空气质量指标,通过折线图可视化展示对应指标的年度变化趋势,直观呈现空气质量的年度波动情况,实现空气质量数据的可视化分析,帮助用户了解城市空气质量的动态变化。

· 空气污染年度占比

该页面支持选择城市与年份,通过饼图展示不同污染等级的年度占比,搭配多指标折线图呈现各类空气污染物的年度变化趋势,实现空气污染数据的多维度可视化分析,为用户提供污染构成的直观认知。

· 聚类算法天气预测

该页面支持选择城市、年份、月份与日期,通过 K-Means 聚类算法预测对应日期的天气数据,以表格形式展示天气状况、气温、风力风向、AQI 指数等预测结果,实现未来天气的智能预测,为用户提供决策参考。

· 城市气温预测

该页面支持选择城市,通过随机森林回归算法预测未来气温趋势,以折线图同步展示历史实际气温与未来预测气温,直观呈现气温变化规律与预测结果,实现城市气温的智能预测与可视化展示,帮助用户提前做好气温变化应对准备。

· 用户登录

该页面是系统的身份验证入口,提供用户名与密码输入框,支持用户登录操作,同时提供注册入口,用于新用户创建账户,保障系统访问的安全性与权限管理,确保不同用户拥有差异化的操作权限。

三、项目总结

本系统基于数据挖掘技术与机器学习算法,构建城市天气数据分析与预测平台。系统提供天气年度变化分析、历史天气查询、月度气温变化分析、空气质量年度变化及污染占比分析等可视化功能,通过折线图、饼图、柱状图等形式直观呈现气温、天气状况、风力风向及空气质量指标的变化规律。采用 K-Means 聚类算法实现天气数据预测,运用随机森林回归算法预测未来气温趋势,展示历史实际值与预测值的对比。系统还包含用户登录注册功能,保障访问安全。整体而言,本系统为气象研究、环境监测、出行规划及农业生产等领域提供了科学的数据支持与决策参考。

4、核心代码

python 复制代码
main_bp.route('/api/clustering_prediction')
def api_clustering_prediction():
    """聚类算法天气预测API"""
    city_id = request.args.get('city_id')
    predict_date = request.args.get('predict_date')
    
    if not all([city_id, predict_date]):
        return jsonify({'error': '缺少必要参数'}), 400
    
    import pandas as pd
    from sklearn.cluster import KMeans
    from sklearn.preprocessing import LabelEncoder, StandardScaler
    import numpy as np
    
    # 获取该城市的所有历史数据用于聚类分析
    conn = get_db_connection()
    cursor = conn.cursor()
    
    # 查询历史数据
    query = """
    SELECT date, weather_condition, max_temperature, min_temperature,
           max_wind_force, max_wind_direction, min_wind_force, min_wind_direction,
           aqi_index, pm25, pm10, so2, no2, co, o3
    FROM weather_data
    WHERE city_id = ? AND date < ?
    ORDER BY date
    """
    
    cursor.execute(query, (city_id, predict_date))
    rows = cursor.fetchall()
    
    conn.close()
    
    if not rows:
        return jsonify({'error': '没有足够的历史数据进行预测'}), 400
    
    # 准备数据进行聚类
    df = pd.DataFrame(rows, columns=['date', 'weather_condition', 'max_temperature', 'min_temperature',
                                   'max_wind_force', 'max_wind_direction', 'min_wind_force', 'min_wind_direction',
                                   'aqi_index', 'pm25', 'pm10', 'so2', 'no2', 'co', 'o3'])
    
    # 处理缺失值 - 只需要关键字段不为空
    df = df.dropna(subset=['max_temperature', 'min_temperature'])
    
    if df.empty:
        return jsonify({'error': '没有足够的有效数据进行聚类分析'}), 400
    
    # 特征工程 - 提取日期特征
    df['date'] = pd.to_datetime(df['date'])
    df['month'] = df['date'].dt.month
    df['day_of_year'] = df['date'].dt.dayofyear
    df['day_of_week'] = df['date'].dt.dayofweek
    
    # 对分类变量进行编码
    le_weather = LabelEncoder()
    le_wind_force = LabelEncoder()
    le_wind_direction = LabelEncoder()
    
    # 填充缺失值
    df['weather_condition'] = df['weather_condition'].fillna('未知')
    df['max_wind_force'] = df['max_wind_force'].fillna('微风')
    df['max_wind_direction'] = df['max_wind_direction'].fillna('北')
    df['min_wind_force'] = df['min_wind_force'].fillna('微风')
    df['min_wind_direction'] = df['min_wind_direction'].fillna('北')
    df['aqi_index'] = df['aqi_index'].fillna(df['aqi_index'].median())
    
    # 编码分类变量
    df['weather_encoded'] = le_weather.fit_transform(df['weather_condition'])
    df['max_wind_force_encoded'] = le_wind_force.fit_transform(df['max_wind_force'])
    df['max_wind_direction_encoded'] = le_wind_direction.fit_transform(df['max_wind_direction'])
    df['min_wind_force_encoded'] = le_wind_force.transform(df['min_wind_force'])
    df['min_wind_direction_encoded'] = le_wind_direction.transform(df['min_wind_direction'])
    
    # 准备聚类特征
    features = [
        'max_temperature', 'min_temperature', 'aqi_index', 'pm25', 'pm10', 
        'so2', 'no2', 'co', 'o3', 'month', 'day_of_year', 'day_of_week',
        'weather_encoded', 'max_wind_force_encoded', 'max_wind_direction_encoded',
        'min_wind_force_encoded', 'min_wind_direction_encoded'
    ]
    
    # 检查是否有足够的有效数据
    available_features = []
    for f in features:
        if f in df.columns and df[f].notna().sum() > 0:
            available_features.append(f)
    
    if len(available_features) == 0:
        return jsonify({'error': '没有足够的有效数据进行聚类分析'}), 400
    
    X = df[available_features].copy()
    
    # 填充数值特征的缺失值
    for col in X.select_dtypes(include=[np.number]).columns:
        X[col] = X[col].fillna(X[col].mean())
    
    # 标准化特征
    scaler = StandardScaler()
    X_scaled = scaler.fit_transform(X)
    
    # 确定聚类数量(使用肘部法则的简化版)
    n_samples = X_scaled.shape[0]
    n_clusters = min(10, max(3, n_samples // 15 + 1))  # 至少3个聚类,最多10个
    
    # 应用K-means聚类
    kmeans = KMeans(n_clusters=n_clusters, random_state=42, n_init=10)
    clusters = kmeans.fit_predict(X_scaled)
    
    # 将聚类结果添加到DataFrame
    df['cluster'] = clusters
    
    # 获取目标日期的特征(用于预测当天的日期特征)
    target_date = pd.to_datetime(predict_date)
    target_month = target_date.month
    target_day_of_year = target_date.dayofyear
    target_day_of_week = target_date.dayofweek
    
    # 构建目标特征向量(使用可获得的特征)
    target_features = []
    for f in available_features:
        if f == 'month':
            target_features.append(target_month)
        elif f == 'day_of_year':
            target_features.append(target_day_of_year)
        elif f == 'day_of_week':
            target_features.append(target_day_of_week)
        else:
            # 对于其他特征,使用历史平均值作为初始估计
            target_features.append(df[f].mean() if df[f].dtype in ['float64', 'int64'] else df[f].mode().iloc[0] if len(df[f].mode()) > 0 else 0)
    
    target_features_scaled = scaler.transform([target_features])
    
    # 找到距离最近的聚类中心
    distances = np.sqrt(((kmeans.cluster_centers_ - target_features_scaled)**2).sum(axis=1))
    target_cluster = np.argmin(distances)
    
    # 获取属于同一聚类的数据
    cluster_data = df[df['cluster'] == target_cluster]
    
    if cluster_data.empty:
        # 如果目标聚类为空,使用第二近的聚类
        sorted_indices = np.argsort(distances)
        for idx in sorted_indices[1:]:  # 跳过最近的(已知为空)
            cluster_data = df[df['cluster'] == idx]
            if not cluster_data.empty:
                target_cluster = idx
                break
    
    if cluster_data.empty:
        return jsonify({'error': '无法找到合适的聚类进行预测'}), 400
    
    # 基于聚类结果进行预测 - 对每种天气要素分别预测
    # 温度预测
    pred_max_temp = float(cluster_data['max_temperature'].mean()) if 'max_temperature' in cluster_data.columns else 20
    pred_min_temp = float(cluster_data['min_temperature'].mean()) if 'min_temperature' in cluster_data.columns else 15
    
    # AQI预测
    pred_aqi = float(cluster_data['aqi_index'].median()) if 'aqi_index' in cluster_data.columns and cluster_data['aqi_index'].notna().any() else 100
    
    # 天气状况预测(选择该聚类中最常见的天气)
    if 'weather_condition' in cluster_data.columns:
        pred_weather = cluster_data['weather_condition'].mode().iloc[0] if len(cluster_data['weather_condition'].mode()) > 0 else '多云'
    else:
        pred_weather = '多云'
    
    # 风力风向预测(选择该聚类中最常见的风力风向)
    if 'max_wind_force' in cluster_data.columns:
        pred_max_wind_force = cluster_data['max_wind_force'].mode().iloc[0] if len(cluster_data['max_wind_force'].mode()) > 0 else '微风'
    else:
        pred_max_wind_force = '微风'
    
    if 'max_wind_direction' in cluster_data.columns:
        pred_max_wind_direction = cluster_data['max_wind_direction'].mode().iloc[0] if len(cluster_data['max_wind_direction'].mode()) > 0 else '北'
    else:
        pred_max_wind_direction = '北'
    
    if 'min_wind_force' in cluster_data.columns:
        pred_min_wind_force = cluster_data['min_wind_force'].mode().iloc[0] if len(cluster_data['min_wind_force'].mode()) > 0 else '微风'
    else:
        pred_min_wind_force = '微风'
    
    if 'min_wind_direction' in cluster_data.columns:
        pred_min_wind_direction = cluster_data['min_wind_direction'].mode().iloc[0] if len(cluster_data['min_wind_direction'].mode()) > 0 else '北'
    else:
        pred_min_wind_direction = '北'
    
    # 确保温度合理
    if pred_min_temp > pred_max_temp:
        pred_min_temp, pred_max_temp = pred_max_temp, pred_min_temp
    
    # 限制AQI在合理范围内
    pred_aqi = max(0, min(500, pred_aqi))
    
    prediction = {
        'weather_condition': pred_weather,
        'max_temperature': round(pred_max_temp, 1),
        'min_temperature': round(pred_min_temp, 1),
        'max_wind_force': pred_max_wind_force,
        'max_wind_direction': pred_max_wind_direction,
        'min_wind_force': pred_min_wind_force,
        'min_wind_direction': pred_min_wind_direction,
        'aqi_index': round(pred_aqi)
    }
    
    return jsonify({'prediction': prediction})

5、源码获取方式

相关推荐
Dxy12393102162 小时前
Python在图片上画多边形:从简单轮廓到复杂区域标注
开发语言·python
数智化管理手记2 小时前
零基础认知精益生产——核心本质与必避误区
大数据·数据库·人工智能·低代码·制造
weixin_381288182 小时前
MongoDB备节点无法读取数据怎么解决_rs.slaveOk()与Secondary读取权限
jvm·数据库·python
南尘NCA86662 小时前
如何解决企业微信防封行业高封号率痛点
python·企业微信
dyxal2 小时前
内网 Windows 离线安装 uv:极速 Python 包管理器的部署实战
windows·python·uv
qq_654366982 小时前
Vue 3 中集成 Three.js 场景的完整实践指南
jvm·数据库·python
人邮异步社区2 小时前
文科生零基础学 Python 难吗?真不难,难的是找对书!
开发语言·python
用户5191495848452 小时前
Kubernetes kubeadm 集群部署与 CKA 实战指南
人工智能·aigc
qq_424098562 小时前
JavaScript中箭头函数在类方法定义中的this绑定优势
jvm·数据库·python