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

news2024/9/21 22:54:24

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

 

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

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

  • a)空气质量指数(AQI):空气质量指数是一个表示空气质量状况的无量纲数字。

  • b)空气质量类别或等级:根据空气质量指数,空气质量情况被分为6个类别,即“优秀”、“良好”、“中等”、“差”、“非常差”和“严重”。随着空气质量的下降,该类别从“优秀”到“严重”,表明有可能对健康产生不利影响。

  • c)标准污染物:尺寸为2.5和10微米的颗粒物、二氧化氮(NO2)、二氧化硫(SO2)、一氧化碳(CO)、臭氧(O3)、氨(NH3)和铅(Pb)是空气质量指数计算中涉及的具有潜在不利健康影响的主要标准污染物。在计算单个污染物的空气质量指数值时,应将空气质量指数最高的污染物宣布为该市的空气质量指数,并将相应的污染物宣布为标准污染物。

  • d)监测站:表示该城市在特定日期内运行的空气质量监测站的总数。这些监测站监测的污染物浓度(即标准污染物)用于评估任何城市的空气质量指数。

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

进行编码

  • 第1步:导入库

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

## 导入库
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公告库的数据,并查看数据是如何随时间变化的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/740210.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(转载)极限学习机(extreme learning machine, ELM)的回归拟合及分类(matlab实现)

单隐含层前馈神经网络(single-hidden layer feedforward neural network,SLFN)以其良好的学习能力在许多领域中得到了广泛的应用。然而&#xff0c;传统的学习算法(如BP算法等)固有的一些缺点&#xff0c;成为制约其发展的主要瓶颈。前馈神经网络大多采用梯度下降方法&#xff…

阿里云服务器安装mysql并用idea连接

文章目录 前言一.购置阿里云服务器——不定时二.在服务器安装mysql——用时5分钟三.打开服务器mysql的端口——用时2分钟1.找到安全组2.打开默认mysql的3306端口 三.打开idea连接数据库——5分钟四.总用时大约20分钟 前言 记录第一次通过idea连接安装在服务器上的数据库——排错…

在vite创建的vue3项目中加载Cesium世界街道地图的底图

在vite创建的vue3项目中加载Cesium世界街道地图的底图 使用vite创建vue3项目 npm create vitelatestcd到创建的项目文件夹中 npm install安装Cesium npm i cesium vite-plugin-cesium vite -D配置 vite.config.js文件 import { defineConfig } from vite import vue from vitej…

ETHERCAT转PROFINET协议网关连接ethercat网线接口定义

大家好&#xff0c;今天我要给大家介绍一款神奇的产品&#xff0c;YC-PN-ECT&#xff0c;它是一款 PROFINET 从站功能的通讯网关&#xff0c;可以将 PROFINET 网络和 ETHERCAT 网络连接起来&#xff0c;让不同厂家的 PLC 能够互相通信&#xff0c;真是太酷了&#xff01; PEO…

T100新增栏位,配置ACC作业并提供开窗作业维护

需求分析:将xxxx作业中的一个界面新增一个栏位,并提供开窗功能进行资料的维护。 一、ACC自适应配置文档开发 1.1 azzi650 注册应用分类码【ACC】 新增一个资料 应用分类码【数字】说明 填写文字说明作业编号:这个时候是空的作业名称:也是空的1.2 azzi910 作业基本维护 这个…

做爬虫如何选择Python和C语言

目录 优劣势分析 Python 进行爬虫的优势&#xff1a; Python 进行爬虫的劣势&#xff1a; C进行爬虫的优势&#xff1a; C进行爬虫的劣势&#xff1a; 示例代码说明 Python 示例代码&#xff1a; C语言 示例代码&#xff1a; 怎么选择 优劣势分析 Python 进行爬虫的优…

Java设计模式之创建型-原型模式(UML类图+案例分析)

一、基础概念 通过复制已有对象作为原型&#xff0c;通过复制该原型来返回一个新对象&#xff0c;而不是新建对象&#xff0c;说白了就是不断复制相同的对象罢了。 二、UML类图 三、角色分析 角色描述抽象原型类规定了具体的原型对象必须实现的clone()方法具体原型类实现抽象…

倒计时1天!LeaTech全球CTO领导力峰会TVP四周年庆典即将开幕

引言 3 月 4 日&#xff0c;上海扬子江丽笙精选酒店&#xff0c;LeaTech 全球 CTO 领导力峰会暨腾讯云 TVP 四周年、CTO 训练营校友联合庆典即将开幕。本次 LeaTech 全球 CTO 领导力峰会以“寻光之旅”为主题&#xff0c;腾讯云 TVP 携手 51CTO&#xff0c;联合邀请业内资深领袖…

C# winform界面显示3D点云图像(halcon+VTK)

前一段时间研究了下halcon里的3d算法&#xff0c;想着把3d图像显示在C#编写的软件界面上&#xff0c;试了下halcon的控件&#xff0c;没成功。后来学习了一点VTK的知识&#xff0c;实现了3d图像的显示&#xff0c;可旋转&#xff0c;平移&#xff0c;缩放观察&#xff0c;当然也…

为什么国内做不出好的3A游戏?

个人觉得原因如下&#xff1a; 主要原因&#xff1a; 市场需求和消费观念&#xff1a;国内游戏市场对游戏类型和风格有着自身的特点和需求。一些热门游戏类型&#xff0c;如多人在线游戏、手机游戏等&#xff0c;相对于传统的3A游戏更受国内玩家欢迎。这可能导致国内游戏公司…

QInputDialog 不显示ok或cancel按钮bug

今天遇到一个奇怪问题&#xff0c;就是调用 QInputDialog::getText去获取输入文本&#xff0c;但是无法显示系统ok和cancel按钮&#xff0c;我记得之前是可以的&#xff0c;于是我回退上一个版本是正常&#xff0c;于是对比两个版本代码&#xff0c;发现&#xff0c;自己重写 Q…

【人工智能】贝叶斯网络、概率图模型、全局语义、因果链、朴素贝叶斯模型、枚举推理、变量消元

文章目录 频率学派 vs. 贝叶斯学派贝叶斯学派Probability&#xff08;概率&#xff09;:独立性/条件独立性&#xff1a;Probability Theory&#xff08;概率论&#xff09;:Graphical models &#xff08;概率图模型&#xff09;什么是图模型&#xff08;Graphical Models&…

stm32(定时器和PWM知识点)

一、定时器介绍 软件定时 缺点&#xff1a;不精确、占用CPU资源 void Delay500ms() //11.0592MHz { unsigned char i, j, k; _nop_(); i 4; j 129; k 119; do { do { while (--k); } while (--j); } while (--i); }定时器工作原理&#xff1a; 使用精准的时基&#xff0c…

面试靠微服务扭转局面,知乎夸爆的微服务学习笔记到底有多牛?

我们现在的服务-微服务 我感觉微服务不是一个架构&#xff0c;而是像一个生态&#xff0c;应用与应用之间互相独立&#xff0c;却又彼此依赖。通过 DDD 的模型来设计一个地图&#xff0c;把合适的代码放到合适的地方去。实现微服务涉及的工具太多&#xff0c;以下我采用spring…

Python -- 多任务、进程、线程

文章目录 多任务的介绍多任务的执行方式 进程进程的概念进程的作用进程的使用多进程获取进程编号 进程执行带有参数的任务介绍args参数和kwargs的使用 进程注意点进程之间不共享全局变量主进程会等待所有子进程执行结束再结束 线程介绍概念 线程的作用多线程的使用线程执行有参…

在OpenCV中进行图像预处理

今天&#xff0c;我们进一步深入&#xff0c;并处理在图像处理中常用的形态学操作。形态学操作用于提取区域、边缘、形状等。 什么是形态学操作&#xff1f; 形态学操作是在二值图像上进行的。二值图像可能包含许多不完美之处。特别是由一些简单的阈值操作产生的二值图像&#…

2023-07-10 cmake管理的项目中使用vcpkg管理第三方库

一、安装 从Github上克隆Vcpkg仓库然后执行安装命令即可&#xff1a; git clone https://github.com/microsoft/vcpkg .\vcpkg\bootstrap-vcpkg.bat 安装自己需要的第三方库 .\vcpkg\vcpkg install [packages to install] 更多教学可参考&#xff1a; https://learn.microsoft…

kubenetes手动安装V1.22.4

kubenetes手动安装V1.22.4 1、主节点和工作节点需要的组件 提示&#xff1a;为了方便测试请关闭selinux、关闭防火墙、swap. SELinux防火墙的设置&#xff1a; [rootlocalhost]#getenforce Disabled # 修改/etc/selinux/config文件 vim /etc/selinux/config 将SELINUXenfor…

【python】Excel文件的读取操作

测试用例.xlsx文件内容 利用xlrd模块读取文件 import xlrdfilename 测试用例.xlsx # 读取Excel表文件 wb xlrd.open_workbook(filename) # 读取Excel表中的第一个工作表 sheet wb.sheet_by_index(0) # 读取有内容的表格行数 rows sheet.nrows # 读取有内容的表格列数 cols…

嵌入式系统之ADC采样

嵌入式系统往往会有模拟信号的采集&#xff0c;比如模拟传感器温度、压力、流量、速度、光强等模拟量&#xff0c;经过放大整形滤波电路后送给ADC芯片&#xff0c;将电信号转转变成离散的数字量这个过程称之为AD采样&#xff0c;AD采样应用广泛&#xff0c;普遍遵循采样率3倍于…