Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第1张图片

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第2张图片

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第3张图片

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第4张图片

 版本1.0

'''
功能:AQI计算
版本:1.0
'''
def cal_linear(iaqi_lo,iaqi_hi,bp_lo,bp_hi,cp):
    '''
    范围缩放
    '''
    iaqi = (iaqi_hi-iaqi_hi)*(cp-bp_lo)/(bp_hi-bp_lo) + iaqi_lo
    return iaqi
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)
    elif 116 <= pm_val < 151:
        iaqi = cal_linear(150, 200, 115, 150, pm_val)
    elif 151 <= pm_val < 251:
        iaqi = cal_linear(200, 300, 150, 250, pm_val)
    elif 251 <= pm_val < 351:
        iaqi = cal_linear(300, 400, 250, 350, pm_val)
    elif 351 <= pm_val < 501:
        iaqi = cal_linear(400, 500, 350, 500, pm_val)
    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)
    elif 15 <= co_val < 25:
        iaqi = cal_linear(150, 200, 14, 24, co_val)
    elif 25 <= co_val < 37:
        iaqi = cal_linear(200, 300, 24, 36, co_val)
    elif 37 <= co_val < 49:
        iaqi = cal_linear(300, 400, 36, 48, co_val)
    elif 49 <= co_val < 61:
        iaqi = cal_linear(400, 500, 48, 60, co_val)
    return iaqi
def cal_aqi(param_list):
    '''
    AQI计算
    '''
    pm_val = param_list[0]
    co_val = param_list[1]

    pm_iaqi = cal_pm_iaqi(pm_val)
    co_iaqi = cal_co_iaqi(co_val)

    iaqi_list  = []
    iaqi_list.append(pm_iaqi)
    iaqi_list.append(co_iaqi)
    print(iaqi_list)
    aqi = max(iaqi_list)
    return aqi
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计算函数
    aqi_val = cal_aqi(param_list )
    print('空气质量指数为:{}'.format(aqi_val))

if __name__ == '__main__':
    main()

版本2.0

新增功能:

读取已经获取的JSON数据文件
• 并将AQI前5的数据输出到文件

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第5张图片

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第6张图片

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第7张图片

列表排序
• list.sort(func)
func指定了排序的方法
• func可以通过lambda函数实现

'''
功能:AQI计算
版本:2.0
'''
import json

def pricess_json_file(filepath):
    '''
    解码json文件
    '''
    f = open(filepath ,mode= 'r',encoding= 'utf-8')
    city_list = json.load(f)
    return city_list
def main():
   filepath = input('请输入json文件路径:')
   city_list = pricess_json_file(filepath)
   city_list.sort(key=lambda city:city['aqi'])  #根据aqi排序
   top5_list = city_list [:5]

   f = open('top5_aqi.json',mode= 'w',encoding= 'utf-8')
   json.dump(top5_list ,f,ensure_ascii= False )  #写入文件
   f.close()
   print(city_list )
if __name__ == '__main__':
    main()

版本3.0

读取已经获取的JSON数据文件
• 并将其转换成CSV文件

• CSV(Comma-Separated Values)是一种通用的、相对简单的文件格式
• 在商业和科学领域上广泛使用
• 规则
1. 以行为单位
2. 每行表示一条记录
3. 以英文逗号分割每列数据(如果数据为空,逗号也要保留)
4. 列名通常放置在文件第一行

import csv
• csv.writerow(list) 将列表中的元素写入文件的一行中

'''
功能:AQI计算
版本:3.0
'''
import json
import csv

def pricess_json_file(filepath):
    '''
    解码json文件
    '''
    f = open(filepath ,mode= 'r',encoding= 'utf-8')
    city_list = json.load(f)
    return city_list
def main():
   filepath = input('请输入json文件路径:')
   city_list = pricess_json_file(filepath)
   city_list.sort(key=lambda city:city['aqi'])  #根据aqi排序

   lines = []
   #列名
   lines.append(list(city_list[0].keys()))
   for city in city_list:
       lines.append(list(city.values()))
   f = open('aqi.csv','w',encoding= 'utf-8',newline= '')
   writer = csv.writer(f)
   for line in lines:
       writer.writerow(line)
   f.close()

if __name__ == '__main__':
    main()

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第8张图片

版本4.0

根据输入的文件判断是JSON格式还是CSV格式,并进行相应的操作

文件操作补充:

CSV文件读取
imort csv
csv.reader() 将每行记录作为列表返回
• 使用with语句操作文件对象

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第9张图片

使用with语句,不管在处理文件过程中是否发生异常,都能保证with语句执行完毕后关闭文件。不需要close()语句。

 

• os模块提供了与系统、目录操作相关的功能,不受平台的限制

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第10张图片

 

'''
功能:AQI计算
版本:4.0
'''
import json
import csv
import os

def process_json_file(filepath):
    '''
    解码json文件
    '''
    # f = open(filepath ,mode= 'r',encoding= 'utf-8')
    # 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):
    '''
    处理csv文件
    '''
    with open(filepath ,mode= 'r',encoding= 'utf-8') as f:
        reader = csv.reader(f)
        for row in reader:
            print(','.join(row))  #行之间用,隔开
def main():
   filepath = input('请输入文件路径:')
   filename,file_ext = os.path.splitext(filepath )

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

if __name__ == '__main__':
    main()

版本5.0

为了能有效地提取并利用网络信息并工作提高效率,出现了网络爬虫
• 利用网络爬虫实时获取城市的空气质量

网络爬虫

 自动抓取互联网信息的程序;利用互联网数据进行分析、开发产品
• 步骤:
1. 通过网络链接获取网页内容
2. 对获得的网页内容进行处理

requests模块

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第11张图片

更多方法参考:http://docs.python-requests.org/

 

'''
功能:爬虫/获取AQI
版本:5.0
'''
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)   #获取网页‘审查元素’中的文本

    #浏览器中审查元素 找到所需数据的div位置
    #注意也要把空格复制进去  因为空格也占位置
    aqi_div = '''
''' index = url_text.find(aqi_div) #获得aqi_div的起始序列号 begin_index = index+len(aqi_div) #aqi数值的起始序列号 end_index = begin_index + 2 aqi = url_text [begin_index:end_index ] print('空气质量为:{}'.format(aqi)) if __name__ == '__main__': main()

版本6.0

高效地解析和处理HTML,beautifulsoup4

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第12张图片

BeautifulSoup
• 用于解析HTML或XML
• pip install beautifulsoup4
• import bs4
• 步骤
1. 创建BeautifulSoup对象
2. 查询节点
find,找到第一个满足条件的节点
find_all, 找到所有满足条件的节点

 

创建对象
• 创建BeautifulSoup对象
• bs = BeautifulSoup(
url,
html_parser, 指定解析器
enoding 指定编码格式(确保和网页编码格式一致)
)

查找节点
next page
• 可按节点类型、属性或内容访问
• 按类型查找节点
• 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’})

 

网站审查元素:找到div节点

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第13张图片

 

'''
功能:爬虫/获取AQI
版本:6.0
'''
import requests
from bs4 import BeautifulSoup

def get_city_aqi(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):  #一共有8个span1
        div_content = div_list[i]
        #print(div_content )
        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_aqi(city_pinyin )
    print(city_aqi )

if __name__ == '__main__':
    main()

版本7.0

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

1. 首先获取所有的城市列表,及对应的url
2. 根据url获取城市的空气质量(6.0程序)

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第14张图片

'''
功能:爬虫/获取AQI
版本:6.0
'''
import requests
from bs4 import BeautifulSoup

def get_city_aqi(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):  #一共有8个span1
        div_content = div_list[i]
        #print(div_content )
        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_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] #因为url中有两个bottom,我们要的是第二个,所以用【1】
    city_link_list = city_div.find_all('a')
    for city_link in city_link_list :   #遍历所有a节点
        #print(city_link)  #阿坝州 ...
        city_name = city_link.text
        #print(city_name)   #阿坝州  ...
        city_pinyin = city_link['href'][1:]   #获取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_aqi(city_pinyin )
        print(city_name,city_aqi )

if __name__ == '__main__':
    main()

 版本8.0

新增功能:将获取的所有城市空气质量保存成CSV数据文件

'''
功能:爬虫/获取AQI
版本:8.0
'''
import requests
from bs4 import BeautifulSoup
import csv

def get_city_aqi(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):  #一共有8个span1
        div_content = div_list[i]
        #print(div_content )
        caption = div_content.find('div',class_='caption').text.strip()  #.text.strip()去掉空格变成字符串格式
        value = div_content.find('div',class_='value').text.strip()

        city_aqi.append(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] #因为url中有两个bottom,我们要的是第二个,所以用【1】
    city_link_list = city_div.find_all('a')
    for city_link in city_link_list :   #遍历所有a节点
        #print(city_link)  #阿坝州 ...
        city_name = city_link.text
        #print(city_name)   #阿坝州  ...
        city_pinyin = city_link['href'][1:]   #获取href属性,[1:]是不取前面的/
        city_list.append((city_name,city_pinyin))
    return city_list

def main():
    city_list = get_all_cities()
    
    header = ['city','AQI','PM2.5/1h','PM10/1h','CO/1h','NO2/1h','O3/1h','O3/8h','SO2/1h']

    with open('china_city_aqi.csv','w',encoding='utf-8',newline= '')as f:
        writer = csv.writer(f)
        writer.writerow(header)
        #for city in city_list :
        #输出索引号,查看写入进度
        for i,city in enumerate(city_list):
            if (i+1) % 10 == 0:
                print('已处理{}行记录。共{}条记录'.format(i+1,len(city_list)) )
            city_name = city[0]
            city_pinyin = city[1]
            city_aqi = get_city_aqi(city_pinyin )
            #print(city_name,city_aqi )
            row = [city_name] + city_aqi    #city_name是字符串,city_aqi是列表,进行拼接操作
            writer.writerow(row)

if __name__ == '__main__':
    main()

版本9.0

新增功能:• 利用Pandas进行数据处理分析

Pandas的数据操作

Pandas
• 一个强大的分析结构化数据的工具集
• 基础是NumPy,提供了高性能矩阵的运算
• 应用,数据挖掘,数据分析
• 如,学生成绩分析、股票数据分析等。
• 提供数据清洗功能

Pandas的数据结构

Series
• 类似一维数组的对象
• 通过list构建Series
• ser_obj = pd.Series(range(10))
• 由数据和索引组成
• 索引在左,数据在右
• 索引是自动创建的
• 获取数据和索引
• ser_obj.index, ser_obj.values
• 预览数据
• ser_obj.head(n)  #获取前n个数据

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第15张图片

Series (续)
• 通过索引获取数据
• ser_obj[idx]
• 索引与数据的对应关系仍保持在数组运算的结果中
• 通过dict构建Series
• name属性
• ser_obj.name, ser_obj.index.name

DataFrame
• 类似多维数组/表格数据 (如,excel, R中的data.frame)
• 每列数据可以是不同的类型,what about ndarray?
• 索引包括列索引和行索引 

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第16张图片

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[[‘label1’, ‘label2’]]

排序
• sort_index,索引排序
• 对DataFrame操作时注意轴方向
• 按值排序
• sort_values(by=‘label’)

常用的统计计算
• sum, mean, max, min…
• axis=0 按列统计,axis=1按行统计
• skipna 排除缺失值, 默认为True
• idmax, idmin, cumsum
统计描述
• describe 产生多个统计数据

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第17张图片

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析_第18张图片

'''
功能:数据分析
版本:9.0
'''
import pandas as pd

def main():
    aqi_data = pd.read_csv('china_city_aqi.csv')
    #print(aqi_data.head(5))
    #print(aqi_data['AQI'])  #获取AQI列
    #print(aqi_data[['AQI','city']])
    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())

    #top10
    top10_cities = aqi_data.sort_values(by= ['AQI'],ascending= True).head(10)  #ascending= True为升序,False为降序
    print('空气质量最好的10个城市:',top10_cities )

    #bottom10
    bottom10_cities = aqi_data.sort_values(by=['AQI'], ascending=True).tail(10)  #tail取底部10个数据
    #bottom10_cities = aqi_data.sort_values(by=['AQI'], ascending=False ).head(10)  # ascending= True为升序,False为降序
    print('空气质量最差的10个城市:', bottom10_cities)

    #保存在csv文件
    top10_cities.to_csv('top10_aqi.csv',index=False )  #index=False不输出索引号
    bottom10_cities.to_csv('bottom10_aqi.csv',index=False )
    
if __name__ == '__main__':
    main()

版本10.0

新增功能:数据清洗;利用Pandas进行数据可视化

• 处理缺失数据
 dropna() 丢弃缺失数据
 fillna() 填充缺失数据
• 数据过滤
df[filter_condition] 依据filter_condition对数据进行过滤

Pandas数据可视化

Pandas提供了内建的绘图功能(基于matplotlib)
• plot(kind, x, y, title, figsize)
x, y 横纵坐标对应的数据列
title图像名称
figsize图像尺寸
• 保存图片
plt.savefig()
• 更多例子请参考:https://pandas.pydata.org/pandas-docs/stable/visualization.html

'''
版本: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')
    #print(aqi_data.head(5))
    #print(aqi_data['AQI'])  #获取AQI列
    #print(aqi_data[['AQI','city']])
    print('基本信息')
    print(aqi_data.info())

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

    #数据清洗
    #只保留AQI大于0的数据
    filter_condition = aqi_data['AQI']>0
    clean_data = aqi_data[filter_condition]

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

    #top50
    top50_cities = clean_data.sort_values(by= ['AQI'],ascending= True).head(50)  #ascending= True为升序,False为降序
    print('空气质量最好的50个城市:',top50_cities )

    #bottom10
    bottom10_cities = clean_data.sort_values(by=['AQI'], ascending=True).tail(10)  #tail取底部10个数据
    #bottom10_cities = clean_data.sort_values(by=['AQI'], ascending=False ).head(10)  # ascending= True为升序,False为降序
    print('空气质量最差的10个城市:', bottom10_cities)

    #保存在csv文件
    # top10_cities.to_csv('top10_aqi.csv',index=False )  #index=False不输出索引号
    # bottom10_cities.to_csv('bottom10_aqi.csv',index=False )

    #数据可视化
    top50_cities.plot(kind = 'bar',x='city',y='AQI',title='空气质量最好的50个城市',
                     figsize=(20,10))  #kind为图表类型  bar为柱状图
    ##保存图片
    plt.savefig('top50_aqi_bar.png')
    plt.show()

if __name__ == '__main__':
    main()

 

你可能感兴趣的:(Python学习教程,python,教程,爬虫,网络爬虫教程,数据分析)