1. 需求分析
- 空气指数计算公式:
- IAQi = (IAQh-IAQi)(Cp-BPl)/(BPh-BPl) - IAQl
- IAQ = MAX( IAQi )
- 实现步骤:通过字典初始化空气污染指数限值,循环遍历输入数值归属哪个区间段:
- 实现计算污染物对应的AQI函数:cal_aqi
- 实现单类污染物AQI:cal_pt_aqi
- 实现线性函数:cal_line
- 技术点:
- List:list(dict.keys()),list[i]、list.appen('v')
- DICT:dict.keys(),dict[key]
- 全局变量:global
- enumerate(list)
- 数值转换 float()
- if 语句
- for语句:break
- 函数
代码示例:
iaq_index_list = [0, 50, 100, 150, 200, 300, 400, 500]
pt_index_dict = {"PM25": [0, 35, 75, 115, 150, 250, 350, 500],
"O3_1": [0, 160, 200, 300, 400, 800, 1000, 1200],
"CO_1": [0, 5, 10, 35, 60, 90, 120, 150],
"PM10": [0, 50, 150, 250, 350, 420, 500, 600],
"NO2_24": [0, 40, 80, 180, 280, 565, 750, 940],
"SO2_1": [0, 150, 500, 650, 800, -1, -1, -1],
"SO2_24": [0, 50, 150, 475, 800, 1600, 2100, 2620],
"NO2_1": [0, 100, 200, 700, 1200, 2340, 3090, 3840],
"CO_24": [0, 2, 4, 14, 24, 36, 48, 60],
"O3_8": [0, 100, 160, 215, 265, 800, -1, -1]
}
def cal_aqi(pt_list):
"""
计算传入污染物aqi数值
"""
global pt_index_dict
pt_name_list = list(pt_index_dict.keys())
aqi_list = []
for i , pt_value in enumerate(pt_list) :
aqi_list.append(cal_pt_aqi(pt_name_list[i], pt_value))
return max(aqi_list)
def cal_pt_aqi(pt_name, pt_value):
"""
计算单个污染物aqi
"""
global pt_index_dict
global iaq_index_list
aqi = -1
pt_f = float(pt_value)
# 查找污染物指数区间
bins_list = pt_index_dict[pt_name]
for i, bins_value in enumerate(bins_list):
if i == len(bins_list)-1:
# 已经超出最大值,不知怎么计算,记为异常点
aqi = -1
elif bins_value <= pt_f < bins_list[i+1] :
# 该污染物指数区间对应 iaq值
aqi = cal_line(iaq_index_list[i+1], iaq_index_list[i], bins_list[i+1], bins_value, pt_f)
break
print('计算{}指数值,输入数值:{}, AQI:{}。'.format(pt_name, pt_value, aqi))
return aqi
def cal_line(IAQh, IAQl, BPh, BPl, Cp):
"""
线性函数
"""
return (float(IAQh)-float(IAQl))*(Cp-float(BPl))/(float(BPh)-float(BPl)) - float(IAQl)
2.json文件操作
格式:[{k1:v1},{k2:v2}] import json
函数 | 说明 |
---|---|
dumps() | 将python数据类型转换为json |
loads() | json转换成python数据类型 |
dump() | 类dumps(),输出到文件 |
load() | 类loads(),从文件读入 |
# 1.打开文件:路径、只读、编码格式
f = open(filePath, mode='r', encoding='utf-8')
# 2.json读取文件,返回list
city_list = json.load(f)
# 3.list排序
city_list.sort(key=lambda x: x['aqi'])
# 1.打开文件:
wf = open("aqi/top5_aqi.json", mode='w', encoding='utf-8')
# 2.写入文件:内容,文件对象,编码
json.dump(top5_list, wf, ensure_ascii=False)
3.csv文件操作
格式行,‘,’分隔 import csv
函数 | 说明 |
---|---|
writer(file) | 写对象 |
writerow(list) | 转换成cxb数据类型 |
reader(file) | 将每行记录作为列表返回 |
- with语句
# 1.写文件
cf = open('aqi/top5_aqi.csv', mode='w', encoding='utf-8', newline='')
writer = csv.writer(cf)
writer.writerow(list(top5_list[0].keys()))
for line in top5_list:
writer.writerow(list(line.values()))
# 2.读文件,join拼接字符串
with open(filepath, mode='r', encoding='utf-8', newline='') as f:
reader = csv.reader(f)
for row in reader:
print(', '.join(row))
OS模块 | 说明 |
---|---|
os.remove | 删除文件 |
os.makedirs() | 创建多层目录 |
os.rmdir | 删除单级目录 |
os.rename() | 重命名文件 |
os.path.isfile() | 重命名文件 |
os.path.isdir() | 判断文件 |
os.path.join() | 连接布姆 |
os.path.splitext() | 分割文件名及扩展名 |
4.requests爬虫
requests网页请求
header 1 | header 2 |
---|---|
get() | HTTP GET |
post() | HTTP POST |
requests对象属性
属性 | 说明 |
---|---|
status_code | HTTP状态码,200成功,400失败 |
text | HTTP响应内容 |
req = requests.get(url, timeout=30)
code = req.status_code
context = req.text
5.BeautifulSoup爬虫
1.网页解析:DOM,树形结构 2.创建BeautifulSoup对象 bs=创建BeautifulSoup(htmlContext,'lxml')
header 1 | header 2 |
---|---|
find | 查找满足条件的第一个节点 |
find_all | 查找满足条件的全部节点 |
示例:<a href='a.html' class='a_link'>next page</a>
- 节点类型:bs.find_all('a')
- 属性或内容:
- bs.find_all('a',href='a.html',string='next page')
- bs.find_all('a',class_='a_link')
- bs.find_all('a',{'class':'a_link'}})
for pt in div_list:
value = pt.find('div', {'class': 'value'}).text.strip()
caption = pt.find('div', {'class': 'caption'}).text.strip()
city_aqi.append((caption, value))
# for i in range(8):
# div_content = div_list[i]
# caption = div_content.find('div', {'class': 'caption'}).text.strip()
# value = div_content.find('div', {'class': 'value'}).text.strip()
# city_aqi.append((caption, value))
6.Pandas结构化数据工具集
1.Series
类似一维数组,由索引,值组成
- ser_obj = pd.Series(range(10))
- ser_obj.head() 预览数据
- ser_obj.tail()
- ser_obj.index,ser_obj.values
2.DataFram
多维数组,index + csv 单列:df_obj['index1'] 或df_obj.index1 多列:df_obj[['index1','index2']] 增加: df_obj['index3'] = data 删除:del df_obj['index3']
函数或属性 | 说明 |
---|---|
df_obj['AQI'].max() | 最大值 |
df_obj['AQI'].min() | 最小值 |
df_obj['AQI'].mean() | 平均值 |
df_obj['AQI'].sum() | 求和 |
df_obj['AQI'].count() | 非NA值数量 |
df_obj['AQI'].idxmin() | 最小值索引 |
df_obj['AQI'].idxmax() | 最大值索引 |
df_obj['AQI'].median() | 中位数 |
df_obj['AQI'].std() | 标准差 |
df_obj['AQI'].var() | 方差 |
df_obj['AQI'].mad() | 根据平均值计算平均绝对离差 |
df_obj['AQI'].argmin() | 最小值索引位置 |
df_obj['AQI'].argmax() | 最大值索引位置 |
df_obj['AQI'].quantile() | 分为数(0到1) |
df_obj['AQI'].describe() | 计算汇总统计 |
df_obj['AQI'].skew() | 偏度(三阶矩) |
df_obj['AQI'].kurt() | 峰值(四阶矩) |
df_obj['AQI'].cumsum() | 累计和 |
df_obj['AQI'].cummin() | 累计最小值 |
df_obj['AQI'].cummax() | 累计最大值 |
df_obj['AQI'].cumprod() | 累计积 |
df_obj['AQI'].diff() | 一阶差分(对时间序列很有用) |
df_obj['AQI'].pct_change() | 百分数变化 |
df_obj.sort_index() | 索引排序 |
df_obj.sort_values(by=['AQI']) | 按值排序 |
df_obj.sort_values(by=['AQI'],ascending=False) | 倒序 |
3.文件操作
data = pd.read_csv(filepath) data.to_csv('filepath',index = False)
4.数据清洗
函数 | 说明 |
---|---|
dropna() | 丢弃缺失数据 |
fillna() | 填充缺失数据 |
df_obj[filter_condition] | 数据过滤,依据filter_condition过滤,data[data['AQI'] > 0] |
5.数据可视化
Pandas基于matplotlib绘图
函数 | 说明 |
---|---|
plot(kind,x,y,title,figsize) | x,y坐标数据列,title图像名称,figsize图像尺寸 |
plt.savefig() | 保存图片 |
top50_data.plot(kind='bar', x='city', y='AQI', title='空气质量最好的50个城市')
plt.savefig('top50_aqi.png')
plt.show()