计算机毕业设计:Python城市气候分析与预测平台 Flask框架 随机森林 K-Means 可视化 数据分析 大数据 机器学习 深度学习(建议收藏)✅
1、项目介绍
技术栈
采用 Python 语言开发,基于 Flask 框架搭建后端服务,使用 sqlite 数据库进行数据存储,前端利用 Echarts 实现数据可视化,运用机器学习中的 K-Means 聚类算法进行天气预测,采用随机森林回归算法预测气温。
功能模块
· 首页功能导航
· 天气年度变化分析
· 历史天气查询
· 月度气温变化分析
· 空气质量年度变化
· 空气污染年度占比
· 聚类算法天气预测
· 城市气温预测
· 用户登录
项目介绍
本系统基于数据挖掘技术与机器学习算法,构建城市天气数据分析与预测平台。系统提供天气年度变化分析、历史天气查询、月度气温变化分析、空气质量年度变化及污染占比分析等可视化功能,通过折线图、饼图、柱状图等形式直观呈现气温、天气状况、风力风向及空气质量指标的变化规律。采用 K-Means 聚类算法实现天气数据预测,运用随机森林回归算法预测未来气温趋势,展示历史实际值与预测值的对比。系统还包含用户登录注册功能,保障访问安全。
2、项目界面
基于数据挖掘的城市天气数据分析及预测系统
该系统为城市天气数据分析预测平台,首页展示历史天气查询、天气年度变化分析、空气质量预测等多类功能入口,提供直观的功能导航与说明,帮助用户快速进入各天气数据的分析、查询与预测模块。
基于数据挖掘的城市天气数据分析及预测系统-天气年度变化分析
该页面支持选择城市与时间区间进行分析,通过折线图展示气温变化趋势,搭配饼图呈现天气状况占比,辅以柱状图统计风力风向天数,实现多维度天气年度数据可视化分析。
基于数据挖掘的城市天气数据分析及预测系统
该页面提供历史天气查询功能,支持选择城市、年份与月份,可查询并展示天气状况、最高/最低气温、风力风向等数据,以列表形式呈现历史天气详情,方便快速检索查看。
基于数据挖掘的城市天气数据分析及预测系统-月度气温变化情况
该页面支持选择城市与月份,通过折线图可视化展示多年度平均最高气温与平均最低气温的变化趋势,直观呈现月度气温的年度波动情况,实现气温数据的多维度对比分析。
基于数据挖掘的城市天气数据分析及预测系统-空气质量年度变化
该页面支持选择城市、年份与空气质量指标,通过折线图可视化展示对应指标的年度变化趋势,直观呈现空气质量的年度波动情况,实现空气质量数据的可视化分析。
基于数据挖掘的城市天气数据分析及预测系统-空气污染年度占比
该页面支持选择城市与年份,通过饼图展示不同污染等级的年度占比,搭配多指标折线图呈现各类空气污染物的年度变化趋势,实现空气污染数据的多维度可视化分析。
基于数据挖掘的城市天气数据分析及预测系统-聚类算法天气预测
该页面支持选择城市、年份、月份与日期,通过聚类算法预测对应日期的天气数据,以表格形式展示天气状况、气温、风力风向、AQI指数等预测结果,实现未来天气的智能预测。
基于数据挖掘的城市天气数据分析及预测系统-城市气温预测
该页面支持选择城市,通过机器学习算法预测未来气温趋势,以折线图同步展示历史实际气温与未来预测气温,直观呈现气温变化规律与预测结果,实现城市气温的智能预测与可视化展示。
基于数据挖掘的城市天气数据分析及预测系统-用户登录
该页面是系统的身份验证入口,提供用户名与密码输入框,支持用户登录操作,同时提供注册入口,用于新用户创建账户,保障系统访问的安全性与权限管理。
3、项目说明
一、技术栈简要说明
本系统采用 Python 语言开发,基于 Flask 框架搭建后端服务,使用 sqlite 数据库进行数据存储,前端利用 Echarts 实现数据可视化,运用机器学习中的 K-Means 聚类算法进行天气预测,采用随机森林回归算法预测气温。
二、功能模块详细介绍
· 首页功能导航
该页面为城市天气数据分析预测平台的主入口,展示历史天气查询、天气年度变化分析、空气质量预测等多类功能入口,提供直观的功能导航与说明,帮助用户快速进入各天气数据的分析、查询与预测模块。
· 天气年度变化分析
该页面支持选择城市与时间区间进行分析,通过折线图展示气温变化趋势,搭配饼图呈现天气状况占比,辅以柱状图统计风力风向天数,实现多维度天气年度数据可视化分析,帮助用户全面了解城市年度天气特征。
· 历史天气查询
该页面提供历史天气查询功能,支持选择城市、年份与月份,可查询并展示天气状况、最高气温、最低气温、风力风向等数据,以列表形式呈现历史天气详情,方便用户快速检索和查看特定时间段的历史气象记录。
· 月度气温变化情况
该页面支持选择城市与月份,通过折线图可视化展示多年度平均最高气温与平均最低气温的变化趋势,直观呈现月度气温的年度波动情况,实现气温数据的多维度对比分析,助力用户把握气温的长期变化规律。
· 空气质量年度变化
该页面支持选择城市、年份与空气质量指标,通过折线图可视化展示对应指标的年度变化趋势,直观呈现空气质量的年度波动情况,实现空气质量数据的可视化分析,帮助用户了解城市空气质量的动态变化。
· 空气污染年度占比
该页面支持选择城市与年份,通过饼图展示不同污染等级的年度占比,搭配多指标折线图呈现各类空气污染物的年度变化趋势,实现空气污染数据的多维度可视化分析,为用户提供污染构成的直观认知。
· 聚类算法天气预测
该页面支持选择城市、年份、月份与日期,通过 K-Means 聚类算法预测对应日期的天气数据,以表格形式展示天气状况、气温、风力风向、AQI 指数等预测结果,实现未来天气的智能预测,为用户提供决策参考。
· 城市气温预测
该页面支持选择城市,通过随机森林回归算法预测未来气温趋势,以折线图同步展示历史实际气温与未来预测气温,直观呈现气温变化规律与预测结果,实现城市气温的智能预测与可视化展示,帮助用户提前做好气温变化应对准备。
· 用户登录
该页面是系统的身份验证入口,提供用户名与密码输入框,支持用户登录操作,同时提供注册入口,用于新用户创建账户,保障系统访问的安全性与权限管理,确保不同用户拥有差异化的操作权限。
三、项目总结
本系统基于数据挖掘技术与机器学习算法,构建城市天气数据分析与预测平台。系统提供天气年度变化分析、历史天气查询、月度气温变化分析、空气质量年度变化及污染占比分析等可视化功能,通过折线图、饼图、柱状图等形式直观呈现气温、天气状况、风力风向及空气质量指标的变化规律。采用 K-Means 聚类算法实现天气数据预测,运用随机森林回归算法预测未来气温趋势,展示历史实际值与预测值的对比。系统还包含用户登录注册功能,保障访问安全。整体而言,本系统为气象研究、环境监测、出行规划及农业生产等领域提供了科学的数据支持与决策参考。
4、核心代码
main_bp.route('/api/clustering_prediction')defapi_clustering_prediction():"""聚类算法天气预测API"""city_id=request.args.get('city_id')predict_date=request.args.get('predict_date')ifnotall([city_id,predict_date]):returnjsonify({'error':'缺少必要参数'}),400importpandasaspdfromsklearn.clusterimportKMeansfromsklearn.preprocessingimportLabelEncoder,StandardScalerimportnumpyasnp# 获取该城市的所有历史数据用于聚类分析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()ifnotrows:returnjsonify({'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'])ifdf.empty:returnjsonify({'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=[]forfinfeatures:iffindf.columnsanddf[f].notna().sum()>0:available_features.append(f)iflen(available_features)==0:returnjsonify({'error':'没有足够的有效数据进行聚类分析'}),400X=df[available_features].copy()# 填充数值特征的缺失值forcolinX.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)# 将聚类结果添加到DataFramedf['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=[]forfinavailable_features:iff=='month':target_features.append(target_month)eliff=='day_of_year':target_features.append(target_day_of_year)eliff=='day_of_week':target_features.append(target_day_of_week)else:# 对于其他特征,使用历史平均值作为初始估计target_features.append(df[f].mean()ifdf[f].dtypein['float64','int64']elsedf[f].mode().iloc[0]iflen(df[f].mode())>0else0)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]ifcluster_data.empty:# 如果目标聚类为空,使用第二近的聚类sorted_indices=np.argsort(distances)foridxinsorted_indices[1:]:# 跳过最近的(已知为空)cluster_data=df[df['cluster']==idx]ifnotcluster_data.empty:target_cluster=idxbreakifcluster_data.empty:returnjsonify({'error':'无法找到合适的聚类进行预测'}),400# 基于聚类结果进行预测 - 对每种天气要素分别预测# 温度预测pred_max_temp=float(cluster_data['max_temperature'].mean())if'max_temperature'incluster_data.columnselse20pred_min_temp=float(cluster_data['min_temperature'].mean())if'min_temperature'incluster_data.columnselse15# AQI预测pred_aqi=float(cluster_data['aqi_index'].median())if'aqi_index'incluster_data.columnsandcluster_data['aqi_index'].notna().any()else100# 天气状况预测(选择该聚类中最常见的天气)if'weather_condition'incluster_data.columns:pred_weather=cluster_data['weather_condition'].mode().iloc[0]iflen(cluster_data['weather_condition'].mode())>0else'多云'else:pred_weather='多云'# 风力风向预测(选择该聚类中最常见的风力风向)if'max_wind_force'incluster_data.columns:pred_max_wind_force=cluster_data['max_wind_force'].mode().iloc[0]iflen(cluster_data['max_wind_force'].mode())>0else'微风'else:pred_max_wind_force='微风'if'max_wind_direction'incluster_data.columns:pred_max_wind_direction=cluster_data['max_wind_direction'].mode().iloc[0]iflen(cluster_data['max_wind_direction'].mode())>0else'北'else:pred_max_wind_direction='北'if'min_wind_force'incluster_data.columns:pred_min_wind_force=cluster_data['min_wind_force'].mode().iloc[0]iflen(cluster_data['min_wind_force'].mode())>0else'微风'else:pred_min_wind_force='微风'if'min_wind_direction'incluster_data.columns:pred_min_wind_direction=cluster_data['min_wind_direction'].mode().iloc[0]iflen(cluster_data['min_wind_direction'].mode())>0else'北'else:pred_min_wind_direction='北'# 确保温度合理ifpred_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)}returnjsonify({'prediction':prediction})