add API doc

This commit is contained in:
赵敬皓 2023-06-26 14:56:24 +08:00
parent 770ce7fff9
commit 8d86cc9dc5
5 changed files with 130 additions and 23 deletions

102
README.md
View File

@ -0,0 +1,102 @@
# 污染物排放动态监测接口文档
## 接口文档
### Docker服务地址
`124.16.151.196:8788/emission/`
### 输入
输入为json串具体内容如下
```
{
"key": "xxxx",
"data":{
"time": "",
"boiler": "",
... //以下省略
}
}
```
其中`key`字段可用于并发时确认请求来源,`data`字段为传入的机组和排放参数,具体如下:
|字段|类型|含义|是否由爬虫获取|
|----|----|----|----|
|time|str|时间,'yyyy-mm-dd hh:MM:ss'|是|
|boiler|str|锅炉类型|否|
|steam|str|汽轮机类型|否|
|cold|str|冷却方式|否|
|pressure|str|压力参数|否|
|nox|float|氮氧化物($NO_x$)浓度数值($mg/m^3$)|是|
|so2|float|二氧化硫($SO_2$)浓度数值($mg/m^3$)|是|
|smoke|float|烟气浓度($mg/m^3$)|是|
|flow|float|烟气流量($m^3/h$)|是|
|o2|float|含氧量($O_2$, %)|是|
|temp|float|温度(℃)|是|
|evaporation|float|机组额定蒸发量(t/h)|否|
|caloric|float|低位发热值(一般为10-30 GJ/t)|视情况而定|
|lon|str|经度|否|
|lat|str|纬度|否|
### 输出
输出为json串包含如下字段
```
{
"code": 200,
"request_key": "xxxx",
"data": {...}
}
```
其中`key`字段可用于并发时确认请求来源data字段对应模型返回的当前时刻的结果具体如下
|字段|类型|含义|
|----|----|----|
|coal|float|该时刻对应的煤耗(t)|
|co|float|一氧化碳排放量(kg)|
|co2|float|二氧化碳排放量(kg)|
|vocs|float|VOCs排放量(kg)|
|pm25|float|PM2.5排放量(kg)|
|pm10|float|PM10排放量(kg)|
## 示例
### 输入示例
```
{
"key": "123456",
"data": {
"time": "2023-01-02 03:04:05",
"boiler": "循环流化床锅炉",
"steam": "凝气式",
"cold": "水冷-开式循环",
"pressure": "超超临界",
"nox": "12",
"so2": "0.15",
"smoke": "12",
"flow": "5000000",
"o2": "23",
"temp": "55",
"evaporation": "123",
"caloric": "23",
"capacity": "234",
"lon": "122",
"lat": "33"
}
}
```
### 输出示例(调用成功)
```
{
"code": 200,
"key": "123456",
"data": {
"coal": 31.213128645837465,
"co": 62.42625729167493,
"vocs": 67.42035787500893,
"pm25": 0.72,
"pm10": 2.7600000000000002,
"co2": 65.24910397752144
}
}
```
### 输出示例(调用失败)
```
{
"code": 406,
"key": "123456",
"msg": "Input is None, please check!"
}
```

View File

