add API doc
This commit is contained in:
parent
770ce7fff9
commit
8d86cc9dc5
102
README.md
102
README.md
|
@ -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!"
|
||||||
|
}
|
||||||
|
```
|
|
@ -1,26 +1,26 @@
|
||||||
{
|
{
|
||||||
"CO":{
|
"co":{
|
||||||
"煤粉": 2,
|
"煤粉": 2,
|
||||||
"循环流化床": 2,
|
"循环流化床": 2,
|
||||||
"自动炉排层燃炉": 15,
|
"自动炉排层燃炉": 15,
|
||||||
"手动炉排层燃炉 ": 124.3,
|
"手动炉排层燃炉 ": 124.3,
|
||||||
"default": 2
|
"default": 2
|
||||||
},
|
},
|
||||||
"VOCs":{
|
"vocs":{
|
||||||
"煤粉": 2.16,
|
"煤粉": 2.16,
|
||||||
"循环流化床": 2.16,
|
"循环流化床": 2.16,
|
||||||
"自动炉排层燃炉": 2.16,
|
"自动炉排层燃炉": 2.16,
|
||||||
"手动炉排层燃炉 ": 4.53,
|
"手动炉排层燃炉 ": 4.53,
|
||||||
"default": 2.16
|
"default": 2.16
|
||||||
},
|
},
|
||||||
"PM25":{
|
"pm25":{
|
||||||
"煤粉": 0.06,
|
"煤粉": 0.06,
|
||||||
"循环流化床": 0.07,
|
"循环流化床": 0.07,
|
||||||
"自动炉排层燃炉": 0.1,
|
"自动炉排层燃炉": 0.1,
|
||||||
"手动炉排层燃炉 ": 0.07,
|
"手动炉排层燃炉 ": 0.07,
|
||||||
"default": 0.06
|
"default": 0.06
|
||||||
},
|
},
|
||||||
"PM10":{
|
"pm10":{
|
||||||
"煤粉": 0.23,
|
"煤粉": 0.23,
|
||||||
"循环流化床": 0.29,
|
"循环流化床": 0.29,
|
||||||
"自动炉排层燃炉": 0.3,
|
"自动炉排层燃炉": 0.3,
|
||||||
|
|
Binary file not shown.
|
@ -28,18 +28,18 @@ def cal_coal_cost_emission(coal_cost, boiler, emission_factors):
|
||||||
else:
|
else:
|
||||||
return emission_factors.get("default") * coal_cost
|
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)
|
factor = emission_factors.get(boiler)
|
||||||
if factor is not None:
|
if factor is not None:
|
||||||
return r_smoke * factor
|
return c_smoke * factor / 1e6
|
||||||
else:
|
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):
|
def predict(his_data, input_data, model:lgb.Booster, object_cols, emission_factors):
|
||||||
feature_names = model.feature_name()
|
feature_names = model.feature_name()
|
||||||
date = dt.datetime.strptime(input_data.get('time'), '%Y-%m-%d %H:%M:%S')
|
date = dt.datetime.strptime(input_data.get('time'), '%Y-%m-%d %H:%M:%S')
|
||||||
r_NOx = float(input_data.get('NOx'))
|
r_NOx = float(input_data.get('nox'))
|
||||||
r_SO2 = float(input_data.get('SO2'))
|
r_SO2 = float(input_data.get('so2'))
|
||||||
r_smoke = float(input_data.get('smoke'))
|
r_smoke = float(input_data.get('smoke'))
|
||||||
flow = float(input_data.get('flow'))
|
flow = float(input_data.get('flow'))
|
||||||
c_NOx, c_SO2, c_smoke = flow * np.asarray([r_NOx, r_SO2, r_smoke])
|
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_SO2": np.log1p(float(c_SO2)),
|
||||||
"0_c_smoke": np.log1p(float(c_smoke)),
|
"0_c_smoke": np.log1p(float(c_smoke)),
|
||||||
"0_flow": np.log1p(float(flow)),
|
"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"))),
|
"0_temp": np.log1p(float(input_data.get("temp"))),
|
||||||
"额定蒸发量_t/h": np.log1p(float(input_data.get("evaporation"))),
|
"额定蒸发量_t/h": np.log1p(float(input_data.get("evaporation"))),
|
||||||
"低位发热量": np.log1p(caloric),
|
"低位发热量": 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 = pd.get_dummies(total_data, columns=object_cols)
|
||||||
new_inputs = new_inputs[feature_names].iloc[-1].values
|
new_inputs = new_inputs[feature_names].iloc[-1].values
|
||||||
coal_cost = np.expm1(model.predict([new_inputs])[0])
|
coal_cost = np.expm1(model.predict([new_inputs])[0])
|
||||||
co = cal_coal_cost_emission(coal_cost, input_data.get('boiler'), emission_factors.get('CO'))
|
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'))
|
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'))
|
pm25 = cal_PM(c_smoke, input_data.get('boiler'), emission_factors.get('pm25'))
|
||||||
pm10 = cal_PM(r_smoke, input_data.get('boiler'), emission_factors.get('PM10'))
|
pm10 = cal_PM(c_smoke, input_data.get('boiler'), emission_factors.get('pm10'))
|
||||||
co2 = cal_CO2(coal_cost, caloric)
|
co2 = cal_CO2(coal_cost, caloric)
|
||||||
return {'coal': coal_cost, 'co':co, 'vocs':vocs, 'pm25':pm25, 'pm10':pm10, 'co2':co2}
|
return {'coal': coal_cost, 'co':co, 'vocs':vocs, 'pm25':pm25, 'pm10':pm10, 'co2':co2}
|
||||||
|
|
||||||
|
@ -93,11 +93,11 @@ if __name__ == '__main__':
|
||||||
"steam": "凝气式",
|
"steam": "凝气式",
|
||||||
"cold": "水冷-开式循环",
|
"cold": "水冷-开式循环",
|
||||||
"pressure": "超超临界",
|
"pressure": "超超临界",
|
||||||
"NOx": "12",
|
"nox": "12",
|
||||||
"SO2":"0.15",
|
"so2":"0.15",
|
||||||
"smoke":"12",
|
"smoke":"12",
|
||||||
"flow":"5000000",
|
"flow":"5000000",
|
||||||
"O2": "23",
|
"o2": "23",
|
||||||
"temp": "55",
|
"temp": "55",
|
||||||
"evaporation": "123",
|
"evaporation": "123",
|
||||||
"caloric": "23",
|
"caloric": "23",
|
||||||
|
|
17
run.py
17
run.py
|
@ -24,20 +24,25 @@ def run_case_check():
|
||||||
resp_info = dict()
|
resp_info = dict()
|
||||||
if request.method == "POST":
|
if request.method == "POST":
|
||||||
data = request.json.get('data')
|
data = request.json.get('data')
|
||||||
|
key = request.json.get('key')
|
||||||
|
resp_info['key'] = key
|
||||||
|
logger.info("request key: {key}")
|
||||||
logger.info(data)
|
logger.info(data)
|
||||||
if data is not None and len(data) != 0:
|
if data is not None and len(data) != 0:
|
||||||
rst = predict(history_data, data, lgb_model, object_cols, emission_factors)
|
try:
|
||||||
resp_info["code"] = 200
|
rst = predict(history_data, data, lgb_model, object_cols, emission_factors)
|
||||||
resp_info["data"] = rst
|
resp_info["code"] = 200
|
||||||
|
resp_info["data"] = rst
|
||||||
|
except Exception as e:
|
||||||
|
resp_info["code"] = 406
|
||||||
|
resp_info["data"] = str(e)
|
||||||
else:
|
else:
|
||||||
resp_info["msg"] = "Input is None, please check !"
|
resp_info["msg"] = "Input is None, please check!"
|
||||||
resp_info["code"] = 406
|
resp_info["code"] = 406
|
||||||
resp = make_response(json.dumps(resp_info))
|
resp = make_response(json.dumps(resp_info))
|
||||||
resp.status_code = 200
|
resp.status_code = 200
|
||||||
return resp
|
return resp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
app.run(host='0.0.0.0', port=8788, debug=False)
|
app.run(host='0.0.0.0', port=8788, debug=False)
|
||||||
|
|
Loading…
Reference in New Issue