电动汽车充电站充电量预测_学习笔记(二)——特征优化

2023-12-19 04:50

本文主要是介绍电动汽车充电站充电量预测_学习笔记(二)——特征优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

赛题分析

        本次竞赛的目标是:根据2014.4.15~2015.4.14一年中,0~499总共500个场站的每日充电量数据,以及其他相关数据,预测接下来一周的各个场站的每日充电量。

        stub_info.csv在测试集和训练集中一致,记录了每个场站的地理、性能等信息。

        power.csv仅在训练集中出现,记录了2014.4.15~2015.4.14一年中,0~499总共500个场站的每日充电量数据。

        power_forecast_history.csv在测试集和训练集中不同,记录着各个场站每日24小时的收费情况等信息。

        由上文的数据探索容易发现:

  1. power_forecast_history.csv表中,同一场站中单日的各小时的数据基本相同,可以以场站编号和日期为组合标签,进行聚合排重;
  2. 日期信息在baseline基础上,还可挖掘出节假日特征;
  3. h3编码未被使用,有待解析,用于提取特征。

初步处理

# 数据格式处理
import pandas as pd# 设置数据集路径
path = r'E:\编程\电动汽车充电站充电量预测'# 读取数据
train_power_forecast_history = pd.read_csv(path + r'\训练集\power_forecast_history.csv')
test_power_forecast_history = pd.read_csv(path + r'\测试集\power_forecast_history.csv')
train_power = pd.read_csv(path + r'\训练集\power.csv')
stub_info = pd.read_csv(path + r'\训练集\stub_info.csv')# 聚合数据
'''head(1):1~24h数据重复,只取各场站第1小时,即每个分组第一行的数据'''
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']tmp_df = train_power.groupby(['id_encode', 'ds'])['power'].sum()
tmp_df.columns = ['id_encode', 'ds', 'power']# 合并充电量数据
train_df = train_df.merge(tmp_df, on=['id_encode', 'ds'], how='left')# 合并站点静态数据
train_df = train_df.merge(stub_info, on='id_encode', how='left')
test_df = test_df.merge(stub_info, on='id_encode', how='left')# 数据变换
train_df['flag'] = train_df['flag'].map({'A': 0, 'B': 1})
test_df['flag'] = test_df['flag'].map({'A': 0, 'B': 1})# 保存
train_df.to_csv(path + r'\process1\train_df1.csv', index=False)
test_df.to_csv(path + r'\process1\test_df1.csv', index=False)

时序特征

