Python课设:中国五大城市PM2.5数据分析

  1. 案例描述
    作为中国政治经济发展中非常重要的五个大型城市,北京、上海、广州、成都和沈阳分别位于京津冀、长三角、珠三角、川渝和辽宁经济区,这五大区域的经济总量占据全国总量的50%以上,能源消耗量巨大,也是大气污染和雾 霾天气灾害较为严重的区域。雾霾的主要成分 PM2.5对人类健康有着极大的危害,也不同程度地影响着农业、生态、气候和居民的生活质量,因此研究中国这五个主要城市 PM2.5的污染状况及其影响因素,将为中国大气污染的预防和治理提供重要的实证依据。

  2. 数据集描述
    数据集包括北京、上海、广州、成都和沈阳的2010-2015的空气质量数据。每个城市的数据文件为CSV文件:
    BeijingPM20100101_20151231.csv
    ShanghaiPM20100101_20151231.csv
    GuangzhouPM20100101_20151231.csv
    ChengduPM20100101_20151231.csv
    ShenyangPM20100101_20151231.csv
    数据字典
    No: 记录编号,整型
    year: 年份,整型
    month: 月份,整型
    day: 日期,整型
    hour: 小时,整型
    season: 季度,整型
    PM_?: 中国环保部发布的?区的PM2.5指数 (ug/m^3),浮点型
    PM_US Post:美国驻华大使馆发布的PM2.5指数 (ug/m^3),浮点型
    DEWP: 露点温度 (摄氏度)
    TEMP: 温度 (摄氏度)
    HUMI: 湿度 (%)
    PRES: 气压 (hPa)
    cbwd: 合成风向
    Iws: 合成风速 (m/s)
    precipitation: 每小时降水量 (mm)
    Iprec: 累积降水量 (mm)

  3. 任务描述
    五城市污染状态
    五城市每个区空气质量的月度差异
    五城市每个区空气质量的季度差异

  4. 主要代码
    Config.py

import os
dataset_path='C:\\Users\\admin\\Desktop\\code\\py\\PythonCourseDesign1\\data'
output_path='C:\\Users\\admin\\Desktop\\code\\py\\output'

if not os.path.exists(output_path):
    os.mkdir(output_path)
# 公共列
common_cols=['year','season','month']
# 每个城市对应的文件名及所需分析的列名
# 以字典形式保存,如:{城市:(文件名, 列名)}
data_config_dict={'beijing':('BeijingPM20100101_20151231.csv', ['Dongsi', 'Dongsihuan', 'Nongzhanguan']),
                  'chengdu':('ChengduPM20100101_20151231.csv',['Caotangsi', 'Shahepu']),
                  'guangzhou':('GuangzhouPM20100101_20151231.csv',['City Station', '5th Middle School']),
                  'shanghai':('ShanghaiPM20100101_20151231.csv',['Jingan', 'Xuhui']),
                  'shenyang':('ShenyangPM20100101_20151231.csv',['Taiyuanjie', 'Xiaoheyan'])
                  }

main.py

import csv
import os
import numpy as np
import config

def load_data(data_file,usecols):
    '''
    读取数据文件,加载数据
    '''
    data=[]
    with open(data_file,'r') as csvfile:
        data_reader=csv.DictReader(csvfile)
        # === 数据处理 ===
        for row in data_reader:
            # 取出每行数据,组合为一个列表放入数据列表中
            row_data=[]
            # 注意csv模块读入的数据全部为字符串类型
            for col in usecols:
                str_val=row[col]
                #数据类型转换为float,如果是'NA',则返回nan
                row_data.append(float(str_val) if str_val!='NA' else np.nan)
            # 如果行数据中不包含nan才保存该行记录
            if not any(np.isnan(row_data)):
                data.append(row_data)
    # 将data转换为ndarray
    data_arr=np.array(data)
    return data_arr

def get_polluted_perc(data_arr):
    '''
    获取各城市每个区污染占比的小时数
        规则:
            重度污染(heavy)     PM2.5 > 150
            重度污染(medium)    75 < PM2.5 <= 150
            轻度污染(light)     35 < PM2.5 <= 75
            优良空气(good)      PM2.5 <= 35
    '''
    # 按行取平均值
    hour_val=np.mean(data_arr[:,2:],axis=1)
    # 总小时数
    n_hours=hour_val.shape[0]
    # 重度污染小时数
    n_heavy_hours=hour_val[hour_val>150].shape[0]
    # 中度污染小时数
    n_medium_hours=hour_val[(hour_val>75) & (hour_val<=150)].shape[0]
    # 轻度污染小时数
    n_light_hours = hour_val[(hour_val > 35) & (hour_val <= 75)].shape[0]
    # 优良空气小时数
    n_good_hours = hour_val[hour_val <= 35].shape[0]

    polluted_perc_list= [n_heavy_hours / n_hours, n_medium_hours / n_hours,
                         n_light_hours / n_hours, n_good_hours / n_hours]

    return polluted_perc_list

def get_avg_pm_per_month(data_arr):
    '''
     获取每个区每月的平均PM值
    '''
    results=[]
    # 获取年份
    years=np.unique(data_arr[:,0])
    for year in years:
        # 获取当前年份数据
        year_data_arr=data_arr[data_arr[:,0]==year]
        # 获取数据的月份
        month_list=np.unique(year_data_arr[:,1])

        for month in month_list:
            # 获取月份的所有数据
            month_data_arr=year_data_arr[year_data_arr[:,1]==month]
            # 计算当前月份PM的均值
            mean_vals=np.mean(month_data_arr[:,2:],axis=0).tolist()
            # 格式化字符串
            row_data=['{:.0f}-{:02.0f}'.format(year,month)]+mean_vals
            results.append(row_data)
    results_arr=np.array(results)
    return results_arr

def get_avg_pm_per_season(data_arr):
    '''
     获取每个区每季度的平均PM值
    '''
    results1=[]
    # 获取年份
    years=np.unique(data_arr[:,0])
    for year in years:
        # 获取当前年份数据
        year_data_arr=data_arr[data_arr[:,0]==year]
        season_list=np.unique(year_data_arr[:,2])
        for season in season_list:
            # 获取季度的所有数据
            season_data_arr=year_data_arr[year_data_arr[:,2]==season]
            # 计算当前季度PM的均值
            mean_vals=np.mean(season_data_arr[:,2:],axis=0).tolist()
            # 格式化字符串
            row_data=['{:.0f}-{:02.0f}'.format(year,season)]+mean_vals
            results1.append(row_data)
    results1_arr=np.array(results1)
    return results1_arr

def save_stats_to_csv(results_arr,save_file,headers):
    '''
    将统计结果保存至csv文件中
    '''
    with open(save_file,'w',newline='') as csvfile:
        writer=csv.writer(csvfile)
        writer.writerow(headers)
        for row in results_arr.tolist():
            writer.writerow(row)
def main():
    polluted_state_list=[]
    for city_name,(filename,cols) in config.data_config_dict.items():
        # ===  数据获取 + 数据处理 ===
        data_file=os.path.join(config.dataset_path,filename)
        usecols=config.common_cols+['PM_'+col for col in cols]
        #加载数据
        data_arr=load_data(data_file,usecols)
        print('{}共有{}行有效数据'.format(city_name,data_arr.shape[0]))
        # 预览前10行数据
        print('{}的前10行数据:'.format(city_name))
        print(data_arr[:10])
        # # 五城市污染状态,统计污染小时数的占比
        polluted_perc_list=get_polluted_perc(data_arr)
        polluted_state_list.append([city_name]+polluted_perc_list)
        print('{}的污染小时数百分比{}'.format(city_name,polluted_perc_list))
        # 五城市每个区空气质量的月度差异,分析计算每个月,每个区的平均PM值
        results_arr=get_avg_pm_per_month(data_arr)
        print('{}的每月平均PM值预览:'.format(city_name))
        print(results_arr[:10])

        # 五城市每个区空气质量的季度差异,分析计算每个季度,每个区的平均PM值
        results1_arr=get_avg_pm_per_season(data_arr)
        print('{}的每季度平均PM值预览:'.format(city_name))
        print(results1_arr[:10])
        #  保存月度统计结果至csv文件
        save_filename = city_name + '_month_stats.csv'
        save_file = os.path.join(config.output_path, save_filename)
        save_stats_to_csv(results_arr, save_file, headers=['month'] + cols)
        print('月度统计结果已保存至{}'.format(save_file))
        #  保存季度统计结果至csv文件
        save_filename = city_name + '_season_stats.csv'
        save_file = os.path.join(config.output_path, save_filename)
        save_stats_to_csv(results1_arr, save_file, headers=['season'] + cols)
        print('季度统计结果已保存至{}'.format(save_file))
    #  污染状态结果保存
    save_file = os.path.join(config.output_path, 'polluted_percentage.csv')
    with open(save_file, 'w', newline='') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(['city', 'heavy', 'medium', 'light', 'good'])
        for row in polluted_state_list:
            writer.writerow(row)
    print('污染状态结果已保存至{}'.format(save_file))

if __name__=='__main__':
    main()

可视化.py

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

excel_path='C:\\Users\\admin\\Desktop\\code\\py\\output\\xx.xlsx'
df=pd.read_excel(excel_path,sheet_name='Sheet1')

df.plot(kind='bar', grid=True, colormap='Blues_r',stacked=True,
        edgecolor='black',rot=0)

5.结果展示

得到的数据都存到csv文件中
在这里插入图片描述
Idea中的结果(以北京为例)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Csv中的结果展示(以北京为例)
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

可视化结果(以北京为例)

污染状况
在这里插入图片描述
月平均
在这里插入图片描述
季度平均
在这里插入图片描述

  • 13
    点赞
  • 89
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值