@ -1,26 +1,26 @@
{
"CO":{
"co":{
"煤粉": 2,
"循环流化床": 2,
"自动炉排层燃炉": 15,
"手动炉排层燃炉 ": 124.3,
"default": 2
},
"VOCs":{
"vocs":{
"煤粉": 2.16,
"循环流化床": 2.16,
"自动炉排层燃炉": 2.16,
"手动炉排层燃炉 ": 4.53,
"default": 2.16
},
"PM25":{
"pm25":{
"煤粉": 0.06,
"循环流化床": 0.07,
"自动炉排层燃炉": 0.1,
"手动炉排层燃炉 ": 0.07,
"default": 0.06
},
"PM10":{
"pm10":{
"煤粉": 0.23,
"循环流化床": 0.29,
"自动炉排层燃炉": 0.3,

View File

@ -28,18 +28,18 @@ def cal_coal_cost_emission(coal_cost, boiler, emission_factors):
else:
return emission_factors.get("default") * coal_cost
def cal_PM(r_smoke, boiler, emission_factors):
def cal_PM(c_smoke, boiler, emission_factors):
factor = emission_factors.get(boiler)
if factor is not None:
return r_smoke * factor
return c_smoke * factor / 1e6
else:
return emission_factors.get("default") * r_smoke
return emission_factors.get("default") * c_smoke / 1e6
def predict(his_data, input_data, model:lgb.Booster, object_cols, emission_factors):
feature_names = model.feature_name()
date = dt.datetime.strptime(input_data.get('time'), '%Y-%m-%d %H:%M:%S')
r_NOx = float(input_data.get('NOx'))
r_SO2 = float(input_data.get('SO2'))
r_NOx = float(input_data.get('nox'))
r_SO2 = float(input_data.get('so2'))
r_smoke = float(input_data.get('smoke'))
flow = float(input_data.get('flow'))
c_NOx, c_SO2, c_smoke = flow * np.asarray([r_NOx, r_SO2, r_smoke])
@ -61,7 +61,7 @@ def predict(his_data, input_data, model:lgb.Booster, object_cols, emission_facto
"0_c_SO2": np.log1p(float(c_SO2)),
"0_c_smoke": np.log1p(float(c_smoke)),
"0_flow": np.log1p(float(flow)),
"0_O2": np.log1p(float(input_data.get("O2"))),
"0_O2": np.log1p(float(input_data.get("o2"))),
"0_temp": np.log1p(float(input_data.get("temp"))),
"额定蒸发量_t/h": np.log1p(float(input_data.get("evaporation"))),
"低位发热量": np.log1p(caloric),
@ -74,10 +74,10 @@ def predict(his_data, input_data, model:lgb.Booster, object_cols, emission_facto
new_inputs = pd.get_dummies(total_data, columns=object_cols)
new_inputs = new_inputs[feature_names].iloc[-1].values
coal_cost = np.expm1(model.predict([new_inputs])[0])
co = cal_coal_cost_emission(coal_cost, input_data.get('boiler'), emission_factors.get('CO'))
vocs = cal_coal_cost_emission(coal_cost, input_data.get('boiler'), emission_factors.get('VOCs'))
pm25 = cal_PM(r_smoke, input_data.get('boiler'), emission_factors.get('PM25'))
pm10 = cal_PM(r_smoke, input_data.get('boiler'), emission_factors.get('PM10'))
co = cal_coal_cost_emission(coal_cost, input_data.get('boiler'), emission_factors.get('co'))
vocs = cal_coal_cost_emission(coal_cost, input_data.get('boiler'), emission_factors.get('vocs'))
pm25 = cal_PM(c_smoke, input_data.get('boiler'), emission_factors.get('pm25'))
pm10 = cal_PM(c_smoke, input_data.get('boiler'), emission_factors.get('pm10'))
co2 = cal_CO2(coal_cost, caloric)
return {'coal': coal_cost, 'co':co, 'vocs':vocs, 'pm25':pm25, 'pm10':pm10, 'co2':co2}
@ -93,11 +93,11 @@ if __name__ == '__main__':
"steam": "凝气式",
"cold": "水冷-开式循环",
"pressure": "超超临界",
"NOx": "12",
"SO2":"0.15",
"nox": "12",
"so2":"0.15",
"smoke":"12",
"flow":"5000000",
"O2": "23",
"o2": "23",
"temp": "55",
"evaporation": "123",
"caloric": "23",

11
run.py
View File

@ -24,20 +24,25 @@ def run_case_check():
resp_info = dict()
if request.method == "POST":
data = request.json.get('data')
key = request.json.get('key')
resp_info['key'] = key
logger.info("request key: {key}")
logger.info(data)
if data is not None and len(data) != 0:
try:
rst = predict(history_data, data, lgb_model, object_cols, emission_factors)
resp_info["code"] = 200
resp_info["data"] = rst
except Exception as e:
resp_info["code"] = 406
resp_info["data"] = str(e)
else:
resp_info["msg"] = "Input is None, please check !"
resp_info["msg"] = "Input is None, please check!"
resp_info["code"] = 406
resp = make_response(json.dumps(resp_info))
resp.status_code = 200
return resp
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8788, debug=False)