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()