# 数据格式处理
import pandas as pd# 时间特征提取
import datetime# 设置数据集路径
path = r'E:\编程\电动汽车充电站充电量预测'# 读取数据
train_df = pd.read_csv(path + r'\process1\train_df1.csv')
test_df = pd.read_csv(path + r'\process1\test_df1.csv')# 获取节假日列表
def get_holiday_set():holiday_set = set()'''取并集,实现集合的多元素添加'''# 清明节holiday_set = holiday_set | {datetime.date(2023, 4, 5)}# 劳动节holiday_set = holiday_set | {datetime.date(2022, 4, 30), datetime.date(2022, 5, 1), datetime.date(2014, 5, 2),datetime.date(2022, 5, 3), datetime.date(2022, 5, 4)}# 端午节holiday_set = holiday_set | {datetime.date(2022, 6, 3), datetime.date(2022, 6, 4), datetime.date(2022, 6, 5)}# 中秋节holiday_set = holiday_set | {datetime.date(2022, 9, 10), datetime.date(2022, 9, 11), datetime.date(2022, 9, 12)}# 国庆节holiday_set = holiday_set | {datetime.date(2022, 10, 1), datetime.date(2022, 10, 2), datetime.date(2022, 10, 3),datetime.date(2022, 10, 4), datetime.date(2022, 10, 5), datetime.date(2022, 10, 6),datetime.date(2022, 10, 7)}# 元旦节holiday_set = holiday_set | {datetime.date(2022, 12, 31), datetime.date(2023, 1, 1), datetime.date(2023, 1, 2)}# 春节holiday_set = holiday_set | {datetime.date(2023, 1, 21), datetime.date(2023, 1, 22), datetime.date(2023, 1, 23),datetime.date(2023, 1, 24), datetime.date(2023, 1, 25), datetime.date(2023, 1, 26),datetime.date(2023, 1, 27)}return holiday_set# 定义提取时间戳的方法
def get_time_feature(df, col):# 浅拷贝原表,保护原数据df_copy = df.copy()# 统一格式:ds_prefix = col + "_"# 命名新字段,用于储存日期数据df_copy['new_' + col] = df_copy[col].astype(str)# 统一格式:new_dscol = 'new_' + col# 将MySQL类型日期数据转化为’年月日‘日期格式df_copy[col] = pd.to_datetime(df_copy[col], format='%Y%m%d')df_copy[prefix + 'year'] = df_copy[col].dt.year     # 从日期字段提取年特征df_copy[prefix + 'month'] = df_copy[col].dt.month   # 月df_copy[prefix + 'day'] = df_copy[col].dt.day       # 日# 星期:1=日,2=星期一,3=星期二,4=星期三,5=星期四,6=星期五,7=星期六df_copy[prefix + 'dayofweek'] = df_copy[col].dt.dayofweek# 周末判断:1=周末df_copy[prefix + 'is_wknd'] = df_copy[col].dt.dayofweek // 6# 季度:1~4df_copy[prefix + 'quarter'] = df_copy[col].dt.quarter# 月初判断:返回值为布尔值,再转化为int整数类型df_copy[prefix + 'is_month_start'] = df_copy[col].dt.is_month_start.astype(int)# 月末判断df_copy[prefix + 'is_month_end'] = df_copy[col].dt.is_month_end.astype(int)# 月中判断df_copy[prefix + 'is_month_mid'] = 0df_copy.loc[(10 < df_copy[prefix + 'day']) & (df_copy[prefix + 'day'] <= 20), prefix + 'is_month_mid'] = 1# 节假期判断df_copy[prefix + 'is_holiday'] = 0df_copy.loc[df_copy[col].isin(get_holiday_set()), prefix + 'is_holiday'] = 1del df_copy[col]return df_copy# 提取时间特征
train_df = get_time_feature(train_df, 'ds')
test_df = get_time_feature(test_df, 'ds')# 保存
train_df.to_csv(path + r'\process2\train_df2.csv', index=False)
test_df.to_csv(path + r'\process2\test_df2.csv', index=False)

地理特征

