8.小象笔记--空气质量

1. 需求分析

  • 空气指数计算公式:
    1. IAQi = (IAQh-IAQi)(Cp-BPl)/(BPh-BPl) - IAQl
    2. IAQ = MAX( IAQi )
  • 实现步骤:通过字典初始化空气污染指数限值,循环遍历输入数值归属哪个区间段:
  1. 实现计算污染物对应的AQI函数:cal_aqi
  2. 实现单类污染物AQI:cal_pt_aqi
  3. 实现线性函数:cal_line
  • 技术点:
    1. List:list(dict.keys()),list[i]、list.appen('v')
    2. DICT:dict.keys(),dict[key]
    3. 全局变量:global
    4. enumerate(list)
    5. 数值转换 float()
    6. if 语句
    7. for语句:break
    8. 函数
代码示例:
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 1header 2
get()HTTP GET
post()HTTP POST

requests对象属性

属性说明
status_codeHTTP状态码,200成功,400失败
textHTTP响应内容
req = requests.get(url, timeout=30)
code = req.status_code
context = req.text

5.BeautifulSoup爬虫

1.网页解析:DOM,树形结构 2.创建BeautifulSoup对象 bs=创建BeautifulSoup(htmlContext,'lxml')

header 1header 2
find查找满足条件的第一个节点
find_all查找满足条件的全部节点

示例:<a href='a.html' class='a_link'>next page</a>

  1. 节点类型:bs.find_all('a')
  2. 属性或内容:
  • 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

类似一维数组,由索引,值组成

  1. ser_obj = pd.Series(range(10))
  2. ser_obj.head() 预览数据
  3. ser_obj.tail()
  4. 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()

转载于:https://my.oschina.net/crossbell/blog/1601096

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值