欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Python案例—AQI 空气质量指数系列总结

程序员文章站 2022-05-19 13:21:48
...

版本 3.0
功能:读取已经获取的JSON数据文件,并将AQI前5的数据输出到文件

"""
    作者:Z_Howe
    版本:3.0
    功能:计算空气质量指数(Air Quality Index)
    新增功能:读取已经获取的JSON数据文件,并将AQI前5的数据输出到文件
    日期:2019/1/29
    · JSON库是处理JSON格式的Python标准库
        ·两个过程:
            · 编码(encoding),将Python数据类型转换成JSON格式的过程
            · 解码(decoding),从JSON格式中解析数据对应到Python数据类型的过程
        dumps()  将Python数据类型转换为JSON格式(dict->str)
        loads()  将JSON格式字符串转换为Python数据类型(str->dict)
        dump()   与dumps()功能一致,输出到文件
        load()   与loads()功能一致,从文件输入
        
        举个JSON格式例子:
            [
                {
                    "aqi":47
                    "area":"北京"
                },
                {
                    "aqi":63
                    "area":"上海"
                }
            ]
"""
import json
import csv

def process_json_file(filepath):
    """
        解析json文件
    """
    with open(filepath, mode='r', encoding='utf-8') as f:
        city_list = json.load(f)   # 解析完成后会变为列表,即type(city_list)=<list>
        return city_list    # return city_list 即可以在主函数用新的city_list接收数据


def main():
    """
        主函数 
    """
    file_path = input('请输入json文件路径:')
    city_list = process_json_file(file_path)
    city_list.sort(key=lambda city: city['aqi'])   # 以city的aqi值为指标进行排序
    lines = []
    # 列名
    lines.append(list(city_list[0].keys()))
    for city in city_list:
        lines.append(list(city.values()))

    with open('aqi.csv', 'w', encoding='utf-8', newline='') as f:
        writer = csv.writer(f)
        for line in lines:
            writer.writerow(line)

if __name__ == '__main__':
    main()

版本4.0
功能:辨别文件格式,并读取文件信息

"""
    作者:Z_Howe
    版本:4.0
    功能:计算空气质量指数(Air Quality Index)
    新增功能:辨别文件格式,并读取文件信息
    日期:2019/1/31      
"""
import json
import csv
import os


def process_csv_file(filepath):
    """
        解析csv文件
        csv.reader()将每行记录作为列表返回
    """
    with open(filepath, 'w', encoding='utf-8', newline='') as f:
        reader = csv.reader(f)
        for i in reader:
            print(', '.join(i))


def process_json_file(filepath):
    """
        解码json文件
    """
    with open(filepath, mode='r', encoding='utf-8') as f:
        city_list = json.load(f)
        print(city_list)


def main():
    """
        主函数 
    """
    file_path = input('请输入文件名称:')
    file_name, file_format = os.path.splitext(file_path)
    if file_format == '.json':
        process_json_file(file_path)
    elif file_format == '.csv':
        process_csv_file(file_path)

    else:
        print('不支持该种格式!')


if __name__ == '__main__':
    main()

版本5.0
新增功能:应用爬虫通过网络链接获取网页内容;对获得的网页内容进行处理

"""
    作者:Z_Howe
    版本:5.0
    功能:计算空气质量指数(Air Quality Index)
    新增功能:应用爬虫通过网络链接获取网页内容;对获得的网页内容进行处理
    日期:2019/1/31
    request 介绍:
        requests模块是一个简洁且简单的处理HTTP请求的工具
        requests网页请求:
            get() 对应HTTP的get方式(get(url, timeout=30))
            post() 对应HTTP的Post方式,用于传递用户数据
        requests对象属性:
            states_code: Http请求的返回状态,200表示成功,400表示失败
            text: Http相应内容的字符串形式,即url对应的页面内容
            
"""
import requests


def get_html_text(url):
    """
        获取信息,返回url的文本
    """
    r = requests.get(url, timeout=30)
    print(r.status_code)
    return r.text


def main():
    """
        主函数 
    """
    city_pinyin = input('请输入城市拼音;')
    url = 'http://pm25.in/' + city_pinyin
    url_text = get_html_text(url)
    #print(url_text)

    aqi_div = '''<div class="span12 data">
        <div class="span1">
          <div class="value">
            '''
    index = url_text.find(aqi_div)
    begin_index = index + len(aqi_div)
    end_index = begin_index + 2
    aqi_val = url_text[begin_index: end_index]
    print('空气质量为:{}'.format(aqi_val))

if __name__ == '__main__':
    main()

版本6.0
新增功能:引入BeautifulSoup模块

"""
    作者:Z_Howe
    版本:6.0
    功能:计算空气质量指数(Air Quality Index)
    新增功能:应用爬虫通过网络链接获取网页内容;对获得的网页内容进行处理
    日期:2019/1/31
    BeautifulSoup模块介绍:解析网页
        创建对象——查询节点(find-找到第一个满足条件的节点,find_all-找到所有满足条件的节点)
        基本形式:bs = BeautifulSoup(url, html_parser-指定编码器, encoding-指定编码形式)
        查找节点:
            按类型查找节点:
                · bs.find_all('a')
            按属性查找节点:
                · bs.find_all('a', href='a.html')
                · bs.find_all('a', href='a.html', string='next page')
                · bs.find_all('a', class_='a_link') 注意:是class_
                · bs.find_all('a', {'class':'a_link'})
"""
import requests
from bs4 import BeautifulSoup



def get_city_text(city_pinyin):
    """
        获取城市的aqi
    """
    url = 'http://pm25.in/' + city_pinyin
    r = requests.get(url, timeout=30)
    soup = BeautifulSoup(r.text, '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()
        value = div_content.find('div', {'class': 'value'}).text.strip()

        city_aqi.append((caption, value))
    return city_aqi


def main():
    """
        主函数 
    """
    while True:

        city_pinyin = input('请输入城市拼音;')
        city_aqi = get_city_text(city_pinyin)

        print(city_aqi)

if __name__ == '__main__':
    main()

版本7.0
新增功能:一条龙服务——实时获取列表城市的信息

"""
    作者:Z_Howe
    版本:7.0
    功能:计算空气质量指数(Air Quality Index)
    新增功能:一条龙服务——实时获取列表城市的信息
    日期:2019/1/31
"""
import requests
from bs4 import BeautifulSoup



def get_city_text(city_pinyin):
    """
        获取城市的aqi
    """
    url = 'http://pm25.in/' + city_pinyin
    r = requests.get(url, timeout=30)
    soup = BeautifulSoup(r.text, '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()
        value = div_content.find('div', {'class': 'value'}).text.strip()

        city_aqi.append((caption, value))
    return city_aqi


def get_all_cities():
    """
        获取所有城市列表
    """
    url = 'http://pm25.in/'
    city_list = []
    r = requests.get(url, timeout=30)
    soup = BeautifulSoup(r.text, 'lxml')

    city_div = soup.find_all('div', {'class': 'bottom'})[1]
    city_link_list = city_div.find_all('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_cities()
    for city in city_list:
        city_name = city[0]
        city_pinyin = city[1]
        city_aqi = get_city_text(city_pinyin)
        print(city_name, city_aqi)

if __name__ == '__main__':
    main()

版本8.0
新增功能:引入Pandas模块

"""
    作者:Z_Howe
    版本:9.0
    功能:计算空气质量指数(Air Quality Index)
    新增功能:Pandas
    日期:2019/1/31
    Pandas:
        · 一个强大的分析结构化数据的工具集
        · 基础是 NumPy,提供了高性能矩阵的运算
        · 应用:数据挖掘,数据分析
                学生成绩分析,股票数据分析
        · 提供数据清洗功能
    Pandas的数据结构:
        · 类似多维数组/表格数据(如excel,R中的data.frame)
        · 每列数据可以是不同的类型
        · DataFrame
            · 通过ndarray构建DataFrame
            · 通过dict构建DataFrame
            · 通过列索引获取数据(Series类型)
                · df_obj[col_idx]或df_obj.col_idx
            · 增加列数据,类似dict添加key-value
                · df_obj[new_col_idx] = data
            · 删除列
                · del df_obj[col_idx]
    索引操作:
        · DataFrame索引
            · 列索引
                · df_obj['label']
            · 不连续索引
                · df_obj[['labei1', 'label2']]
    排序:
        · sort_index,索引排序
            · 对DataFrame操作时注意轴方向
        · 按值排序
            · sort_values(by='label')
    常用的统计运算
        · sum,mean(平均值),max,min,var(方差),std(标准差)...
        · axis=0 按列统计,axis=1 按行统计
        · skipna排除缺失值,默认为True
        · idmax,idmin,cumsum
    统计描述
        · describe 产生多个统计数据
    Pandas数据清洗
        · 处理缺失数据
            · dropna()丢弃缺失数据
            · fillna()填充缺失数据
        · 数据过滤
            · df[filter_condition]依据filter_condition对数据进行过滤
    · Pandas提供了内建的绘图功能(基于matplotlib)
    · plot(kind,x,y,title,figsize)
      x,y 横纵坐标对应的数据列
      title图像名称
      figsize图像尺寸
    · 保存图片
        plt.savefig()
        
"""
import pandas as pd


def main():
    """
        主函数 
    """
    aqi_data = pd.read_csv('china_city_aqi.csv')
    print('基本信息:')
    print(aqi_data.info())

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

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

    print('top10:')
    top10_city = aqi_data.sort_values(by=['AQI']).head(10)
    print('空气质量最好的10个城市:')
    print(top10_city)

    bottom10_city = aqi_data.sort_values(by=['AQI'], ascending=False).head(10)
    print('空气质量最差的10个城市:')
    print(bottom10_city)

    # 数据保存为csv
    top10_city.to_csv('top10_aqi.csv', index=False)
    bottom10_city.to_csv('bottom10_city.csv', index=False)

if __name__ == '__main__':
    main()

版本9.0
新增功能:数据可视化

"""
    作者:Z_Howe
    版本:9.0
    功能:计算空气质量指数(Air Quality Index)
    新增功能:Pandas
    日期:2019/1/31
"""
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')
    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('基本统计:')
    print('AQI最大值:', clean_aqi_data['AQI'].max())
    print('AQI最小值:', clean_aqi_data['AQI'].min())
    print('AQI均值:', clean_aqi_data['AQI'].mean())

    top50_city = clean_aqi_data.sort_values(by=['AQI']).head(50)
    top50_city.plot(kind='bar', x='City', y='AQI', title='空气质量最好的50个城市',
                    figsize=(20, 10))
    plt.savefig('top50_aqi_bar.png')
    plt.show()

if __name__ == '__main__':
    main()