草庐IT

用Python监控并分析城市空气质量

学研君 2023-04-13 原文

同为发展中国家,印度也受到空气质量问题的困扰,本文就以印度的城市为例进行数据分析。利用简单的Python代码,分析城市空气质量及其每天在全国范围内(即印度水平)的排名。

在开始之前,先介绍一下整个分析过程中使用的一些基本原理。印度政府中央污染控制委员会(CPCB)是该国环境空气质量监测的监管机构,每天为那些设有连续环境空气质量监测站的印度城市发布空气质量相关信息公告。该公告包含有特定城市的空气质量指数(AQI)、空气质量类别、标准污染物以及该城市运行的监测站数量相关的信息。本文正是通过分析这个空气质量指数(AQI)来对城市进行排名。

如下所示是对于公告中一些术语的解释:

  • a)空气质量指数(AQI):空气质量指数是一个表示空气质量状况的无量纲数字。
  • b)空气质量类别或等级:根据空气质量指数,空气质量情况被分为6个类别,即“优秀”、“良好”、“中等”、“差”、“非常差”和“严重”。随着空气质量的下降,该类别从“优秀”到“严重”,表明有可能对健康产生不利影响。
  • c)标准污染物:尺寸为2.5和10微米的颗粒物、二氧化氮(NO2)、二氧化硫(SO2)、一氧化碳(CO)、臭氧(O3)、氨(NH3)和铅(Pb)是空气质量指数计算中涉及的具有潜在不利健康影响的主要标准污染物。在计算单个污染物的空气质量指数值时,应将空气质量指数最高的污染物宣布为该市的空气质量指数,并将相应的污染物宣布为标准污染物。
  • d)监测站:表示该城市在特定日期内运行的空气质量监测站的总数。这些监测站监测的污染物浓度(即标准污染物)用于评估任何城市的空气质量指数。

进行此分析有何好处?

官员们从AQI公告中实际汇编了感兴趣的城市信息。随着所关注的城市的增加,这项工作变得更加困难,必须在下午6点前报告上级,而公告在每天4点后才发布,这可能会导致无意的人为错误。由于这些原因开发了这套Python代码。这种分析的好处包括减少人工分析的人力,可靠的结果减少了人为的错误,提高了公众的知识水平,提高了政策制定者做出明智选择的能力,包括监测当地空气质量管理的结果等。

现在开始编码:

第1步:导入库

导入库numpy、requests、pandas、sys和tabula。requests​库是为了从出版商的页面上采集AQI公告。然后tabula​库将PDF格式的公告读到数据框中。pandas和numpy用作数据分析和科学计算。

## 导入库
import pandas as pd
import requests
from tabula import read_pdf
import numpy as np
import sys

第2步:用户定义的输入

a)感兴趣的日期(YYYYMMDD格式);

b)下载PDF格式的AQI公告文件的路径;

c)特定城市/感兴趣的城市名单(可选)。

最终分析提供了每日AQI公告中提到的所有城市的排名。然而,在提取特定城市/感兴趣的城市的排名的情况下,可以在c)中提供这些城市的名单。确保与c)中提供的城市相关的信息必须出现于AQI公报中。

## 用户输入
date = input('a) Enter the date of interest (on or after 29th January 2018) in the format YYYYMMDD: ') ##20180129 onwards
pathway = input('b) Define the Pathway address to download the bulletin: ') ##example C:/Users/USER/Downloads
list_of_cities = input('c) Enter the list of cities separated by commas and no space: ') ##Example Mumbai,Bangalore,Kolkata. Disclaimer: Make sure the cities mentioned are present in the Bulletin list

警告:请确保调用的意向日期是在2018年1月29日或之后。

## 日期调用检查
if date<'20180129':
sys.exit('Call the dates on or after 29th January 2018 and re-run the codes')

检查完成后继续进行后续步骤。

第3步:下载AQI公告

使用request​库下载AQI公告。使用tabula库以数据帧格式读取下载的pdf文件。如果在用户定义的日期内无法获得AQI公报,运行将被终止。

## 下载公告
k = requests.get('https://cpcb.nic.in//upload/Downloads/AQI_Bulletin_'+str(date)+'.pdf')

if k.status_code==404:
sys.exit('No Bulletin exists for the mentioned date. Please try different date')

with open(pathway+'/AQI_Bulletin_'+str(date)+'.pdf','wb') as f:
f.write(k.content)

## 以数据帧格式读取pdf
pathway = pathway+'/AQI_Bulletin_'+str(date)+'.pdf'
file = read_pdf(pathway,pages='all')

第4步:基本数据清理

在这里,删除重复的和不适用的数据,重新设置列名,并按AQI的降序对数据框进行排序。包含AQI值的数据框列被命名为“索引”。

## 删除重复的内容
new_file = pd.DataFrame()
for i in range (0, len(file)):
if i%2==0:
extract_file = file[i]
new_file = pd.concat([new_file,extract_file], axis=0)

## 提取列名
k= new_file.loc[0, ]
k.reset_index(inplace=True)
column_names = k.loc[1, ]
column_names = column_names[1: ]

## 重置列
new_file.columns = column_names

##从`new_file`中删除`NA`
new_file.dropna(inplace=True)

## 按AQI的降序对数据帧进行排序
final_file = new_file.loc[(new_file['City']!='City'), ]
final_file['Index Value']= final_file['Index Value'].astype(int)
final_file.sort_values(by='Index Value',ascending=False, inplace=True)
final_file.reset_index(inplace=True)
final_file.drop(columns=['S.No', 'index'], inplace=True)

第5步:根据空气质量指数对城市进行排名

当天拥有最高AQI值的城市获得最高排名。输出final_file包括根据AQI值在AQI公告中指定的城市的排名。2个或更多具有相同AQI值的城市被提供相同的排名。

## 基于AQI的城市排名
final_file['ranking'] = np.arange(1, len(final_file)+1)

for i in range(0,len(final_file)-1):
if final_file.loc[i,'Index Value']== final_file.loc[(i+1), 'Index Value']:
final_file.loc[(i+1), 'ranking']= final_file.loc[i, 'ranking']
for k in range(i+2,len(final_file)):
final_file.loc[k, 'ranking'] = final_file.loc[k, 'ranking']-1

第6步:对用户定义的城市进行排名并生成单独的数据帧

生成的输出文件名为city_ranking,包含了用户定义的特定城市的所有必要信息。

## 用户定义的城市排名
if len(city_list)> 0:
city_list = list_of_cities.split(',')
city_ranking = final_file.loc[final_file['City'].isin(city_list), ]

数据分析

首先运行代码。现在输入每个用户定义的预设条件:

  • a) 输入分析的日期,格式为YYYMMDD:20230401
  • b) 定义下载公告的Pathway地址:由用户决定,这里使用C:/Users/USER/Downloads
  • c) 输入由逗号和无空格分隔的城市列表:Mumbai、Delhi、Bangalore、Hyderabad、Ahmedabad、Chennai、Kolkata、Surat、Vadodara、Pune

输出如下图所示:

输出(city_ranking)显示了用户定义的城市的空气质量状况、指数、主要污染物、监测空气污染的监测站数量和排名。注:在用户定义的分析日期,AQI公报中没有与Bangalore和Vadodara有关的信息,因此没有显示在数据框中。

使用这套代码,可以了解许多有用的内容。例如,使用for循环,就可以使用来自AQI公告库的数据,并查看数据是如何随时间变化的。

有关用Python监控并分析城市空气质量的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  3. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  4. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  5. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

  6. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

  7. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  8. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  9. Python 刷Leetcode题库,顺带学英语单词(31) - 2

    ValidPalindromeGivenastring,determineifitisapalindrome,consideringonlyalphanumericcharactersandignoringcases. [#125]Example:"Aman,aplan,acanal:Panama"isapalindrome."raceacar"isnotapalindrome.Haveyouconsiderthatthestringmightbeempty?Thisisagoodquestiontoaskduringaninterview.Forthepurposeofthisproblem

  10. python - 是否可以使用 Ruby 或 Python 禁用 anchor /引用来发出有效的 YAML? - 2

    是否可以在PyYAML或Ruby的Psych引擎中禁用创建anchor和引用(并有效地显式列出冗余数据)?也许我在网上搜索时遗漏了一些东西,但在Psych中似乎没有太多可用的选项,而且我也无法确定PyYAML是否允许这样做.基本原理是我必须序列化一些数据并将其以可读的形式传递给一个不是真正的技术同事进行手动验证。有些数据是多余的,但我需要以最明确的方式列出它们以提高可读性(anchor和引用是提高效率的好概念,但不是人类可读性)。Ruby和Python是我选择的工具,但如果有其他一些相当简单的方法来“展开”YAML文档,它可能就可以了。 最佳答案

随机推荐