x仔的北漂实习日记-day03-04

今天是实习的第四天了,昨天和今天做了很多活,一时半会不知道从何说起。那就一个项目一个项目来说嘛,首先最开始做的是某地方的AQI指标计算,这个有相关的资料。

一、空气质量分指数IAQI
1、定义
单项污染物的空气质量指数

2、计算公式
(1)空气质量分指数对应污染物浓度阈值


(2)计算方法

 计算公式解释:
以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的物价是真的很高很高)这就是成年人的世界嘛,哎,也很想家,很想亲人和女朋友,还有我们的猫猫,但是无论怎么样,先做好作为一个程序员最开始的初心,努力学习技术,丰富自己的能力!!! 

附图: 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kiritobryant

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值