T85_code/.ipynb_checkpoints/基于煤种标准化的数据建模及预测-checkpoint....

264 KiB
Raw Permalink Blame History

In [1]:
import pandas as pd
import numpy as np
import xgboost as xgb
import seaborn as sns
from sklearn.model_selection import train_test_split
In [2]:
data = pd.read_csv('./results/去煤种化数据.csv')
data.head()
Out[2]:
所处地区 机组类型 参数分类 冷凝器型式 铭牌容量 (MW) longitude latitude altitude power_co2_factor heat_co2_factor
0 上海市 供热式 亚临界 水冷 5.707110 4.807875 3.467769 1.386294 0.574332 0.072680
1 上海市 凝气式 亚临界 水冷 5.707110 4.807875 3.467769 1.386294 0.582164 0.072391
2 上海市 凝气式 亚临界 水冷 5.771441 4.808939 3.476886 1.098612 0.569281 0.071041
3 上海市 凝气式 超超临界 水冷 6.908755 4.807356 3.458373 1.609438 0.506250 0.070460
4 上海市 纯凝式 亚临界 水冷 5.860786 4.807839 3.478627 2.833213 0.565226 0.073717
In [3]:
object_cols = data.columns[:4].tolist()
num_cols = data.columns[4:8]
object_cols, num_cols
Out[3]:
(['所处地区', '机组类型', '参数分类', '冷凝器型式'],
 Index(['铭牌容量 (MW)', 'longitude', 'latitude', 'altitude'], dtype='object'))
In [4]:
test_data = pd.read_excel('./data/煤电机组情况(含企业名称).xlsx',)
In [5]:
test_geo_info = pd.read_excel('./data/电厂地理信息.xlsx')
test_geo_info.rename(columns={'name':'企业名称'}, inplace=True)
In [6]:
test_data = test_data.merge(test_geo_info, how='left', on='企业名称').drop(columns='address')
In [7]:
test_data_cp = test_data.copy()
test_data = test_data[['地区', '汽轮机类型', '压力参数', '冷却方式', '单机容量MW', 'lat', 'lng', 'altitude']].copy()
In [8]:
test_data.columns = data.columns[:8].tolist()
In [9]:
test_data['na_cols'] = test_data.isna().sum(axis=1).values
In [10]:
test_data[test_data.na_cols <= 1]['铭牌容量 (MW)'].sum() /10
Out[10]:
110838.446
In [11]:
new_test_data = test_data[test_data.na_cols <= 1].drop(columns='na_cols').reset_index(drop=True)
In [12]:
data['冷凝器型式'].value_counts()
Out[12]:
水冷    413
空冷    110
其他      1
Name: 冷凝器型式, dtype: int64
In [13]:
new_test_data['冷凝器型式'].value_counts()
Out[13]:
水冷-闭式循环    2125
其他         1076
水冷-开式循环     972
空冷-直接空冷     586
空冷-间接空冷     264
水冷           52
空冷           14
间接空冷          4
直接空冷          2
Name: 冷凝器型式, dtype: int64
In [14]:
def change_type(x:str):
    if '水冷' in x:
        return '水冷'
    elif '空冷' in x:
        return "空冷"
    else:
        return '其他'
In [15]:
new_test_data.fillna('其他', inplace=True)
In [16]:
new_test_data['冷凝器型式'] = new_test_data['冷凝器型式'].apply(change_type)
In [17]:
data['参数分类'].value_counts()
Out[17]:
亚临界     265
超临界     156
超超临界     69
超高压      32
高压        2
Name: 参数分类, dtype: int64
In [18]:
new_test_data['参数分类'].value_counts()
Out[18]:
高压      1538
亚临界     1075
中压      1069
超临界      608
超高压      447
超超临界     358
Name: 参数分类, dtype: int64
In [19]:
new_test_data['机组类型'] = new_test_data['机组类型'].apply(lambda x: x if x.endswith('式') else x + '式')
In [20]:
for col in num_cols:
    new_test_data[col] = new_test_data[col].apply(lambda x: 0 if x<0 else x)
    new_test_data[col] = np.log1p(new_test_data[col])
