2023“SEED”第四届江苏大数据开发与应用大赛--新能源赛道学习与思考(1)

2023“SEED”第四届江苏大数据开发与应用大赛--新能源赛道:

MARS开发者生态社区

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

第三步就是数据清洗过程,简单来说就是处理异常值,缺失值,重复值。

具体包括:

缺失值处理:检测数据中的缺失值。可以选择删除缺失值所在的行或列,或者使用插补方法填充缺失值,如均值、中位数、众数或基于模型的插补方法。

异常值处理:识别和处理数据集中的异常值。可以使用统计方法、可视化探索或基于模型的方法来检测异常值,可以删除异常值或使用合适的替代值进行填充。

重复值处理:检测并删除数据集中的重复记录,以确保数据的唯一性。

除此之外,还有:

数据格式化:转换日期时间格式、数值格式、字符串格式等,以符合分析和建模的要求。

数据类型转换:将数据转换为适当的数据类型。例如,将字符串转换为数值型、将分类变量转换为独热编码等。

处理不一致性:检测和处理数据中的不一致性,例如不同的拼写、大小写、单位等。可通过标准化、规范化或使用文本处理技术来解决这些问题。

数据整合和重塑:如果有多个数据源或数据表,可能需要将它们整合在一起,并进行适当的重塑和合并操作,以便进行后续的分析和建模。

第四步是数据预处理(应该包括特征工程),将原始数据转换为适合机器学习算法的形式。它的目标是提取和构造有用的特征,并减少噪声和冗余信息。

特征选择:选择最相关或最具信息量的特征,以减少数据的维度并提高模型性能。

特征提取:从原始数据中提取新的特征,以捕捉数据中的有用信息。例如,可以通过计算统计特征、使用文本处理技术提取关键词等方法来生成新的特征。

特征变换:对特征进行变换,例如将非数值特征转换为数值特征,或者进行特征缩放和归一化。

数据集划分:将数据集划分为训练集、验证集和测试集,以便进行模型的训练、调优和评估。

 其他的稍后更新

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
大学生参加学科竞赛有着诸多好处,不仅有助于个人综合素质的提升,还能为未来职业发展奠定良好基础。以下是一些分析: 首先,学科竞赛是提高专业知识和技能水平的有效途径。通过参与竞赛,学生不仅能够深入学习相关专业知识,还能够接触到最新的科研成果和技术发展趋势。这有助于拓展学生的学科视野,使其对专业领域有更深刻的理解。在竞赛过程中,学生通常需要解决实际问题,这锻炼了他们独立思考和解决问题的能力。 其次,学科竞赛培养了学生的团队合作精神。许多竞赛项目需要团队协作来完成,这促使学生学会有效地与他人合作、协调分工。在团队合作中,学生们能够学到如何有效沟通、共同制定目标和分工合作,这对于日后进入职场具有重要意义。 此外,学科竞赛是提高学生综合能力的一种途径。竞赛项目通常会涉及到理论知识、实际操作和创新思维等多个方面,要求参赛者具备全面的素质。在竞赛过程中,学生不仅需要展现自己的专业知识,还需要具备创新意识和解决问题的能力。这种全面的综合能力培养对于未来从事各类职业都具有积极作用。 此外,学科竞赛可以为学生提供展示自我、树立信心的机会。通过比赛的舞台,学生有机会展现自己在专业领域的优势,得到他人的认可和赞誉。这对于培养学生的自信心和自我价值感非常重要,有助于他们更加积极主动地投入学习和未来的职业生涯。 最后,学科竞赛对于个人职业发展具有积极的助推作用。在竞赛中脱颖而出的学生通常能够引起企业、研究机构等用人单位的关注。获得竞赛奖项不仅可以作为个人履历的亮点,还可以为进入理想的工作岗位提供有力的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值