2023“SEED”第四届江苏大数据开发与应用大赛--新能源赛道:
AI +新能源:电动汽车充电站充电量预测
赛题背景
在电动汽车充电站运营管理中,准确预测充电站的电量需求对于提高充电站运营服务水平和优化区域电网供给能力非常关键。本次赛题旨在建立站点充电量预测模型,根据充电站的相关信息和历史电量数据,准确预测未来某段时间内充电站的充电量需求。
在赛题数据中,我们提供了电动汽车充电站的场站编号、位置信息、历史电量等基本信息。我们鼓励参赛选手在已有数据的基础上补充或构造额外的特征,以获得更好的预测性能。
赛事任务
参赛者需要基于这些数据,利用人工智能相关技术,建立预测模型来预测未来一段时间内的需求电量,帮助管理者提高充电站的运营效益和服务水平,促进电动汽车行业的整体发展。
赛题数据集
本赛题提供的数据集包含三张数据表。 其中,power_forecast_history.csv 为站点运营数据,power.csv为站点充电量数据,stub_info.csv为站点静态数据,训练集为历史一年的数据,测试集为未来一周的数据。 数据集清单与格式说明:
评价指标
我的学习与思考
Crisp-DM标准流程:
商业理解(行业)-> 数据理解(关系)-> 数据准备(质量)-> 建立模型(算法)-> 模型评估(标准)-> 发布模型
在开始整个流程前,先介绍一个很好用的库pandas-profiling
先演示下如何一行代码看数据大致分布:# 很简单的代码进行一个演示,可以在同一个文件路径下保存一个html文件,可以对数据有一个直观的认识和了解 import numpy as np import pandas as pd from ydata_profiling import ProfileReport train_power = pd.read_csv(r'C:\Users\86196\Desktop\初赛1008\训练集\power.csv') profile = ProfileReport(train_power, title="Profiling Report") profile.to_file('report.html')
包咋安装捏
1.首先打开Anaconda
2.输入 conda activate DL 进入虚拟环境
3.输入 pip install -U pandas-profiling[notebook,html] # 这样就可以在jupyter上使用啦
第一步是了解数据并且从行业角度对数据有一个很好的理解。
本赛题为例:家用车可能都有自己的充电桩,所以可以往网约车这边考虑,那么找到网约车出行数据可能会有帮助。
天气也是一个有影响的特征,气温变化和气温高低。3月17号有个峰值:寒潮,温度下降了十几度,电耗上升,充电效率下降。
和节假日也有关系吧,可以尝试获取节假日列表,注意调休。
可以通过百度api解析H3编码,结合api分成大城市小城市并加标签。按照城市耗电量大小画图,我们可以发现,节假日时大城市小城市的现象是相反的。
很重要的一点:去年数据参考性不大(疫情),直接删除掉。
第二步就是数据探索,时间序列预测问题更多的是观测历史数据的分布情况,从分布中分析是否存在周期性、趋势性、相关性和异常性。
# 导包 #import 相关库 import numpy as np import pandas as pd from ydata_profiling import ProfileReport import lightgbm as lgb from sklearn.model_selection import StratifiedKFold, KFold, GroupKFold from sklearn.metrics import mean_squared_error, mean_absolute_error import matplotlib.pyplot as plt import tqdm import sys import os import gc import argparse import warnings warnings.filterwarnings('ignore') # 数据准备 # 读取数据 train_power_forecast_history = pd.read_csv(r'C:\Users\86196\Desktop\初赛1008\训练集\power_forecast_history.csv') train_power = pd.read_csv(r'C:\Users\86196\Desktop\初赛1008\训练集\power.csv') train_stub_info = pd.read_csv(r'C:\Users\86196\Desktop\初赛1008\训练集\stub_info.csv') test_power_forecast_history = pd.read_csv(r'C:\Users\86196\Desktop\初赛1008\测试集\power_forecast_history.csv') test_stub_info = pd.read_csv(r'C:\Users\86196\Desktop\初赛1008\测试集\stub_info.csv') # 聚合数据 # 对train_power_forecast_history按照id_encode和ds进行分组,取每组的第一行数据,然后将结果赋值给train_df。 train_df = train_power_forecast_history.groupby(['id_encode','ds']).head(1) del train_df['hour'] test_df = test_power_forecast_history.groupby(['id_encode','ds']).head(1) del test_df['hour' #对train_power按照id_encode和ds进行分组,计算power列的总和,并将结果赋值给tmp_df。 tmp_df = train_power.groupby(['id_encode','ds'])['power'].sum() # 将tmp_df的列名修改为id_encode、ds和power。 tmp_df.columns = ['id_encode','ds','power'] # 合并充电量数据 # 将tmp_df与train_df按照id_encode和ds进行左连接,并将结果赋值给train_df,实现充电量数据的合并。 train_df = train_df.merge(tmp_df, on=['id_encode','ds'], how='left') ### 合并数据 train_df = train_df.merge(train_stub_info, on='id_encode', how='left') test_df = test_df.merge(test_stub_info, on='id_encode', how='left') # 数据探索 # 定义要绘制的列 cols = ['power'] # 遍历id_encode的五个值 for ie in [0,1,2,3,4]: # 获取train_df中id_encode为当前值ie的所有行,并重置索引 tmp_df = train_df[train_df['id_encode']==ie].reset_index(drop=True) # 再次重置索引,并为新索引添加一个名为'index'的列 tmp_df = tmp_df.reset_index(drop=True).reset_index() # 遍历要绘制的列 for num, col in enumerate(cols): # 设置图的大小 plt.figure(figsize=(20,10)) # 创建子图,总共有4行1列,当前为第num+1个子图 plt.subplot(4,1,num+1) # 绘制图形:x轴为'index',y轴为当前列的值 plt.plot(tmp_df['index'],tmp_df[col]) # 为当前子图设置标题,标题为当前列的名称 plt.title(col) # 显示图形 plt.show() # 创建一个新的图,大小为20x5 plt.figure(figsize=(20,5))
数据探索和了解数据是密不可分的,并且是交叉进行的。
部分代码解释:
在数据处理中,train_df通常表示一个经过预处理或清洗后的训练数据集,它通常是一个DataFrame对象,这是在Python的pandas库中常见的一种数据结构。
DataFrame用于存储和处理表格数据,可以包含多种类型的数据(例如文本、数字、日期等)并且每列数据的类型可以不同。
groupby(['id_encode','ds']): 这将根据id_encode和ds两个字段将train_power_forecast_history数据框进行分组。
每一组都包含具有相同id_encode和ds值的所有行。
.head(1): 这将每组中的数据取出来,但只取每组的第一行。也就是说,对于每个独特的id_encode和ds组合,只会得到它们对应的第一条记录。
df指的是Pandas常用数据结构dataframe
第三步就是数据清洗过程,简单来说就是处理异常值,缺失值,重复值。
具体包括:
缺失值处理:检测数据中的缺失值。可以选择删除缺失值所在的行或列,或者使用插补方法填充缺失值,如均值、中位数、众数或基于模型的插补方法。
异常值处理:识别和处理数据集中的异常值。可以使用统计方法、可视化探索或基于模型的方法来检测异常值,可以删除异常值或使用合适的替代值进行填充。
重复值处理:检测并删除数据集中的重复记录,以确保数据的唯一性。
除此之外,还有:
数据格式化:转换日期时间格式、数值格式、字符串格式等,以符合分析和建模的要求。
数据类型转换:将数据转换为适当的数据类型。例如,将字符串转换为数值型、将分类变量转换为独热编码等。
处理不一致性:检测和处理数据中的不一致性,例如不同的拼写、大小写、单位等。可通过标准化、规范化或使用文本处理技术来解决这些问题。
数据整合和重塑:如果有多个数据源或数据表,可能需要将它们整合在一起,并进行适当的重塑和合并操作,以便进行后续的分析和建模。
第四步是数据预处理(应该包括特征工程),将原始数据转换为适合机器学习算法的形式。它的目标是提取和构造有用的特征,并减少噪声和冗余信息。
特征选择:选择最相关或最具信息量的特征,以减少数据的维度并提高模型性能。
特征提取:从原始数据中提取新的特征,以捕捉数据中的有用信息。例如,可以通过计算统计特征、使用文本处理技术提取关键词等方法来生成新的特征。
特征变换:对特征进行变换,例如将非数值特征转换为数值特征,或者进行特征缩放和归一化。
数据集划分:将数据集划分为训练集、验证集和测试集,以便进行模型的训练、调优和评估。
其他的稍后更新