In [21]:
new_test_data
Out[21]:
所处地区 机组类型 参数分类 冷凝器型式 铭牌容量 (MW) longitude latitude altitude
0 安徽省 凝气式 亚临界 水冷 5.771441 3.451583 4.772094 2.397895
1 安徽省 凝气式 亚临界 水冷 5.771441 3.451583 4.772094 2.397895
2 安徽省 凝气式 超超临界 水冷 6.908755 3.451583 4.772094 2.397895
3 安徽省 凝气式 超超临界 水冷 6.908755 3.451583 4.772094 2.397895
4 安徽省 抽凝式 高压 水冷 3.713572 3.451583 4.772094 2.397895
... ... ... ... ... ... ... ... ...
5090 重庆市 抽凝式 高压 水冷 3.912023 3.427489 4.682353 5.645447
5091 重庆市 抽凝式 高压 水冷 3.258097 3.427666 4.682306 5.627621
5092 重庆市 抽背式 高压 水冷 3.258097 3.427666 4.682306 5.627621
5093 重庆市 背压式 高压 其他 3.433987 3.428715 4.682208 5.690359
5094 重庆市 抽凝式 高压 水冷 4.836282 3.428715 4.682208 5.690359

5095 rows × 8 columns

In [23]:
merge_data = pd.concat([data, new_test_data], axis=0)
merge_data
Out[23]:
所处地区 机组类型 参数分类 冷凝器型式 铭牌容量 (MW) longitude latitude altitude power_co2_factor heat_co2_factor
0 上海市 供热式 亚临界 水冷 5.707110 4.807875 3.467769 1.386294 0.574332 0.072680
1 上海市 凝气式 亚临界 水冷 5.707110 4.807875 3.467769 1.386294 0.582164 0.072391
2 上海市 凝气式 亚临界 水冷 5.771441 4.808939 3.476886 1.098612 0.569281 0.071041
3 上海市 凝气式 超超临界 水冷 6.908755 4.807356 3.458373 1.609438 0.506250 0.070460
4 上海市 纯凝式 亚临界 水冷 5.860786 4.807839 3.478627 2.833213 0.565226 0.073717
... ... ... ... ... ... ... ... ... ... ...
5090 重庆市 抽凝式 高压 水冷 3.912023 3.427489 4.682353 5.645447 NaN NaN
5091 重庆市 抽凝式 高压 水冷 3.258097 3.427666 4.682306 5.627621 NaN NaN
5092 重庆市 抽背式 高压 水冷 3.258097 3.427666 4.682306 5.627621 NaN NaN
5093 重庆市 背压式 高压 其他 3.433987 3.428715 4.682208 5.690359 NaN NaN
5094 重庆市 抽凝式 高压 水冷 4.836282 3.428715 4.682208 5.690359 NaN NaN

5619 rows × 10 columns

In [24]:
use_data = pd.get_dummies(merge_data, columns=object_cols)
use_data
Out[24]:
铭牌容量 (MW) longitude latitude altitude power_co2_factor heat_co2_factor 所处地区_上海市 所处地区_云南省 所处地区_内蒙古 所处地区_内蒙古自治区 ... 机组类型_背压式 参数分类_中压 参数分类_亚临界 参数分类_超临界 参数分类_超超临界 参数分类_超高压 参数分类_高压 冷凝器型式_其他 冷凝器型式_水冷 冷凝器型式_空冷
0 5.707110 4.807875 3.467769 1.386294 0.574332 0.072680 1 0 0 0 ... 0 0 1 0 0 0 0 0 1 0
1 5.707110 4.807875 3.467769 1.386294 0.582164 0.072391 1 0 0 0 ... 0 0 1 0 0 0 0 0 1 0
2 5.771441 4.808939 3.476886 1.098612 0.569281 0.071041 1 0 0 0 ... 0 0 1 0 0 0 0 0 1 0
3 6.908755 4.807356 3.458373 1.609438 0.506250 0.070460 1 0 0 0 ... 0 0 0 0 1 0 0 0 1 0
4 5.860786 4.807839 3.478627 2.833213 0.565226 0.073717 1 0 0 0 ... 0 0 1 0 0 0 0 0 1 0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
5090 3.912023 3.427489 4.682353 5.645447 NaN NaN 0 0 0 0 ... 0 0 0 0 0 0 1 0 1 0
5091 3.258097 3.427666 4.682306 5.627621 NaN NaN 0 0 0 0 ... 0 0 0 0 0 0 1 0 1 0
5092 3.258097 3.427666 4.682306 5.627621 NaN NaN 0 0 0 0 ... 0 0 0 0 0 0 1 0 1 0
5093 3.433987 3.428715 4.682208 5.690359 NaN NaN 0 0 0 0 ... 1 0 0 0 0 0 1 1 0 0
5094 4.836282 3.428715 4.682208 5.690359 NaN NaN 0 0 0 0 ... 0 0 0 0 0 0 1 0 1 0

5619 rows × 63 columns

In [25]:
use_data.to_csv('./去煤种化后的训练数据.csv', encoding='utf-8-sig', index=False)
In [27]:
train_set = use_data[~use_data.power_co2_factor.isna()].copy()
test_set = use_data[use_data.power_co2_factor.isna()].copy()
In [30]:
feature_cols = [x for x in train_set.columns if 'factor' not in x]
In [31]:
train_data = train_set.copy()
In [100]:
from sklearn.model_selection import train_test_split
In [102]:
train, valid = train_test_split(train_data.dropna(), test_size=0.1, shuffle=True, random_state=42)
In [ ]:
dtest = xgb.DMatrix(test_set[feature_cols])
In [124]:
params_xgb = {'objective': 'reg:squarederror',
              'booster': 'gbtree',
              'eta': 0.005,
              'max_depth': 15,
              'subsample': 0.9,
              'colsample_bytree': 0.9,
              'min_child_weight': 1,
              'seed': 42}

num_boost_round = 1200

dtrain = xgb.DMatrix(train[feature_cols], train['power_co2_factor'].values)
dvalid = xgb.DMatrix(valid[feature_cols], valid['power_co2_factor'].values)
watchlist = [(dtrain, 'train'), (dvalid, 'eval')]

gb_model_power = xgb.train(params_xgb, dtrain, num_boost_round, evals=watchlist,
                early_stopping_rounds=100, verbose_eval=False)
In [129]:
new_test_data['power_co2_factor'] = gb_model_power.predict(dtest)
In [130]:
new_test_data
Out[130]:
所处地区 机组类型 参数分类 冷凝器型式 铭牌容量 (MW) longitude latitude altitude prediction power_co2_factor
0 安徽省 凝气式 亚临界 水冷 5.771441 3.451583 4.772094 2.397895 0.563267 0.513529
1 安徽省 凝气式 亚临界 水冷 5.771441 3.451583 4.772094 2.397895 0.563267 0.513529
2 安徽省 凝气式 超超临界 水冷 6.908755 3.451583 4.772094 2.397895 0.558872 0.478943
3 安徽省 凝气式 超超临界 水冷 6.908755 3.451583 4.772094 2.397895 0.558872 0.478943
4 安徽省 抽凝式 高压 水冷 3.713572 3.451583 4.772094 2.397895 0.563501 0.510681
... ... ... ... ... ... ... ... ... ... ...
5090 重庆市 抽凝式 高压 水冷 3.912023 3.427489 4.682353 5.645447 0.562492 0.512501
5091 重庆市 抽凝式 高压 水冷 3.258097 3.427666 4.682306 5.627621 0.562492 0.512513
5092 重庆市 抽背式 高压 水冷 3.258097 3.427666 4.682306 5.627621 0.562597 0.514091
5093 重庆市 背压式 高压 其他 3.433987 3.428715 4.682208 5.690359 0.560515 0.509951
5094 重庆市 抽凝式 高压 水冷 4.836282 3.428715 4.682208 5.690359 0.561920 0.511886

5095 rows × 10 columns

In [127]:
params_xgb = {'objective': 'reg:squarederror',
              'booster': 'gbtree',
              'eta': 0.01,
              'max_depth': 30,
              'subsample': 0.8,
              'colsample_bytree': 0.9,
              'min_child_weight': 10,
              'seed': 108}

num_boost_round = 1200

dtrain = xgb.DMatrix(train[feature_cols], train['heat_co2_factor'].values)
dvalid = xgb.DMatrix(valid[feature_cols], valid['heat_co2_factor'].values)
watchlist = [(dtrain, 'train'), (dvalid, 'eval')]

gb_model_heat = xgb.train(params_xgb, dtrain, num_boost_round, evals=watchlist,
                early_stopping_rounds=100, verbose_eval=False)
In [128]:
new_test_data['heat_co2_factor'] = gb_model_heat.predict(dtest)
In [28]:
import seaborn as sns
import matplotlib.pyplot as plt
import datetime as dt

plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
In [29]:
plot_data = new_test_data[['地区', 'prediction']].copy()
plot_data['地区'] = plot_data['地区'].apply(lambda x: jieba.lcut(x.strip(), cut_all=True)[0] if not pd.isna(x) else pd.NA)
plot_data.columns = ['省份', 'CO2排放强度(kg/MJ)']
total_plot_data = pd.concat([plot_data, add_data])
In [30]:
total_plot_data['CO2排放强度(kg/MJ)'] = total_plot_data['CO2排放强度(kg/MJ)'].astype(float)
total_plot_data['省份'] = total_plot_data['省份'].apply(lambda x: x if x != '内蒙' else '内蒙古')
In [38]:
total_plot_data
Out[38]:
省份 CO2排放强度(kg/MJ)
0 安徽 0.224686
1 安徽 0.198733
2 安徽 0.198733
3 安徽 0.224686
4 安徽 0.224686
... ... ...
848 新疆 0.196452
849 辽宁 0.185688
850 内蒙古 0.181214
851 山东 0.347570
852 浙江 0.251777

