# -*-coding:utf-8 -*- import lightgbm as lgb import numpy as np import pandas as pd import json import datetime as dt def load_history_data(data_path:str): data = pd.read_csv(data_path) return data def load_config(cfg_path:str): with open(cfg_path, 'r', encoding='utf-8') as fr: config = json.load(fr) return config def load_lgb_model(model_path:str): return lgb.Booster(model_file=model_path) def cal_CO2(coal_cost, ncv): return coal_cost * ncv * 26.37e-3 * 0.94 * 44 / 12 def cal_coal_cost_emission(coal_cost, boiler, emission_factors): factor = emission_factors.get(boiler) if factor is not None: return coal_cost * factor else: return emission_factors.get("default") * coal_cost def cal_PM(r_smoke, boiler, emission_factors): factor = emission_factors.get(boiler) if factor is not None: return r_smoke * factor else: return emission_factors.get("default") * r_smoke 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_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]) caloric = float(input_data.get("caloric")) if caloric > 1000: caloric = caloric / 1000 inputs = { "生产设备类型": input_data.get('boiler'), "汽轮机类型": input_data.get('steam'), "冷却方式": input_data.get('cold'), "压力参数": input_data.get('pressure'), "day_of_week": date.weekday(), "month": date.month, "hour": date.hour, "0_r_NOx":np.log1p(float(r_NOx)), "0_r_SO2":np.log1p(float(r_SO2)), "0_r_smoke":np.log1p(float(r_smoke)), "0_c_NOx": np.log1p(float(c_NOx)), "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_temp": np.log1p(float(input_data.get("temp"))), "额定蒸发量_t/h": np.log1p(float(input_data.get("evaporation"))), "低位发热量": np.log1p(caloric), "单机容量(MW)": np.log1p(float(input_data.get("capacity"))), "lon": np.log1p(float(input_data.get("lon"))), "lat": np.log1p(float(input_data.get("lat"))), } new_df = pd.DataFrame.from_dict(inputs, orient='index').T total_data = pd.concat([his_data, new_df]) 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')) co2 = cal_CO2(coal_cost, caloric) return {'coal': coal_cost, 'co':co, 'vocs':vocs, 'pm25':pm25, 'pm10':pm10, 'co2':co2} if __name__ == '__main__': history = load_history_data('../data/data_sample.csv') object_cols = load_config('../config/object_cols.json') model = load_lgb_model('../model_files/hour_best_model.txt') emission_factors = load_config('../config/emission_factor.json') inputs = { "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", } print(predict(history, inputs, model, object_cols, emission_factors))