数据分析-07-2020年天气差异分析(了解天气差异的元凶 + 包含代码和数据)

0. 获取数据集

关注公众号:『AI学习星球
回复:2020年天气差异分析 即可获取数据下载。
论文辅导算法学习可以通过公众号滴滴我
在这里插入图片描述

1. 项目背景

通过2020年天气数据处理,对四个城市每月平均温度变化进行分析,以及每年的温度情况进行分析,和一年中空气质量的分布,污染天气的分布,探寻质量差的原因,最后分析了北京空气质量差的原因。

2. 数据读取

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import re
import warnings
warnings.filterwarnings('ignore')
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
%matplotlib inline

读取文件并合并

city_list = '北京,上海,广州,深圳'.split(',')
path_list = [f'./{i}历史天气.xlsx' for i in city_list]
df_list = []
for path in path_list :
    df = pd.read_excel(path)
    df['地区']= path[2:4]
    df_list.append(df)
df_p = pd.concat(df_list)

3. 数据清洗

df_p['空气质量等级'] = df_p['空气质量指数'].map(lambda i: re.compile(r'\s(\w{1,15})').findall(i)[0])
df_p['空气质量指数'] = df_p['空气质量指数'].map(lambda i: re.compile(r'(\d*)\s').findall(i)[0]).astype('int32')
df_p.head()

在这里插入图片描述

df_p.loc[:,'日期'] = df_p['日期'].str[0:10]
df_p['风向'] = df_p['风力风向'].map(lambda i: i[:-2])
df_p.loc[:,'风力等级'] = df_p['风力风向'].map(lambda i: i[-2])
df_p.loc[:,'风力等级'] = df_p.loc[:,'风力等级'].map(lambda i: 0 if i == '微' else i).astype('int8')
df_p.loc[:,'最高温'] = df_p['最高温'].str.replace('°','').astype('int32')
df_p.loc[:,'最低温'] = df_p['最低温'].str.replace('°','').astype('int32')
del df_p['风力风向']
df_p['日期'] = pd.to_datetime(df_p['日期'])
df_p.set_index('日期',drop = False,inplace = True)
df_p.sort_index(inplace = True )
df = df_p.loc['2020-01-01':'2020-12-31']
pd.unique(df['空气质量等级'])

array([‘良’, ‘优’, ‘轻度’, ‘中度’, ‘重度’], dtype=object)

def air_s(i):
    if i in ['中度', '轻度', '重度', '严重']:
        return f'{i}污染'
    else:
        return i
df.loc[:,'空气质量等级'] = df['空气质量等级'].map(air_s)
pd.unique(df['空气质量等级'])

array([‘良’, ‘优’, ‘轻度污染’, ‘中度污染’, ‘重度污染’], dtype=object)

清洗完成,对必要字段进行了拆分,替换

4. 对四个城市每月平均温度变化进行分析

df.head()

在这里插入图片描述

month_t = df.groupby([df.index.month,'地区'])['最高温'].mean().unstack()
month_t.plot(figsize=(10, 5))
plt.title('“北上广深”2020气温变换折线图')
plt.xlabel('月')
plt.ylabel('温度℃')

在这里插入图片描述

5. 分析四个城市一年中,每天的温度分情况

df.head()

在这里插入图片描述

df_plot =  df[['最高温','地区']].set_index('地区',append = True).unstack().reset_index(drop = True)
columns_plot_p = df_plot.columns.values.tolist()
columns_plot =[]
for i in columns_plot_p:
    a,b = i
    columns_plot.append(b)
fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(12, 4))
axs[0].violinplot(all_data,showmeans=False,showmedians=True)
axs[0].set_title('温度分布小提琴图(天)')
axs[1].boxplot(all_data)
axs[1].set_title('分度分布箱线图(天)')
for ax in axs:
    ax.yaxis.grid(True)
    ax.set_xticks([y + 1 for y in range(len(all_data))])
    ax.set_ylabel('温度℃')
plt.setp(axs, xticks=[y + 1 for y in range(len(all_data))],
         xticklabels= columns_plot)

在这里插入图片描述

5. 分析四个城市一年中空气质量的分布情况

df.head()

在这里插入图片描述

month_a = df.groupby(['地区','空气质量等级'])['空气质量等级'].count()
month_a = month_a.unstack(fill_value = 0,level = 0)
from pandas.api.types import CategoricalDtype
act_size_order = CategoricalDtype(['优','良','轻度污染','中度污染','重度污染'],ordered = True)
month_a = month_a.reset_index()
month_a['空气质量等级'] = month_a['空气质量等级'].astype(act_size_order)
month_a = month_a.sort_values('空气质量等级').set_index('空气质量等级')
month_a

在这里插入图片描述

dic_keys = month_a.index.values
columns_names = month_a.columns.values.tolist()
month_b = month_a.stack().to_dict().values()
values = np.array(list(month_b)).reshape(5,4).tolist()
month_c = df.groupby(['地区','空气质量等级'])['空气质量等级'].count()
month_c = month_c.unstack(fill_value = 0)
month_c = month_c[['优','良','轻度污染','中度污染','重度污染']]
month_c.plot(kind='bar',grid = True,colormap='Blues_r',stacked=True,figsize=(10,4),title = '“北上广深”2020空气质量分布堆叠图')
plt.table(cellText =values,
          cellLoc='center',
          cellColours = None,
          rowLabels = dic_keys,
          rowColours = plt.cm.BuPu(np.linspace(0, 0.5,5))[::-1],  # BuPu可替换成其他colormap
          colLabels = columns_names,
          colColours = plt.cm.Reds(np.linspace(0, 0.5,5))[::-1], 
          rowLoc='right',
          loc='bottom')
plt.xticks([])
plt.xlabel('')

在这里插入图片描述

6. 分析污染天气在季节上的分布规律

df.head()

在这里插入图片描述

df_p = df[['空气质量等级','地区']].copy()
df_p['count'] = 1
df_p=df_p.groupby(by = [df_p.index.quarter,'地区','空气质量等级'])['count'].count()
df_u = df_p.unstack(fill_value=0,level = -1)
df_u = df_u.reset_index()
df_u = df_u[['日期','地区','轻度污染','中度污染','重度污染']]
df_u['污染天数'] =  df_u['轻度污染'] + df_u['中度污染'] + df_u['重度污染']
df_u = df_u[['日期','地区','污染天数']]
df_u = df_u.set_index(['日期','地区']).unstack().reset_index().set_index('日期')
plt.figure(figsize = (10,5))
plt.plot(df_u[('污染天数','上海')],label='上海')
plt.plot(df_u[('污染天数','北京')],label='北京')
plt.plot(df_u[('污染天数','广州')],label='广州')
plt.plot(df_u[('污染天数','深圳')],label='深圳')
plt.title('“北上广深”2020污染天气——变化图(季度)')
plt.xticks(range(1,5))
plt.xlabel('季度')
plt.ylabel('天')
plt.legend()
for a,b in zip(range(1,5),list(df_u[('污染天数','上海')])):
    plt.text(a,b,b, ha='center', va='bottom', fontsize=10)
for a,b in zip(range(1,5),list(df_u[('污染天数','北京')])):
    plt.text(a,b,b, ha='center', va='bottom', fontsize=10)
for a,b in zip(range(1,5),list(df_u[('污染天数','广州')])):
    plt.text(a,b,b, ha='center', va='bottom', fontsize=10)
for a,b in zip(range(1,5),list(df_u[('污染天数','深圳')])):
    plt.text(a,b,b, ha='center', va='bottom', fontsize=10)

在这里插入图片描述

7. 探寻“空气质量”的影响因素

df.head()

在这里插入图片描述

df_p = df.copy()
df_p.loc[:,'温差'] = df_p['最高温']-df_p['最低温']
df_p.corr().loc['空气质量指数',:]

最高温 -0.163287
最低温 -0.256182
空气质量指数 1.000000
风力等级 -0.332844
温差 0.287805
Name: 空气质量指数, dtype: float64

空气质量影响因素分析结果

  • 空气质量指数和风力等级相关性最强,为负相关,即风力越大,空气质量指数越低,空气质量越好
  • 空气质量与温差和最低温相的关性也较强,温差越大时,空气质量可能越差,最低温越低时,空气质量可能越差

8. 对北京差天气的原因分析

df_p.groupby(by = '地区')['风力等级'].mean()

地区
上海 2.524590
北京 2.038251
广州 2.565574
深圳 2.565574
Name: 风力等级, dtype: float64

df_p.groupby(by = '地区')['最低温'].mean()

地区
上海 15.426230
北京 8.262295
广州 20.366120
深圳 21.385246
Name: 最低温, dtype: float64

df_p.groupby(by = '地区')['温差'].mean()

地区
上海 5.811475
北京 10.453552
广州 6.778689
深圳 5.557377
Name: 温差, dtype: float64

北京空气质量较差的原因分析结果:

  • 虽然和空气质量相关性最高的是风力等级,但不是造成北京空气质量较差的主要原因
  • 北京的空气质量较差是因为北京的最低温度和温差比上海、广州、深圳都要大很多

9. 天气监控仪表板

在这里插入图片描述

关注公众号:『AI学习星球
回复:2020年天气差异分析 即可获取数据下载。
论文辅导算法学习可以通过公众号滴滴我

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值