3156 rows × 2 columns

In [31]:
plt.figure(figsize=(20, 10))
sns.violinplot(x='省份',
               y='CO2排放强度(kg/MJ)',
               data=total_plot_data,
               scale='width',
               palette='Set2',
               inner='quartile')

# Decoration
plt.title('各省(市、自治区)燃煤发电CO2排放强度预测', fontsize=18)
plt.savefig('./figure/各省预测值.png')
No description has been provided for this image
In [50]:
from pyecharts.charts import *
from pyecharts import options as opts
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType, ChartType
In [51]:
data = pd.read_excel('././././data/机组预测结果.xlsx', sheet_name=2)
In [70]:
data['prediction'].max()
Out[70]:
0.28918716
In [76]:
data.groupby('地区')['prediction'].mean().sort_values()
Out[76]:
地区
海南省         0.232931
贵州省         0.234717
广东省         0.236436
上海市         0.237024
甘肃省         0.238403
湖北省         0.241863
福建省         0.242241
湖南省         0.243759
宁夏回族自治区     0.245063
云南省         0.245078
山西省         0.245322
新疆维吾尔自治区    0.246324
安徽省         0.246587
河南省         0.246775
陕西省         0.248594
天津市         0.248690
内蒙古自治区      0.250336
江西省         0.250423
广西壮族自治区     0.251057
河北省         0.251093
重庆市         0.254725
辽宁省         0.258904
四川省         0.259836
江苏省         0.261171
吉林省         0.263193
青海省         0.265025
山东省         0.265427
浙江省         0.269908
黑龙江省        0.272978
Name: prediction, dtype: float64
In [55]:
map_dict = data.groupby('地区')['机组容量'].mean().to_dict()
In [56]:
map_dict
Out[56]:
{'上海市': 379.20512820512783,
 '云南省': 278.30434782608654,
 '内蒙古自治区': 230.6120649651969,
 '吉林省': 135.31451612903209,
 '四川省': 185.37333333333314,
 '天津市': 253.24468085106344,
 '宁夏回族自治区': 279.0265486725658,
 '安徽省': 316.693939393939,
 '山东省': 125.49526066350698,
 '山西省': 263.3278985507243,
 '广东省': 387.3771428571424,
 '广西壮族自治区': 246.94999999999965,
 '新疆维吾尔自治区': 240.52545454545407,
 '江苏省': 198.3687817258881,
 '江西省': 270.88586956521675,
 '河北省': 225.52138248847896,
 '河南省': 286.94827586206867,
 '浙江省': 143.89827272727254,
 '海南省': 256.1538461538457,
 '湖北省': 315.7307692307689,
 '湖南省': 292.77333333333297,
 '甘肃省': 287.76923076923043,
 '福建省': 335.7640449438199,
 '贵州省': 359.5219780219774,
 '辽宁省': 176.5326203208554,
 '重庆市': 215.15079365079336,
 '陕西省': 260.96775862068927,
 '青海省': 122.01612903225785,
 '黑龙江省': 84.8353658536584}
In [57]:
from pyecharts.faker import Faker
In [63]:
map_co2 = map_dict = data.groupby('地区')['prediction'].mean().to_dict()
In [68]:
# 需要引用的库
from pyecharts import options as opts
from pyecharts.charts import Map

# 设置不同的系列,和系列中区域对应的数量值
pair_data1 = [[x, float(y)] for x, y in zip(map_co2.keys(), map_co2.values())]

def create_map():
    '''
     作用:生成地图
    '''
    (  # 大小设置
        Map()
        .add(
            series_name="各地区机组平均碳排放强度",
            data_pair=[[x[0], x[1]*1000] for x in pair_data1],
            maptype="china"
        )

        # 全局配置项
        .set_global_opts(
            # 设置标题
            title_opts=opts.TitleOpts(title="各地区机组平均碳排放强度(单位g/MJ)", subtitle='港、澳、台、西藏数据暂缺'),
            # 设置标准显示
            visualmap_opts=opts.VisualMapOpts(max_=220, min_=280, is_piecewise=False)
        )
        # 系列配置项
        .set_series_opts(
            # 标签名称显示默认为True
            label_opts=opts.LabelOpts(is_show=True, color="blue")
        )
        # 生成本地html文件
        .render("co2.html")
    )


create_map()
In [68]:
 
In [ ]: