1、config.py
import os
# 指定数据集路径
dataset_path='./data'
# 结果保存路径
output_path='./output'
if not os.path.exists(output_path):
os.mkdir(output_path)
# 公共列
common_cols=['year','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'])
}
2、main.py
"""
中国五大城市PM2.5数据分析
任务:
- 五城市污染状态
- 五城市每个区空气质量的月度差异
数据集来源:https://www.kaggle.com/uciml/pm25-data-for-five-chinese-cities
"""
import csv
import os
import numpy as np
import config
def load_data(data_file,usecols):
'''
读取数据文件,加载数据
:param data_file:文件路径
:param usecols:所使用的列
:return: data_arr: 数据的多维数组表示
'''
data=[]
with open(data_file,'r') as csvfile:
data_reader=csv.DictReader(csvfile)
# print(data_reader)
# === 数据处理 ===
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
:param data_arr:数据的多维数组表示
:return: polluted_perc_list: 污染小时数百分比列表
'''
# 将每个区的PM值平均后作为该城市小时的PM值
# 按行取平均值
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]
# 优良空气小时数