今天是实习的第四天了,昨天和今天做了很多活,一时半会不知道从何说起。那就一个项目一个项目来说嘛,首先最开始做的是某地方的AQI指标计算,这个有相关的资料。
一、空气质量分指数IAQI
1、定义
单项污染物的空气质量指数
2、计算公式
(1)空气质量分指数对应污染物浓度阈值
计算公式解释:
以SO2的24h平均值为例:
当浓度值为120时,与浓度相近的浓度限值高位值BP_Hi =150,对应的空气质量分指数IAQI_Hi=100。与浓度相近的浓度限值低位值为BP_Lo=50,对应的空气质量分指数IAQI_Lo=50,带入计算公式计算:
IAQI_SO2=[ {(100-50)/(150-50)} * (120-50)]+50 = 85
所有污染物的计算公式如下:
注意:
1. ROUNDUP表示向上取整
2. L2等表示污染物浓度值所在excel单元格
3. O3为8h滑动平均,其余指标为24h平均值
IAQI_CO
=ROUNDUP(IF(L2<2,50*L2/2,IF(L2<4,50*(L2-2)/2+50,IF(L2<14,50*(L2-4)/10+100,IF(L2<24,50*(L2-14)/10+150,IF(L2<36,100*(L2-24)/12+200,IF(L2<48,100*(L2-36)/12+300,IF(L2<60,100*(L2-48)/12+400))))))),0)
IAQI_SO2
=ROUNDUP(IF(M2<50,50*M2/50,IF(M2<150,50*(M2-50)/100+50,IF(M2<475,50*(M2-150)/325+100,IF(M2<800,50*(M2-475)/325+150,IF(M2<1600,100*(M2-800)/ 800+200,IF(M2<2100,100*(M2-1600)/500+300,IF(M2<2620,100*(M2-2100)/520+400))))))),0)
IAQI_NO2
=ROUNDUP(IF(N2<40,50*N2/40,IF(N2<80,50*(N2-40)/40+50,IF(N2<180,50*(N2-80)/100+100,IF(N2<280,50*(N2-180)/100+150,IF(N2<565,100*(N2-280)/ 285+200,IF(N2<750,100*(N2-565)/185+300,IF(N2<940,100*(N2-750)/ 190+400))))))),0)
IAQI_O3
=ROUNDUP(IF(O2<100,50*O2/100,IF(O2<160,50*(O2-100)/60+50,IF(O2<215,50*(O2-160)/55+100,IF(O2<265,50*(O2-215)/ 50+150,IF(O2<800,100*(O2-265)/ 535+200))))),0)
IAQI_PM2.5
=ROUNDUP(IF(P2<35,50*P2/35,IF(P2<75,50*(P2-35)/40+50,IF(P2<115,50*(P2-75)/40+100,IF(P2<150,50*(P2-115)/35+150,IF(P2<250,100*(P2-150)/100+200,IF(P2<350,100*(P2-250)/100+300,IF(P2<500,100*(P2-350)/150+400))))))),0)
IAQI_PM10
=ROUNDUP(IF(Q2<50,50*Q2/50,IF(Q2<150,50*(Q2-50)/100+50,IF(Q2<250,50*(Q2-150)/100+100,IF(Q2<350,50*(Q2-250)/100+150,IF(Q2<420,100*(Q2-350)/70+200,IF(Q2<500,100*(Q2-420)/80+300,IF(Q2<600,100*(Q2-500)/100+400))))))),0)
二、空气质量指数AQI
1、AQI定义
AQI空气质量分指数IAQI中的最大值
2、计算公式
=MAX(R2:W2)
3、空气质量状况计算
=IF(I2<=50,“优”,IF(I2<=100,“良”,IF(I2<=150,“轻度污染”,IF(I2<=200,“中度污染”,IF(I2<=300, “重度污染”,“严重污染”)))))
三、首要污染物
1、定义
AQI>50时,IAQI最大的污染物,如果有两项或者两项以上就并列为首要污染物
2、 计算公式如下
其中:X2表示AQI所在单元格,R2表示CO空气质量分指数IAQI所在单元格,S~W同理表示污染物IAQI所在单元格
=IF(X2="","",IF(X2<=50,"",(IF(X2=R2,“CO”,""))&(IF(X2=S2,“SO2”,""))&(IF(X2=T2,“NO2”,""))&(IF(X2=U2,“O3”,""))&(IF(X2=V2,“PM2.5”,""))&(IF(X2=W2,“PM10”,""))))
3、首要污染物出现次数统计
"*"表示前后任意字符匹配,也就是直接寻找包括CO次数,X2根据首要污染物所在excel列更换
=COUNTIF(X2,"*CO*")
=COUNTIF(X2,"*SO2*")
=COUNTIF(X2,"*NO2*")
=COUNTIF(X2,"*O3*")
=COUNTIF(X2,"*PM2.5*")
=COUNTIF(X2,"*PM10*")
本来这个数据是要使用python处理,但是由于逻辑不好写,就放弃了,使用excel来处理了。
---------------------------------------------------------------------------------------------------------------------------------
接下来是第二个项目,是某县的企业的信息,以及行政区域的划分。
主要的任务处理是,表头有name,DOM ,LAT, LON,位置划分和行政代码的划分。现在数据库当中只有name,DOM。要根据这个去获取企业的准确的位置信息。也就是经纬度。再根据经纬度,去进行位置的划分和行政区域的划分。
解决思路:上面的领导和同事给出的基本思路是凸集的性质,假设从原点去射射线,看与那个区域的交点,根据交点的奇数偶数来判断区域。
我自己的基本解决思路:之前已经有一部分数据了,采用机器学习的办法去训练模型,然后使用模型去判断,但是由于耗时时间太长,被领导否决了。
最终的解决方案:领导决定用刚开始的思路。这个时候,我想为什么不直接用某度的API,直接调用人家的接口去做,岂不是更加的方便。
部分代码展示 :
基本思路就是调用百度的API,然后去按照DOM去获取具体的经纬度,然后再根据经纬度,去判断划分区域以及行政区号。
核心diamond展示:
import json
import time
import pymysql
import requests
def baidu(addr):
url = "http://api.map.baidu.com/geocoding/v3/?"
params = {
"address": addr,
"output": "json",
"ak": "xxxxxxxxxxxxxxx" # 百度地图开放平台申请的AK
}
req = requests.get(url, params)
try:
req = req.json()
except json.JSONDecodeError as e:
print("无法解析响应的JSON数据:", e)
if "result" in req:
m = req["result"]["location"]
return f"{m['lng']},{m['lat']}"
else:
return None
def get_address_detail(lng, lat):
url = "http://api.map.baidu.com/reverse_geocoding/v3/"
params = {
"ak": "xxxxxxxxxxxxxxx",
"output": "json",
"coordtype": "wgs84ll",
"extensions_town": "true",
"location": f"{lat},{lng}"
}
try:
response = requests.get(url, params=params)
data = response.json()
if "result" in data:
address_component = data["result"]["addressComponent"]
province = address_component.get("province", "")
city = address_component.get("city", "")
district = address_component.get("district", "")
town = address_component.get("town", "")
adcode = address_component.get("adcode", "")
address = {
"province": province,
"city": city,
"district": district,
"town": town,
"adcode": adcode
}
return address
except requests.exceptions.RequestException as e:
print("请求异常:", e)
return {}
def get_town_by_coordinates():
connection = get_connection()
if connection is None:
return
try:
cursor = connection.cursor()
query = "SELECT id, ENTNAME, DOM, LAT, LON FROM cd_entity_gis WHERE xxxxxxxxx;"
cursor.execute(query)
results = cursor.fetchall()
for row in results:
id, entname, dom, lat, lon = row
coordinates = baidu(dom)
if coordinates is not None:
lng, lat = coordinates.split(",")
address = get_address_detail(lng, lat)
print(f"ID: {id}")
print(f"经度: {lng}")
print(f"纬度: {lat}")
print("地址信息:")
print(f"乡镇:{address['town']}")
town = address.get("town", "")
adcode = town_code_mapping.get(town, "")
print(f"行政区划代码:{adcode}")
print("-------------------")
# 更新数据库内容
update_query = "UPDATE cd_entity_gis SET LON=%s, DISTRICT_CN=%s, DISTRICT=%s WHERE id=%s"
cursor.execute(update_query, (lon, town, adcode, id))
connection.commit()
# 添加适当的延迟时间,避免频繁请求API
time.sleep(1)
except pymysql.Error as e:
print("查询错误:", e)
finally:
if connection is not None:
connection.close()
def get_connection():
host = 'xxxxxxxx'
port = xxxxxxx
user = 'xxxxxxxxx'
password = 'xxxxxxxxxxx'
database = 'xxxxxxxxxx'
try:
connection = pymysql.connect(
host=host,
port=port,
user=user,
password=password,
database=database,
autocommit = True
)
return connection
except pymysql.Error as e:
print("数据库连接错误:", e)
return None
if __name__ == "__main__":
get_town_by_coordinates()
至此,两天的工作大致任务就是这样,当然,这其中还有很多其他的任务,哪些细枝末节的再次不做赘述啦!
写在最后:最近一个人在外打拼,无论是房价还是物价都让我很有压力,(BJ的物价是真的很高很高)这就是成年人的世界嘛,哎,也很想家,很想亲人和女朋友,还有我们的猫猫,但是无论怎么样,先做好作为一个程序员最开始的初心,努力学习技术,丰富自己的能力!!!
附图: