-
案例描述
作为中国政治经济发展中非常重要的五个大型城市,北京、上海、广州、成都和沈阳分别位于京津冀、长三角、珠三角、川渝和辽宁经济区,这五大区域的经济总量占据全国总量的50%以上,能源消耗量巨大,也是大气污染和雾 霾天气灾害较为严重的区域。雾霾的主要成分 PM2.5对人类健康有着极大的危害,也不同程度地影响着农业、生态、气候和居民的生活质量,因此研究中国这五个主要城市 PM2.5的污染状况及其影响因素,将为中国大气污染的预防和治理提供重要的实证依据。 -
数据集描述
数据集包括北京、上海、广州、成都和沈阳的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) -
任务描述
五城市污染状态
五城市每个区空气质量的月度差异
五城市每个区空气质量的季度差异 -
主要代码
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中的结果展示(以北京为例)
可视化结果(以北京为例)
污染状况
月平均
季度平均