264 KiB
264 KiB
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')
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 [ ]: