小象学院—小象学院—Python学习联盟09—空气质量指数计算

本文介绍了空气质量指数(AQI)的计算方法,包括PM2.5、CO等污染物的IAQI计算公式,并展示了如何使用Python进行网络爬虫获取各城市AQI数据,最后利用Pandas进行数据清洗、统计分析及可视化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    

1.0版本:

具体代码:

 

'''
空气质量
版本:1.0
'''

def cal_aqi(param_list):
    '''
    计算AQI
    '''
    pm_val = param_list[0]
    co_val = param_list[1]

    pm_iaqi = cal_pm_iaqi(pm_val)     #计算pm2.5的IAQI函数
    co_iaqi = cal_co_iaqi(co_val)     #计算co的IAQI函数
    aqi_list = []
    aqi_list.append(pm_iaqi)
    aqi_list.append(co_iaqi)
    val_list = max(aqi_list)
    return val_list

def cal_pm_iaqi(pm_val):      #计算pm2.5的IAQI函数
    if 0 <= pm_val < 36:
        iaqi = cal_linear(0,50,0,35,pm_val)
    elif 36 <= pm_val < 76:
        iaqi = cal_linear(50, 100, 35, 75, pm_val)
    elif 76 <= pm_val < 116:
        iaqi = cal_linear(100, 150, 75, 115, pm_val)
    else:
        pass
    return iaqi

def cal_co_iaqi(co_val):      #计算co的IAQI函数
    if 0 <= co_val < 3:
        iaqi = cal_linear(0,50,0,2,co_val)
    elif 3 <= co_val < 5:
        iaqi = cal_linear(50, 100, 2, 4, co_val)
    elif 5 <= co_val <15 :
        iaqi = cal_linear(100, 150, 4, 14, co_val)
    else:
        pass

    return iaqi

def cal_linear(iaqi_lo,iaqi_hi,bp_lo,bp_hi,cp):       #具体的范围缩放函数
    iaqi = (iaqi_hi - iaqi_lo) * (cp - bp_lo) / (bp_hi - bp_lo) + iaqi_lo
    return iaqi

def main():
    '''
    主函数
    '''
    print('请输入以下信息,用空格分割')
    input_str = input('(1)PM2.5: (2)CO:')
    str_list = input_str.split(' ')        #用空格分割,记录在列表中
    pm_val = float(str_list[0])     #进行数值转换
    co_val = float(str_list[1])

    param_list = []
    param_list.append(pm_val)
    param_list.append(co_val)
    aqi_val = cal_aqi(param_list)          #调用AQI函数
    print('空气质量指数为{}:'.format(aqi_val))


if __name__ == '__main__':
    main()

 

2.0版本:JSON数据文件操作。

 

案例描述:1.读取已经获取的json数据文件

                 2.并将aqi前五的数据输出到文件

具体代码:

 

'''
空气质量
版本:2.0
'''

import json

def process_json_file(filepath):
    f = open(filepath,mode='r',encoding='utf-8')    #encoding保证文件读取中文不会乱码
    city_list = json.load(f)
    return city_list

    
def main():
    '''
    主函数
    '''
   
    filepath= input('请输入json文件名称:')
    city_list = process_json_file(filepath)
    city_list.sort(key=lambda city:city['aqi'])    
    # 默认按照AQI从小到大排序。sort对列表进行排序
    top5_list = city_list[:5]        #切片操作,拿到前五个
    
    #将top5写入json文件中
    f = open('top5_aqi.json',mode='w',encoding='utf-8')  #模式为写入
    json.dump(top5_list, f,ensure_ascii=False)   #ensure_ascii保证不会乱码
    f.close()
    print(city_list)
   
   
   
if __name__ == '__main__':
    main()

 

 

版本3.0:另一种常用的数据格式CSV

案例描述:1.读取已经获取的json数据文件

                 2.并将其转换成csv文件

具体代码:

 

'''
空气质量
版本:3.0
'''

import csv
import json

def process_json_file(filepath):       #读取json文件
    f = open(filepath,mode='r',encoding='utf-8')    #encoding保证文件读取中文不会乱码
    city_list = json.load(f)
    return city_list


def main():
    '''
    主函数
    '''

    filepath= input('请输入json文件名称:')
    city_list = process_json_file(filepath)     #调用读取json文件函数
    city_list.sort(key=lambda city: city['aqi'])
    # 默认按照AQI从小到大排序。sort对列表进行排序


    #将数据以csv文件规则放入列表lines中
    lines = []
    #列名,表头,第一行数据
    lines.append(list(city_list[0].keys))
    for city in city_list:
        lines.append(list(city_list.value))


    #存入csv文件
    f = open('aqi_csv','w',encoding='utf-8',newline=' ')
    #newline意味着每一个新行末尾是不加任何字符的
    writer = csv.writer(f)
    for line in lines:
        writer.writerow(lines)
    f.close()


if __name__ == '__main__':
    main()

将csv转换成json: 将csv数据一行一行读取,然后构建一个dictionary,然后dump到json中就可以了。

 

 

版本4.0:根据文件扩展名判断是json文件还是csv文件,并进行相应的操作

具体代码:

 

'''
空气质量
版本:4.0
'''

import csv
import json
import os

def process_json_file(filepath):       #读取json文件
    # f = open(filepath,mode='r',encoding='utf-8')    #encoding保证文件读取中文不会乱码
    # city_list = json.load(f)
    # return city_list

    with open(filepath,mode='r',encoding='utf-8') as f:
        city_list = json.load(f)
    print(city_list)

def process_csv_file(filepath):
    with open(filepath, mode='r', encoding='utf-8',newline=' ') as f:
        reader = csv.reader(f)  #reader是可以遍历的
        for row in reader:
            print(','.join(row))      #row是列表。csv每一行是列表。

    print(city_list)

def main():
    '''
    主函数
    '''

    filepath= input('请输入文件名称:')
    filename,file_ext = os.path.splitext(filepath)
    if file_ext == '.json':
        #json文件
        process_json_file(filepath)

    if file_ext == '.csv':
        process_csv_file(filepath)
    else:
        print('不支持的文件格式')


if __name__ == '__main__':
    main()

 

版本5.0:1.网络爬虫入门

 

               2.实时获取城市的AQI

 

网络爬虫步骤:1.通过网络链接获取网页内容

                        2.对获得的网页内容进行处理

1.通过网络链接获取网页内容

代码:

 

'''
空气质量
版本:5.0
'''

import requests

def get_html_text(url):
    '''
    返回url的文本
    '''
    r = requests.get(url,timeout = 30) #等待链接30秒。如果30秒没有链接上,就不等了。
    print(r.status_code)        #看连接是否成功,200成功。400错误
    return r.text


def main():
    '''
    主函数
    '''

    city_pinyin = input('请输入城市拼音(小写):')
    url = 'http://pm25.in/' + city_pinyin        #访问网站的链接

    #获取网站的字符串(文本信息)
    url_text = get_html_text(url)       #调用函数
    print(url_text)


if __name__ == '__main__':
    main()

    

 2.对获得的网页内容进行处理(提取我们需要的信息)

        在网站上点击右键---检查---找到你需要的字符串的位置信息:

        在网页的代码上(检查之后弹出来的界面),按ctrl+u。弹出代码网页。寻找你需要的位置信息,复制到代码中。

具体代码:

 

'''
空气质量
版本:5.0
'''

import requests

def get_html_text(url):
    '''
    返回url的文本
    '''
    r = requests.get(url,timeout = 30) #等待链接30秒。如果30秒没有链接上,就不等了。
    return r.text


def main():
    '''
    主函数
    '''

    city_pinyin = input('请输入城市拼音(小写):')
    url = 'http://pm25.in/' + city_pinyin        #访问网站的链接

    #获取网站的字符串(文本信息)
    url_text = get_html_text(url)       #调用函数,得到页面的整体信息(整体字符串)


    #提取所需要的信息的位置(页面中的部分信息)
    aqi_div = '''<div class="span12 data">
        <div class="span1">
          <div class="value">
            '''       
    #找到位置,就可找到AQI的值38。即找到子字符串在整体字符串中的位置。注意空格
    index = url_text.find(aqi_div)          #会输出aqi_div的index值,即索引号
    begin_index = index + len(aqi_div)      #开始提取信息的位置,确定开始位置
    end_index = begin_index + 2             #拿两位。即38 确定结束位置。
    aqi_val = url_text[begin_index:end_index]         #切片操作,拿出位置之间的值,即38。
    print('空气质量为:{}'.format(aqi_val))



if __name__ == '__main__':
    main()

 

 

版本6.0:高效的解析,处理HTML——>beautifulsoup4

具体代码:

 

'''
空气质量
版本:6.0
'''

import requests
from bs4 import BeautifulSoup

def get_city_aqu(city_pinyin):
    '''
    获取城市AQI
    '''
    url = 'http://pm25.in/' + city_pinyin  # 访问网站的链接
    r = requests.get(url,timeout = 30)  #等待链接30秒。如果30秒没有链接上,就不等了。

    soup = BeautifulSoup(r.text ,'lxml')   #'lxml'定义解码器
    div_list = soup.find_all('div',{'class':'span1'})   #按属性进行解析

    #初始化元组。为了将拿到的信息放入元组中。
    city_aqi = []
    for i in range(8):
        div_content = div_list[i]       #遍历解析的信息
        caption = div_content.find('div',{'class':'caption'}).text.strip()
        # 拿到的是节点,加上.text拿到节点上的内容.strip为了去掉拿到内容中的空格。
        value = div_content.find('div', {'class': 'value'}).text.strip()
        city_aqi.append((caption,value))
    return city_aqi

def main():
    '''
    主函数
    '''

    city_pinyin = input('请输入城市拼音(小写):')

    #获取网站的字符串(文本信息)
    city_aqi = get_city_aqu(city_pinyin)       #调用函数,得到页面的整体信息(整体字符串)
    print(city_aqi)

if __name__ == '__main__':
    main()

 

 

版本7.0:获取所有城市AQI

利用beautifulsoup4获取所有城市的空气质量

案例描述:1.首先获取所有的城市列表,及对应的url

                 2.根据url获取城市的空气质量(6.0程序)

具体代码:

 

'''
空气质量
版本:7.0
'''

import requests
from bs4 import BeautifulSoup

def get_city_aqu(city_pinyin):
    '''
    获取城市AQI
    '''
    url = 'http://pm25.in/' + city_pinyin  # 访问网站的链接
    r = requests.get(url,timeout = 30)  #等待链接30秒。如果30秒没有链接上,就不等了。

    soup = BeautifulSoup(r.text ,'lxml')   #'lxml'定义解码器
    div_list = soup.find_all('div',{'class':'span1'})   #按属性进行解析

    #初始化元组。为了将拿到的信息放入元组中。
    city_aqi = []
    for i in range(8):
        div_content = div_list[i]       #遍历解析的信息
        caption = div_content.find('div',{'class':'caption'}).text.strip()
        # 拿到的是节点,加上.text拿到节点上的内容.strip为了去掉拿到内容中的空格。
        value = div_content.find('div', {'class': 'value'}).text.strip()
        city_aqi.append((caption,value))
    return city_aqi

def get_all_city():                         #获取所有城市
    url = 'http://pm25.in/'
    city_list = []
    r = requests.get(url, timeout=30)       #等待链接30秒。如果30秒没有链接上,就不等了。

    soup = BeautifulSoup(r.text, 'lxml')        #'lxml'定义解码器
    city_div = soup.find_all('div',{'class':'bottom'})[1]
    #第一个bottom是热门城市,第二个是全部城市。所有取第二个。
    city_link_list = city_div.find_all('a')      #获取bottom下a标签下的所有城市
    for city_link in city_link_list:             #遍历所有城市信息
        city_name = city_link.text
        city_pinyin = city_link['href'][1:]      #去掉第一个字符‘/’切片操作
        city_list.append((city_name,city_pinyin))
    return city_list

def main():
    '''
    主函数
    '''

    city_list = get_all_city()
    for city in city_list:
        city_name = city[0]
        city_pinyin = city[1]

       
        city_aqi = get_city_aqu(city_pinyin)       #调用函数,得到每个城市AQI
        print(city_name,city_aqi)

if __name__ == '__main__':
    main()

 

 

版本8.0:将7.0的信息,保存成csv数据文件。

具体代码:

为了看到运行情况(输出处理到第几条数据):为了获取 city_list 里面的编号(索引号),用enumerate

 

'''
空气质量
版本:8.0
'''

import requests
from bs4 import BeautifulSoup
import csv

def get_city_aqu(city_pinyin):
    '''
    获取城市AQI
    '''
    url = 'http://pm25.in/' + city_pinyin  # 访问网站的链接
    r = requests.get(url,timeout = 30)  #等待链接30秒。如果30秒没有链接上,就不等了。

    soup = BeautifulSoup(r.text ,'lxml')   #'lxml'定义解码器
    div_list = soup.find_all('div',{'class':'span1'})   #按属性进行解析

    #初始化元组。为了将拿到的信息放入元组中。
    city_aqi = []
    for i in range(8):
        div_content = div_list[i]       #遍历解析的信息
        caption = div_content.find('div',{'class':'caption'}).text.strip()
        # 拿到的是节点,加上.text拿到节点上的内容.strip为了去掉拿到内容中的空格。
        value = div_content.find('div', {'class': 'value'}).text.strip()
        city_aqi.append(value)  #只需要value,不需要caption.
    return city_aqi

def get_all_city():                         #获取所有城市
    url = 'http://pm25.in/'
    city_list = []
    r = requests.get(url, timeout=30)       #等待链接30秒。如果30秒没有链接上,就不等了。

    soup = BeautifulSoup(r.text, 'lxml')        #'lxml'定义解码器
    city_div = soup.find_all('div',{'class':'bottom'})[1]
    #第一个bottom是热门城市,第二个是全部城市。所有取第二个。
    city_link_list = city_div.find_all('a')      #获取bottom下a标签下的所有城市
    for city_link in city_link_list:             #遍历所有城市信息
        city_name = city_link.text
        city_pinyin = city_link['href'][1:]      #去掉第一个字符‘/’切片操作
        city_list.append((city_name,city_pinyin))
    return city_list

def main():
    '''
    主函数
    '''
    city_list = get_all_city()

    #定义csv第一行列名
    header = ['City','AQI','PM2.5/h','PM10/h','CO/h','NO2/h','O3/h','O3/8h','SO2/h']
    #打开。操作文件
    with open('china_city_aqi.csv','w',encoding='utf-8',newline='') as f:
        writer = csv.writer(f)
        writer.writerow(header)     #写第一行
        for i, city in enumerate(city_list):        #i是索引号,city为值
            city_name = city[0]     #city_name字符串
            city_pinyin = city[1]
            city_aqi = get_city_aqu(city_pinyin)  # 调用函数,得到每个城市AQI。city_aqi是列表

            #为了使字符串与列表相加,将字符串放入列表中即可
            row = [city_name]+city_aqi
            writer.writerow(row)

            # 每10条输出一次
            if (i + 1) % 10 == 0:
                print('已处理{}条记录,共{}条记录'.format(i + 1, len(city_list)))


if __name__ == '__main__':
    main()

 

 

版本9.0:利用Pandas进行数据处理,分析

 

具体代码:

简单基本操作演示:

1.

 

'''
空气质量
版本:9.0
'''


import pandas as pd


def main():
    '''
    主函数
    '''

    aqi_data = pd.read_csv('china_city_aqi.csv')     #读取csv文件(用pandas)
    # print(aqi_data.head(5))                        #输出前五行数据
    # print(aqi_data['AQI'])                         #只看AQI这一列数据
    print(aqi_data[['City','AQI']])                #里面的中括号代表,传入的是列表
    
    
if __name__ == '__main__':
    main()

 

2.

 

'''
空气质量
版本:9.0
'''


import pandas as pd


def main():
    '''
    主函数
    '''

    aqi_data = pd.read_csv('china_city_aqi.csv')     #读取csv文件(用pandas)
    # print('基本信息:')
    # print(aqi_data.info())
    #
    # print('数据预览')
    # print(aqi_data.head())

    #基本统计
    print('AQI最大值:', aqi_data['AQI'].max())
    print('AQI最小值:', aqi_data['AQI'].min())
    print('AQI均值:', aqi_data['AQI'].mean())
if __name__ == '__main__':
    main()

输出结果为:

 

后面会介绍,怎样清洗掉最小值0这个数据。

 

3.

 

'''
空气质量
版本:9.0
'''

import pandas as pd

def main():
    '''
    主函数
    '''

    aqi_data = pd.read_csv('china_city_aqi.csv')     #读取csv文件(用pandas)

    #排序 top10
    top10_cities = aqi_data.sort_values(by='AQI').head(10)
    #默认从小到大。(升序排列),拿前10
    print('空气质量最好十个城市:')
    print(top10_cities)

    # # 排序 bottom10(1)。默认从小到大。(升序排列)拿后10
    # bottom_cities = aqi_data.sort_values(by='AQI').tail(10)

    # 排序 bottom10(2)。  # 从大到小。(降序排列)拿前10
    bottom_cities = aqi_data.sort_values(by='AQI', ascending=False).head(10)

    print('空气质量最差十个城市:')
    print(bottom_cities)


if __name__ == '__main__':
    main()

 

4.将3中数据保存成csv文件(用pandas库)

 

'''
空气质量
版本:9.0
'''

import pandas as pd

def main():
    '''
    主函数
    '''

    aqi_data = pd.read_csv('china_city_aqi.csv')     #读取csv文件(用pandas)

    #排序 top10
    top10_cities = aqi_data.sort_values(by='AQI').head(10)
    #默认从小到大。(升序排列),拿前10
    print('空气质量最好十个城市:')
    print(top10_cities)

    # # 排序 bottom10(1)。默认从小到大。(升序排列)拿后10
    # bottom_cities = aqi_data.sort_values(by='AQI').tail(10)

    # 排序 bottom10(2)。  # 从大到小。(降序排列)拿前10
    bottom_cities = aqi_data.sort_values(by='AQI', ascending=False).head(10)

    print('空气质量最差十个城市:')
    print(bottom_cities)

    #数据保存成CSV
    top10_cities.to_csv('top10_aqi.csv',index=False)
    bottom_cities.to_csv('bottom10_aqi.csv', index=False)
    #保存时会默认带着索引号,index=False,不要索引号。

if __name__ == '__main__':
    main()

 

 

版本10.0:简单的数据清洗,即用Pandas进行数据可视化

数据处理、分析步骤:1.数据获取—网络爬虫

                                  2.数据清洗

                                  3.数据统计、分析

 

具体代码:数据清洗

 

'''
空气质量
版本:10.0
'''

import pandas as pd

def main():
    '''
    主函数
    '''

    aqi_data = pd.read_csv('china_city_aqi.csv')     #读取csv文件(用pandas)

    print('基本信息:')
    print(aqi_data.info())

    print('数据预览')
    print(aqi_data.head())

    #数据清洗
    #只保留AQI>0的数据
    # filter_condition = aqi_data['AQI'] > 0         #过滤条件
    # clean_aqi_data = aqi_data[filter_condition]     #清洗后干净数据

    # 数据清洗,第二种方式
    clean_aqi_data = aqi_data[aqi_data['AQI'] > 0 ]


    # 基本统计
    print('AQI最大值:', clean_aqi_data['AQI'].max())
    print('AQI最小值:', clean_aqi_data['AQI'].min())
    print('AQI均值:', clean_aqi_data['AQI'].mean())

    #排序 top10
    top10_cities = clean_aqi_data.sort_values(by='AQI').head(10)
    #默认从小到大。(升序排列),拿前10
    print('空气质量最好十个城市:')
    print(top10_cities)

    # # 排序 bottom10(1)。默认从小到大。(升序排列)拿后10
    # bottom_cities = clean_aqi_data.sort_values(by='AQI').tail(10)

    # 排序 bottom10(2)。  # 从大到小。(降序排列)拿前10
    bottom_cities = clean_aqi_data.sort_values(by='AQI', ascending=False).head(10)

    print('空气质量最差十个城市:')
    print(bottom_cities)

    #数据保存成CSV
    top10_cities.to_csv('top10_aqi.csv',index=False)
    bottom_cities.to_csv('bottom10_aqi.csv', index=False)
    #保存时会默认带着索引号,index=False,不要索引号。

if __name__ == '__main__':
    main()

 

具体代码:数据可视化

 

'''
空气质量
版本:10.0
'''

import pandas as pd
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']        #使图中可识别中文
plt.rcParams['axes.unicode_minus'] = False          #对负号处理.不让它显示


def main():
    '''
    主函数
    '''

    aqi_data = pd.read_csv('china_city_aqi.csv')     #读取csv文件(用pandas)

    print('基本信息:')
    print(aqi_data.info())

    print('数据预览')
    print(aqi_data.head())

    #数据清洗
    #只保留AQI>0的数据
    # filter_condition = aqi_data['AQI'] > 0         #过滤条件
    # clean_aqi_data = aqi_data[filter_condition]     #清洗后干净数据

    # 数据清洗,第二种方式
    clean_aqi_data = aqi_data[aqi_data['AQI'] > 0 ]


    # 基本统计
    print('AQI最大值:', clean_aqi_data['AQI'].max())
    print('AQI最小值:', clean_aqi_data['AQI'].min())
    print('AQI均值:', clean_aqi_data['AQI'].mean())

    #排序 top50
    top50_cities = clean_aqi_data.sort_values(by='AQI').head(50)
    #数据可视化
    top50_cities.plot(kind='bar',x='City',y='AQI',title='空气质量最好50城市',
                      figsize=(20,10))
    #kind='bar'表示画柱状图。figsize图片大小

    #保存
    plt.savefig('top50_aqi_bar.png')
    plt.show()

if __name__ == '__main__':
    main()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值