解码
# 数据格式处理
import pandas as pd# 向服务器发送并响应HTTP请求
import requests
import urllib# 加密或检验文件一致性
import hashlib# 解读H3编码
from h3 import h3# 绘制地图
import folium
from IPython.display import display# 设置数据集路径
path = r'E:\编程\电动汽车充电站充电量预测'# 读取数据
stub_info = pd.read_csv(path + r'\训练集\stub_info.csv')# 把H3编码转换成经纬度坐标
stub_info['center'] = stub_info['h3'].apply(lambda x: h3.h3_to_geo(x))# 定义地图绘制方法
def geo_map(df):# 拆分经纬度坐标df[['latitude', 'longitude']] = pd.DataFrame(df['center'].tolist(), columns=['latitude', 'longitude'])# 创建地图m = folium.Map(location=[df['latitude'].mean(), df['longitude'].mean()], zoom_start=10)# 添加标记点for index, row in df.iterrows():folium.Marker(location=[row['latitude'], row['longitude']],popup=row['id_encode']).add_to(m)# 显示地图return m# 绘制地图
si_m = geo_map(stub_info)
display(si_m)# 调取百度api获取经纬度对应地址信息
'''进入百度web服务api网站注册账号, 获取对应的 ak 跟 sk, 
网站指引https://lbsyun.baidu.com/faq/api?title=webapi'''# 建立访问函数
def get_city_frombd(row):# 服务地址host = "https://api.map.baidu.com"# 接口地址uri = "/reverse_geocoding/v3"# 在控制台-应用管理-创建应用后获取的AKak = "rYyvcdfmliu8GsrGoycIRdrSvO2gcMfy"# 在控制台-应用管理-创建应用时,校验方式选择sn校验后生成的SKsk = "MjFcjMs935IeZEU2xG5QAsIaOBXMEtwx"# 设置请求参数coordinate = str(row['latitude']) + ',' + str(row['longitude'])params = {"ak": ak,"output": "json","coordtype": "wgs84ll","extensions_poi": "0","location": coordinate,}# 拼接请求字符串paramsArr = []for key in params:paramsArr.append(key + "=" + params[key])queryStr = uri + "?" + "&".join(paramsArr)# 对queryStr进行转码,safe内的保留字符不转换encodedStr = urllib.request.quote(queryStr, safe="/:=&?#+!$,;'@()*[]")# 在最后直接追加上SKrawStr = encodedStr + sk# 计算snsn = hashlib.md5(urllib.parse.quote_plus(rawStr).encode("utf8")).hexdigest()# 将sn参数添加到请求中queryStr = queryStr + "&sn=" + sn# 此处打印的url为非urlencode后的请求串# 如果将该请求串直接粘贴到浏览器中发起请求,由于浏览器会自动进行urlencode,会导致返回sn校验失败url = host + queryStrresponse = requests.get(url)return response.json().get('result').get('addressComponent')# 定义解码方法
def df_stub_process(df):df['center'] = df['h3'].apply(lambda x: h3.h3_to_geo(x))df[['latitude', 'longitude']] = pd.DataFrame(df['center'].tolist(), columns=['latitude', 'longitude'])df['latitude'] = df['latitude'].apply(lambda x: round(x,6))df['longitude'] = df['longitude'].apply(lambda x: round(x,6))# 通过百度api返回城市信息df['address'] = df[['latitude','longitude']].apply(get_city_frombd, axis=1)return df# 解码
si_df = df_stub_process(stub_info)# 保存
si_df.to_csv(path + r'\process3\map.csv', index=False)
编码 
# 数据格式处理
import numpy as np
import pandas as pd# 设置数据集路径
path = r'E:\编程\电动汽车充电站充电量预测'# 读取数据
train_df = pd.read_csv(path + r'\process2\train_df2.csv')
test_df = pd.read_csv(path + r'\process2\test_df2.csv')
map_df = pd.read_csv(path + r'\process3\map.csv')# 地址编码
def onethot(d):# 一维数组初始化v = np.zeros(1)# str -> dictd = eval(d)# 输入地址编码v[0] = d['adcode']return v# 提取城市位置特征
city = pd.DataFrame(np.vstack(map_df['address'].apply(onethot)))
city.columns = ['city']
city['a'] = 100
city['city'] //= city['a']# 将经纬度坐标与城市位置并入数据集
map_df = pd.concat([map_df, city], axis=1)
map_df = map_df.drop(['address', 'center', 'id_encode', 'a'], axis=1)
train_df = pd.concat([train_df, map_df], axis=1)
test_df = pd.concat([test_df, map_df], axis=1)# 保存
train_df.to_csv(path + r'\process3\train_df3.csv', index=False)
test_df.to_csv(path + r'\process3\test_df3.csv', index=False)
map_df.to_csv(path + r'\process3\map_df0.csv', index=False)

小结

        根据步骤逐级保存阶段结果文件,有利于节省时间和运算量,便于模块化分析和数据管理。需要注意的是,申请第三方运算资源有每日运算量限制,要及时保存数据。

        接下来准备进行特征组合方向的尝试。

这篇关于电动汽车充电站充电量预测_学习笔记(二)——特征优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/510942

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss