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,
|
||||
"自动炉排层燃炉": 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,
|
||||
|
|
Binary file not shown.
|
@ -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
11
run.py
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue