emission_detect_ai/各个机组特征工程.ipynb

51 KiB
Raw Blame History

In [1]:
import pandas as pd
import numpy as np
In [2]:
daily_data = pd.read_excel('data/电厂日数据.xlsx', sheet_name=None)
daily_data.keys()
Out[2]:
dict_keys(['浙江秀舟', '武乡西山', '邯郸东郊', '建投遵化'])
In [3]:
zjxz_daily = daily_data.get('浙江秀舟')
wxxs_daily = daily_data.get('武乡西山')
hddj_daily = daily_data.get('邯郸东郊')
jtzh_daily = daily_data.get('建投遵化')
In [4]:
zjxz_daily['发电量(万千瓦时)'] = zjxz_daily['发电量(千瓦时)'] / 10000
zjxz_daily.head()
Out[4]:
days 发电量(千瓦时) 供热量(吉焦) 燃料消耗量(吨) 流量 m3/h 氮氧化物浓度(mg/m3) 含氧量(% 温度(℃) 二氧化硫浓度(mg/m3) 烟尘浓度(mg/m3) 发电量(万千瓦时)
0 2018-10-01 156796.0 6536.83 323 162345.192917 24.515087 9.900000 51.250000 4.721475 0.176932 15.6796
1 2018-10-02 133984.0 2484.64 218 140175.330833 18.829456 9.400000 50.679167 3.698115 0.161356 13.3984
2 2018-10-03 134023.0 3020.83 212 154686.184167 20.891797 8.550000 52.808333 6.381178 0.117507 13.4023
3 2018-10-04 124765.0 5599.23 223 120345.545833 18.641687 10.202083 48.854167 2.393757 0.761287 12.4765
4 2018-10-05 134414.0 4702.65 243 162533.103542 22.031219 11.497917 45.783333 0.338422 1.842860 13.4414
In [5]:
zjxz_daily.rename(columns={'流量 m3/h': 'flow', '温度(℃)': 'temperature', '含氧量(%': 'r_O2'}, inplace=True)
zjxz_daily['c_smoke'] = zjxz_daily['flow'] * zjxz_daily['烟尘浓度(mg/m3)']
zjxz_daily['c_NO2'] = zjxz_daily['flow'] * zjxz_daily['氮氧化物浓度(mg/m3)']
zjxz_daily['c_SO2'] = zjxz_daily['flow'] * zjxz_daily['二氧化硫浓度(mg/m3)']
zjxz_daily['企业名称'] = '浙江秀舟热电有限公司'
In [6]:
zjxz_daily_final = zjxz_daily[
    ['days', '企业名称', 'r_O2', 'temperature', '发电量(万千瓦时)', '供热量(吉焦)', 'c_smoke', 'c_NO2', 'c_SO2', 'flow', '燃料消耗量(吨)']].copy()
In [7]:
wxxs_daily.rename(columns={'Unnamed: 0': 'days'}, inplace=True)
In [8]:
num_cols = [x for x in wxxs_daily.columns if x not in ['days', '企业名称', '机组1_状态', '机组2_状态']]
In [9]:
wxxs_daily.dropna(inplace=True)
wxxs_daily = wxxs_daily[~((wxxs_daily['机组1_状态'] == '停运') & (wxxs_daily['机组2_状态'] == '停运'))].copy()
wxxs_daily.shape
Out[9]:
(112, 23)
In [10]:
wxxs_daily.columns
Out[10]:
Index(['days', '发电量_1万千瓦时', '供热量_1吉焦', '燃料消耗量_1', '发电量_2万千瓦时',
       '供热量_2吉焦', '燃料消耗量_2', '企业名称', '发电量(万千瓦时)', '供热量(吉焦)', '燃料消耗量(吨)',
       '机组1_二氧化硫浓度(mg/m3)', '机组1_氮氧化物浓度(mg/m3)', '机组1_烟尘浓度(mg/m3)',
       '机组1_流速(m/s)', '机组1_流量(m3/h)', '机组1_状态', '机组2_二氧化硫浓度(mg/m3)',
       '机组2_氮氧化物浓度(mg/m3)', '机组2_烟尘浓度(mg/m3)', '机组2_流速(m/s)', '机组2_流量(m3/h)',
       '机组2_状态'],
      dtype='object')
In [11]:
wxxs_unit_1 = wxxs_daily[['days', '企业名称']].copy()
wxxs_unit_2 = wxxs_daily[['days', '企业名称']].copy()
In [12]:
wxxs_unit_1['c_smoke'] = wxxs_daily['机组1_流量(m3/h)'] * wxxs_daily['机组1_烟尘浓度(mg/m3)']
wxxs_unit_1['c_NO2'] =  wxxs_daily['机组1_流量(m3/h)'] * wxxs_daily['机组1_氮氧化物浓度(mg/m3)']
wxxs_unit_1['c_SO2'] =  wxxs_daily['机组1_流量(m3/h)'] * wxxs_daily['机组1_二氧化硫浓度(mg/m3)']
wxxs_unit_1['flow'] = wxxs_daily['机组1_流量(m3/h)']
wxxs_unit_1['r_O2'] = np.nan
wxxs_unit_1['temperature'] = np.nan
wxxs_unit_1['发电量(万千瓦时)'] = wxxs_daily['发电量_1万千瓦时']
wxxs_unit_1['供热量(吉焦)'] = wxxs_daily['供热量_1吉焦']
wxxs_unit_1['燃料消耗量(吨)'] = wxxs_daily['燃料消耗量_1']

wxxs_unit_2['c_smoke'] = wxxs_daily['机组2_流量(m3/h)'] * wxxs_daily['机组2_烟尘浓度(mg/m3)']
wxxs_unit_2['c_NO2'] =  wxxs_daily['机组2_流量(m3/h)'] * wxxs_daily['机组2_氮氧化物浓度(mg/m3)']
wxxs_unit_2['c_SO2'] =  wxxs_daily['机组2_流量(m3/h)'] * wxxs_daily['机组2_二氧化硫浓度(mg/m3)']
wxxs_unit_2['flow'] = wxxs_daily['机组2_流量(m3/h)']
wxxs_unit_2['r_O2'] = np.nan
wxxs_unit_2['temperature'] = np.nan
wxxs_unit_2['发电量(万千瓦时)'] = wxxs_daily['发电量_2万千瓦时']
wxxs_unit_2['供热量(吉焦)'] = wxxs_daily['供热量_2吉焦']
wxxs_unit_2['燃料消耗量(吨)'] = wxxs_daily['燃料消耗量_2']
In [13]:
wxxs_daily_final = pd.concat([wxxs_unit_1, wxxs_unit_2], axis=0)
In [14]:
hddj_daily.rename(columns={'Unnamed: 0': 'days'}, inplace=True)
hddj_daily.shape
Out[14]:
(59, 28)
In [15]:
hddj_daily.columns
Out[15]:
Index(['days', '发电量_1万千瓦时', '供热量_1吉焦', '燃料消耗量_1', '发电量_2万千瓦时',
       '供热量_2吉焦', '燃料消耗量_2', '企业名称', '机组1_流量 m3/h', '机组1_NOx浓度(mg/m3)',
       '机组1_SO2浓度(mg/m3)', '机组1_烟尘浓度(mg/m3)', '机组1_含氧量%', '机组1_温度',
       '机组1_烟气湿度%', '机组1_烟气压力千帕', '机组1_烟气流速m/s', '机组1_状态',
       '机组2_流量 m3/h', '机组2_NOx浓度(mg/m3)', '机组2_SO2浓度(mg/m3)',
       '机组2_烟尘浓度(mg/m3)', '机组2_含氧量%', '机组2_温度', '机组2_烟气湿度%',
       '机组2_烟气压力千帕', '机组2_烟气流速m/s', '机组2_状态'],
      dtype='object')
In [16]:
hddj_unit_1 = hddj_daily[['days', '企业名称']].copy()
hddj_unit_2 = hddj_daily[['days', '企业名称']].copy()
In [17]:
hddj_unit_1['c_smoke'] = hddj_daily['机组1_流量 m3/h'] * hddj_daily['机组1_烟尘浓度(mg/m3)']
hddj_unit_1['c_NO2'] = hddj_daily['机组1_流量 m3/h'] * hddj_daily['机组1_NOx浓度(mg/m3)']
hddj_unit_1['c_SO2'] = hddj_daily['机组1_流量 m3/h'] * hddj_daily['机组1_SO2浓度(mg/m3)']
hddj_unit_1['flow'] = hddj_daily['机组1_流量 m3/h']
hddj_unit_1['r_O2'] = hddj_daily['机组1_含氧量%']
hddj_unit_1['发电量(万千瓦时)'] = hddj_daily['发电量_1万千瓦时']
hddj_unit_1['供热量(吉焦)'] = hddj_daily['供热量_1吉焦']
hddj_unit_1['temperature'] = hddj_daily['机组1_温度']
hddj_unit_1['燃料消耗量(吨)'] = hddj_daily['燃料消耗量_1']

hddj_unit_2['c_smoke'] = hddj_daily['机组2_流量 m3/h'] * hddj_daily['机组2_烟尘浓度(mg/m3)']
hddj_unit_2['c_NO2'] = hddj_daily['机组2_流量 m3/h'] * hddj_daily['机组2_NOx浓度(mg/m3)']
hddj_unit_2['c_SO2'] = hddj_daily['机组2_流量 m3/h'] * hddj_daily['机组2_SO2浓度(mg/m3)']
hddj_unit_2['flow'] = hddj_daily['机组2_流量 m3/h']
hddj_unit_2['r_O2'] = hddj_daily['机组2_含氧量%']
hddj_unit_2['发电量(万千瓦时)'] = hddj_daily['发电量_2万千瓦时']
hddj_unit_2['供热量(吉焦)'] = hddj_daily['供热量_2吉焦']
hddj_unit_2['temperature'] = hddj_daily['机组2_温度']
hddj_unit_2['燃料消耗量(吨)'] = hddj_daily['燃料消耗量_2']
In [18]:
hddj_daily_final = pd.concat([hddj_unit_1, hddj_unit_2], axis=0)
In [19]:
jtzh_daily.rename(columns={'Unnamed: 0': 'days'}, inplace=True)
jtzh_daily['机组1_状态'] = (jtzh_daily['机组1_状态'] == '正常运行') * 1
jtzh_daily['机组2_状态'] = (jtzh_daily['机组2_状态'] == '正常运行') * 1
jtzh_daily.shape
Out[19]:
(31, 26)
In [20]:
jtzh_daily.columns
Out[20]:
Index(['days', '发电量_1万千瓦时', '供热量_1吉焦', '燃料消耗量_1', '发电量_2万千瓦时',
       '供热量_2吉焦', '燃料消耗量_2', '企业名称', '机组1_流量 m3/h', '机组1_NOx浓度(mg/m3)',
       '机组1_SO2浓度(mg/m3)', '机组1_烟尘浓度(mg/m3)', '机组1_含氧量%', '机组1_温度',
       '机组1_烟气湿度%', '机组1_烟气流速m/s', '机组1_状态', '机组2_流量 m3/h',
       '机组2_NOx浓度(mg/m3)', '机组2_SO2浓度(mg/m3)', '机组2_烟尘浓度(mg/m3)', '机组2_含氧量%',
       '机组2_温度', '机组2_烟气湿度%', '机组2_烟气流速m/s', '机组2_状态'],
      dtype='object')
In [21]:
jtzh_unit_1 = jtzh_daily[['days', '企业名称']].copy()
jtzh_unit_2 = jtzh_daily[['days', '企业名称']].copy()
In [22]:
jtzh_unit_1['c_smoke'] = jtzh_daily['机组1_流量 m3/h'] * jtzh_daily['机组1_烟尘浓度(mg/m3)']
jtzh_unit_1['c_NO2'] = jtzh_daily['机组1_流量 m3/h'] * jtzh_daily['机组1_NOx浓度(mg/m3)']
jtzh_unit_1['c_SO2'] = jtzh_daily['机组1_流量 m3/h'] * jtzh_daily['机组1_SO2浓度(mg/m3)']
jtzh_unit_1['flow'] = jtzh_daily['机组1_流量 m3/h']
jtzh_unit_1['r_O2'] = jtzh_daily['机组1_含氧量%']
jtzh_unit_1['temperature'] = jtzh_daily['机组1_温度']
jtzh_unit_1['发电量(万千瓦时)'] = jtzh_daily['发电量_2万千瓦时']
jtzh_unit_1['供热量(吉焦)'] = jtzh_daily['供热量_2吉焦']
jtzh_unit_1['燃料消耗量(吨)'] = jtzh_daily['燃料消耗量_1']

jtzh_unit_2['c_smoke'] = jtzh_daily['机组2_流量 m3/h'] * jtzh_daily['机组2_烟尘浓度(mg/m3)']
jtzh_unit_2['c_NO2'] = jtzh_daily['机组2_流量 m3/h'] * jtzh_daily['机组2_NOx浓度(mg/m3)']
jtzh_unit_2['c_SO2'] = jtzh_daily['机组2_流量 m3/h'] * jtzh_daily['机组2_SO2浓度(mg/m3)']
jtzh_unit_2['flow'] = jtzh_daily['机组2_流量 m3/h']
jtzh_unit_2['r_O2'] = jtzh_daily['机组2_含氧量%']
jtzh_unit_2['temperature'] = jtzh_daily['机组2_温度']
jtzh_unit_2['发电量(万千瓦时)'] = jtzh_daily['发电量_2万千瓦时']
jtzh_unit_2['供热量(吉焦)'] = jtzh_daily['供热量_2吉焦']
jtzh_unit_2['燃料消耗量(吨)'] = jtzh_daily['燃料消耗量_2']
In [23]:
jtzh_daily_final = pd.concat([jtzh_unit_1, jtzh_unit_2], axis=0)
jtzh_daily_final
Out[23]:
days 企业名称 c_smoke c_NO2 c_SO2 flow r_O2 temperature 发电量(万千瓦时) 供热量(吉焦) 燃料消耗量(吨)
0 2022-05-01 建投遵化热电有限责任公司 1.467475e+06 1.063321e+07 1.055453e+07 820965 7.795833 52.320833 0.000 0 1889
1 2022-05-02 建投遵化热电有限责任公司 1.558803e+06 1.328556e+07 1.074905e+07 907380 7.295833 53.145833 0.000 0 2622
2 2022-05-03 建投遵化热电有限责任公司 1.427659e+06 1.111851e+07 9.591219e+06 771360 7.650000 51.841667 0.000 0 2233
3 2022-05-04 建投遵化热电有限责任公司 1.499975e+06 1.164537e+07 1.007516e+07 780390 7.462500 51.808333 0.000 0 2203
4 2022-05-05 建投遵化热电有限责任公司 1.724199e+06 1.227060e+07 1.193453e+07 870075 7.195833 52.354167 0.000 0 2524
... ... ... ... ... ... ... ... ... ... ... ...
26 2022-05-27 建投遵化热电有限责任公司 1.020390e+06 1.173919e+07 1.101318e+07 836100 6.329167 44.741667 467.106 0 2401
27 2022-05-28 建投遵化热电有限责任公司 1.169393e+06 1.393048e+07 1.335698e+07 895515 6.183333 45.587500 504.900 0 2611
28 2022-05-29 建投遵化热电有限责任公司 1.124243e+06 1.267043e+07 1.129934e+07 837945 6.425000 45.545833 462.822 0 2846
29 2022-05-30 建投遵化热电有限责任公司 1.296293e+06 1.442430e+07 1.434195e+07 915030 6.162500 45.175000 528.960 0 2981
30 2022-05-31 建投遵化热电有限责任公司 1.554891e+06 1.758048e+07 1.593381e+07 992220 5.570833 46.100000 672.180 0 3560

62 rows × 11 columns

In [24]:
all_daily_data = pd.concat([zjxz_daily_final, wxxs_daily_final, hddj_daily_final, jtzh_daily_final])
In [25]:
unit_features = pd.read_excel('data/电厂特征表.xlsx', header=None).T
In [26]:
unit_features = unit_features.rename(columns=unit_features.iloc[0]).drop(unit_features.index[0])
unit_features.head()
Out[26]:
企业名称 地址 省份 经度 纬度 烟囱高度m 脱硝工艺 脱硝剂名称 脱硝设备数量 脱硫工艺 ... 发电机组1_单机容量MW 发电机组1_投产日期 发电机组1_汽轮机类型 发电机组1_压力参数 发电机组1_冷却方式 发电机组2_单机容量MW 发电机组2_投产日期 发电机组2_汽轮机类型 发电机组2_压力参数 发电机组2_冷却方式
1 浙江秀舟热电有限公司 嘉兴市南湖区凤桥镇 浙江省 120°515.54″ 30°3914.76″ 80 SNCR SCR 氨水 3 石灰石-石膏湿法 ... 15 2014-07-01 00:00:00 背压式 高压 水冷-闭式循环 15 2018-08-01 00:00:00 抽背式 高压 水冷-闭式循环
2 武乡西山发电有限责任公司 山西省武乡县丰州镇下城村 山西省 112°5111″ 36°500″ 240 SCR 尿素 2 石灰石--石膏湿法 ... 600 2006-10-07 00:00:00 抽凝式 亚临界 空冷-直接空冷 600 2007-01-07 00:00:00 抽凝式 亚临界 空冷-直接空冷
3 国电电力邯郸东郊热电有限责任公司 河北肥乡经济开发区光明西路11号 河北省 114°39'0" 36°34'0" NaN 采用高效低氮燃烧器SCR NaN NaN 石灰石-石膏湿法 ... 350 2019-06-08 00:00:00 抽凝式 超超临界 水冷-闭式循环 350 2019-06-08 00:00:00 抽凝式 超超临界 水冷-闭式循环
4 建投遵化热电有限责任公司 河北省遵化市新店子镇程庄子村 河北省 117°58'40" 40°4'33" NaN 采用高效低氮燃烧器SCR NaN NaN 石灰石-石膏湿法 ... 350 2019-07-09 00:00:00 抽凝式 超临界 水冷-闭式循环 350 2020-05-02 00:00:00 抽凝式 超临界 水冷-闭式循环

4 rows × 33 columns

In [27]:
unit_features.to_excel('data/机组特征表.xlsx')
In [28]:
unit_features_used = unit_features[['企业名称', '生产设备类型', '燃料类型', '低位发热量GJ/t']].copy()
unit_features_used['汽轮机类型'] = unit_features['发电机组1_汽轮机类型']
unit_features_used['冷却方式'] = unit_features['发电机组1_冷却方式']
unit_features_used['额定蒸发量'] = unit_features['锅炉1额定蒸发量 t/h'] + unit_features['锅炉2额定蒸发量 t/h']
unit_features_used['压力参数'] = unit_features['发电机组1_压力参数']
unit_features_used['单机容量'] = unit_features['发电机组1_单机容量MW'] + unit_features['发电机组2_单机容量MW']
In [29]:
for i in range(2, 5):
    unit_features_used.loc[i, '额定蒸发量'] = unit_features_used.loc[i, '额定蒸发量'] / 2
    unit_features_used.loc[i, '单机容量'] = unit_features_used.loc[i, '单机容量'] / 2
In [30]:
unit_features_used
Out[30]:
企业名称 生产设备类型 燃料类型 低位发热量GJ/t 汽轮机类型 冷却方式 额定蒸发量 压力参数 单机容量
1 浙江秀舟热电有限公司 高温高压循环流化床锅炉 中高挥发分烟煤 20.501 背压式 水冷-闭式循环 230 高压 30
2 武乡西山发电有限责任公司 煤粉锅炉 褐煤 18.643 抽凝式 空冷-直接空冷 2080.0 亚临界 600.0
3 国电电力邯郸东郊热电有限责任公司 煤粉锅炉 低挥发分烟煤 19.087 抽凝式 水冷-闭式循环 1125.0 超超临界 350.0
4 建投遵化热电有限责任公司 煤粉锅炉 一般烟煤 14.682 抽凝式 水冷-闭式循环 1172.0 超临界 350.0
In [31]:
final_data = all_daily_data.merge(unit_features_used, how='left', on='企业名称')
In [32]:
import datetime as dt
In [33]:
def cal_timedelta(x):
    date = dt.datetime.strptime(x, '%Y-%m-%d')
    date = dt.date(date.year, date.month, date.day)
    start_date = dt.date(date.year, 1, 1)
    time_delta = (date - start_date).days
    return time_delta
In [34]:
final_data['day_of_year'] = final_data.days.apply(cal_timedelta)
In [35]:
final_data['week_of_year'] = final_data['day_of_year'] // 7
In [36]:
final_data
Out[36]:
days 企业名称 r_O2 temperature 发电量(万千瓦时) 供热量(吉焦) c_smoke c_NO2 c_SO2 flow ... 生产设备类型 燃料类型 低位发热量GJ/t 汽轮机类型 冷却方式 额定蒸发量 压力参数 单机容量 day_of_year week_of_year
0 2018-10-01 浙江秀舟热电有限公司 9.900000 51.250000 15.6796 6536.83 2.872405e+04 3.979907e+06 7.665088e+05 162345.192917 ... 高温高压循环流化床锅炉 中高挥发分烟煤 20.501 背压式 水冷-闭式循环 230 高压 30 273 39
1 2018-10-02 浙江秀舟热电有限公司 9.400000 50.679167 13.3984 2484.64 2.261807e+04 2.639425e+06 5.183845e+05 140175.330833 ... 高温高压循环流化床锅炉 中高挥发分烟煤 20.501 背压式 水冷-闭式循环 230 高压 30 274 39
2 2018-10-03 浙江秀舟热电有限公司 8.550000 52.808333 13.4023 3020.83 1.817677e+04 3.231672e+06 9.870800e+05 154686.184167 ... 高温高压循环流化床锅炉 中高挥发分烟煤 20.501 背压式 水冷-闭式循环 230 高压 30 275 39
3 2018-10-04 浙江秀舟热电有限公司 10.202083 48.854167 12.4765 5599.23 9.161746e+04 2.243444e+06 2.880779e+05 120345.545833 ... 高温高压循环流化床锅炉 中高挥发分烟煤 20.501 背压式 水冷-闭式循环 230 高压 30 276 39
4 2018-10-05 浙江秀舟热电有限公司 11.497917 45.783333 13.4414 4702.65 2.995257e+05 3.580802e+06 5.500482e+04 162533.103542 ... 高温高压循环流化床锅炉 中高挥发分烟煤 20.501 背压式 水冷-闭式循环 230 高压 30 277 39
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1486 2022-05-27 建投遵化热电有限责任公司 6.329167 44.741667 467.1060 0.00 1.020390e+06 1.173919e+07 1.101318e+07 836100.000000 ... 煤粉锅炉 一般烟煤 14.682 抽凝式 水冷-闭式循环 1172.0 超临界 350.0 146 20
1487 2022-05-28 建投遵化热电有限责任公司 6.183333 45.587500 504.9000 0.00 1.169393e+06 1.393048e+07 1.335698e+07 895515.000000 ... 煤粉锅炉 一般烟煤 14.682 抽凝式 水冷-闭式循环 1172.0 超临界 350.0 147 21
1488 2022-05-29 建投遵化热电有限责任公司 6.425000 45.545833 462.8220 0.00 1.124243e+06 1.267043e+07 1.129934e+07 837945.000000 ... 煤粉锅炉 一般烟煤 14.682 抽凝式 水冷-闭式循环 1172.0 超临界 350.0 148 21
1489 2022-05-30 建投遵化热电有限责任公司 6.162500 45.175000 528.9600 0.00 1.296293e+06 1.442430e+07 1.434195e+07 915030.000000 ... 煤粉锅炉 一般烟煤 14.682 抽凝式 水冷-闭式循环 1172.0 超临界 350.0 149 21
1490 2022-05-31 建投遵化热电有限责任公司 5.570833 46.100000 672.1800 0.00 1.554891e+06 1.758048e+07 1.593381e+07 992220.000000 ... 煤粉锅炉 一般烟煤 14.682 抽凝式 水冷-闭式循环 1172.0 超临界 350.0 150 21

1491 rows × 21 columns

In [37]:
final_data.to_csv('data/unit_train_data.csv', encoding='utf-8-sig', index=False)
In [37]: