当前位置:   article > 正文

基于Python的河南省天气数据分析与空气质量预测研究【含数据抓取与数据库自动存储】

基于Python的河南省天气数据分析与空气质量预测研究【含数据抓取与数据库自动存储】

有需要本项目的代码或文档以及全部资源,或者部署调试可以私信博主

抓取天气网站

在这里插入图片描述

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

在这里插入图片描述

以下是部分代码展示

import matplotlib.pyplot as plt
 
# 设置中文字体
plt.rcParams['axes.unicode_minus'] = False    # 不使用中文减号
plt.rcParams['font.sans-serif'] = 'FangSong'  # 设置字体为仿宋(FangSong)
  • 1
  • 2
  • 3
  • 4
  • 5
import pandas as pd


file_path = 'weather_info.csv'
weather_data = pd.read_csv(file_path)

# Displaying the first few rows of the dataset to understand its structure
weather_data.head()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
ymdhighlowtianqifengxiangfengliaqiaqiInfoaqiLeveltrain_levelProvinceCity
01/1/202050多云东南风1级72.02.00河南省郑州
12/1/20207-1多云东南风1级120.0轻度污染3.00河南省郑州
23/1/202010-2阴~多云东南风1级183.0中度污染4.00河南省郑州
34/1/2020111多云~中雨东南风2级242.0重度污染5.02河南省郑州
45/1/202020雨夹雪东北风3级274.0重度污染5.00河南省郑州
from datetime import datetime
import numpy as np
import matplotlib.pyplot as plt

# 数据清洗:删除含有空值的数据行
cleaned_data = weather_data.dropna()

# 数据字段扩充:将日期字段转换为年、月、日和星期
cleaned_data['date'] = pd.to_datetime(cleaned_data['ymd'], format='%d/%m/%Y')
cleaned_data['year'] = cleaned_data['date'].dt.year
cleaned_data['month'] = cleaned_data['date'].dt.month
cleaned_data['day'] = cleaned_data['date'].dt.day
cleaned_data['weekday'] = cleaned_data['date'].dt.day_name()

# 显示清洗和扩充后的数据
cleaned_data.head()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
ymdhighlowtianqifengxiangfengliaqiaqiInfoaqiLeveltrain_levelProvinceCitydateyearmonthdayweekday
01/1/202050多云东南风1级72.02.00河南省郑州2020-01-01202011Wednesday
12/1/20207-1多云东南风1级120.0轻度污染3.00河南省郑州2020-01-02202012Thursday
23/1/202010-2阴~多云东南风1级183.0中度污染4.00河南省郑州2020-01-03202013Friday
34/1/2020111多云~中雨东南风2级242.0重度污染5.02河南省郑州2020-01-04202014Saturday
45/1/202020雨夹雪东北风3级274.0重度污染5.00河南省郑州2020-01-05202015Sunday
from datetime import datetime
import numpy as np
import matplotlib.pyplot as plt

# 数据清洗:删除含有空值的数据行
cleaned_data = weather_data.dropna()

# 数据字段扩充:将日期字段转换为年、月、日和星期
cleaned_data['date'] = pd.to_datetime(cleaned_data['ymd'], format='%d/%m/%Y')
cleaned_data['year'] = cleaned_data['date'].dt.year
cleaned_data['month'] = cleaned_data['date'].dt.month
cleaned_data['day'] = cleaned_data['date'].dt.day
cleaned_data['weekday'] = cleaned_data['date'].dt.day_name()

# 显示清洗和扩充后的数据
cleaned_data.head()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
ymdhighlowtianqifengxiangfengliaqiaqiInfoaqiLeveltrain_levelProvinceCitydateyearmonthdayweekday
01/1/202050多云东南风1级72.02.00河南省郑州2020-01-01202011Wednesday
12/1/20207-1多云东南风1级120.0轻度污染3.00河南省郑州2020-01-02202012Thursday
23/1/202010-2阴~多云东南风1级183.0中度污染4.00河南省郑州2020-01-03202013Friday
34/1/2020111多云~中雨东南风2级242.0重度污染5.02河南省郑州2020-01-04202014Saturday
45/1/202020雨夹雪东北风3级274.0重度污染5.00河南省郑州2020-01-05202015Sunday
年度平均最高气温和最低气温趋势:
    年度平均最高气温和最低气温趋势图显示了每年的平均最高和最低温度的变化。
    如果存在年度数据,可以观察到随时间的推移,温度是否呈现上升或下降趋势,这可能反映了气候变化的影响。

每月平均空气质量指数(AQI)变化:
    该图展示了不同月份的平均AQI值。
    通过这个分析,可以识别出空气质量较差和较好的月份,这可能与特定的季节性活动或气候条件有关。

不同天气状况的出现频率:
    展示了记录期间各种天气状况出现的频率。
    这可以帮助理解该地区的主要天气模式,例如最常见的天气状况是多云、晴朗还是下雨。

风力分布情况:
    描述了不同风力等级的出现次数。
    通过这个分析,可以了解该地区常见的风力强度,以及极端风力事件的频率。

不同星期的平均最高气温变化:
    显示了一周内不同天的平均最高温度。
    这可以帮助观察是否存在工作日和周末之间的显著温度差异,这可能与人类活动模式有关。

不同星期的平均最低气温变化:
    显示了一周内不同天的平均最低温度。
    类似于最高温度分析,这也可以揭示工作日和周末的温度差异。

年度空气质量等级分布情况:
    描述了不同年份中各种空气质量等级的分布。
    这有助于识别空气质量的长期趋势,例如是否有改善或恶化的迹象。

每月平均最高气温和最低气温变化:
    展示了一年中不同月份的平均最高和最低温度。
    这有助于理解季节性温度变化,包括最热和最冷的月份。

不同风向的出现频率:
    显示了不同风向的统计频率。
    这有助于理解主导风向,以及风向变化是否与季节变化有关。

每月平均风力变化:
    描述了一年中不同月份的平均风力。
    这可以揭示风力的季节性模式,例如某些月份是否通常风力更强或更弱。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
# 设置图表的全局参数
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用于正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用于正常显示负号
plt.rcParams['figure.dpi'] = 300              # 设置图像的dpi

# 1. 年度平均最高气温和最低气温趋势
plt.figure(figsize=(10, 6))
cleaned_data.groupby('year')['high'].mean().plot(kind='line', label='平均最高气温')
cleaned_data.groupby('year')['low'].mean().plot(kind='line', label='平均最低气温')
plt.title('年度平均最高气温和最低气温趋势')
plt.xlabel('年份')
plt.ylabel('温度 (℃)')
plt.legend()
plt.show()


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
# 数据分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

X_train
  • 1
  • 2
  • 3
  • 4
highlowfenglifengxiangtianqi_simplified
844228233级东北风
243406-11级东南风多云
1697831242级南风
509428193级东北风
1148036253级东南风多云
..................
2157522103级南风多云
539034242级西南风多云
86021122级南风
15795303级东风
236548-42级西北风

19713 rows × 5 columns

# 预处理和模型管道
preprocessor = ColumnTransformer(
    transformers=[
        ('num', StandardScaler(), ['high', 'low']),
        ('cat', OneHotEncoder(), ['fengxiang', 'tianqi_simplified'])
    ])

# 定义模型
models = {
    'RandomForest': RandomForestClassifier(random_state=42),
    'SVC': SVC(random_state=42),
    'LogisticRegression': LogisticRegression(random_state=42)
}

# 训练和评估模型
for name, model in models.items():
    pipeline = Pipeline([
        ('preprocessor', preprocessor),
        ('smote', SMOTE(random_state=42)),
        ('classifier', model)
    ])
    
    pipeline.fit(X_train, y_train)
    y_pred = pipeline.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)

    print(f"Model: {name}")
    print("Accuracy:", accuracy)
    print("Classification Report:")
    print(classification_report(y_test, y_pred))
    print("\n")

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
Model: RandomForest
Accuracy: 0.7841347129235139
Classification Report:
              precision    recall  f1-score   support

           0       0.88      0.85      0.86      3940
           1       0.47      0.52      0.49       989

    accuracy                           0.78      4929
   macro avg       0.67      0.69      0.68      4929
weighted avg       0.79      0.78      0.79      4929
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11


Model: SVC
Accuracy: 0.7108947048082775
Classification Report:
              precision    recall  f1-score   support

           0       0.95      0.67      0.79      3940
           1       0.40      0.87      0.55       989

    accuracy                           0.71      4929
   macro avg       0.68      0.77      0.67      4929
weighted avg       0.84      0.71      0.74      4929
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11


Model: LogisticRegression
Accuracy: 0.7210387502536011
Classification Report:
              precision    recall  f1-score   support

           0       0.93      0.71      0.80      3940
           1       0.40      0.78      0.53       989

    accuracy                           0.72      4929
   macro avg       0.66      0.74      0.67      4929
weighted avg       0.82      0.72      0.75      4929
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11



import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder, StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report, accuracy_score
from imblearn.over_sampling import SMOTE
from imblearn.pipeline import Pipeline


# 训练随机森林模型
pipeline = Pipeline([
    ('preprocessor', preprocessor),
    ('smote', SMOTE(random_state=42)),
    ('classifier', RandomForestClassifier(random_state=42))
])

pipeline.fit(X_train, y_train)

# 特征重要性可视化

try:
    onehot_columns = pipeline.named_steps['preprocessor'].named_transformers_['cat'].get_feature_names(input_features=['fengxiang', 'tianqi_simplified'])
except AttributeError:
    onehot_columns = pipeline.named_steps['preprocessor'].named_transformers_['cat'].get_feature_names()

feature_names = np.concatenate([['high', 'low'], onehot_columns])
importances = pipeline.named_steps['classifier'].feature_importances_
indices = np.argsort(importances)

plt.figure(figsize=(10, 6))
plt.title('Feature Importances')
plt.barh(range(len(indices)), importances[indices], color='b', align='center')
plt.yticks(range(len(indices)), [feature_names[i] for i in indices])
plt.xlabel('Relative Importance')
plt.show()

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39

每文一语

加油

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/906337
推荐阅读
相关标签
  

闽ICP备14008679号