Comments (21)
@cookieminions 请问如果我的数据是70个点一个周期,我能否把return index.hour / 23.0 - 0.5 改成 return index.hour / 69.0 - 0.5 然后 offsets.Hour: [HourOfDay]
小时的单位是不是不影响运算,主要是周期?谢谢。
如果你的数据是有date特征的,date是人类定义的日期和时间,那么不论周期是多少个点,直接使用timeF的embedding即可,不需要额外修改(这里index.hour会返回处于一天中的第几个小时,数值在0-23之间)
如果你的数据没有和日期相关的特征,但是有一个已知的周期如70个点,我的建议是:可以新增一个class,如IndexOfPeriod,在其__call__方法中 return index/69.0 - 0.5 (这里要注意的是,此处index不再是时间,也不再有index.hour这些属性,且应该是循环往复的,即0-69,0-69...,来标定处于周期中的哪个位置),然后再在下方增加offset.IdxPeriod:{IndexOfPeriod},并在embed.py对应的embedding的map中增加 'i':1
我们会考虑在之后的更新中加入对于如果没有date属性,只有一个已知的周期,或者只有顺序排布特点的数据的支持,如果你的数据有date属性,那么不用在意周期直接使用timeF就行
from informer2020.
@Erickurashi 请尽量关注模型本身的问题,目前这些其实已经超出我们的处理范围(请不要让我们免费debug)。关于dataloder,因为每个人设计的方式和想法可能不一样,我们精力有限,也没法照顾到所有人的想法。同时我认为基本的问题已经得到了妥善的解决,我将就地关闭这个issue。
from informer2020.
感谢提醒!
这里你可以通过修改freq='h'
应该也能解决报错,因为Dataset_Custom加载时间戳时并没有提供minute级别的特征,因此使用freq='t'
会导致维度不匹配。
这是fixed或learned的embedding方式存在的问题,我们已经有一段时间没有更新这两个embedding方式了,接下来的更新中我们会将这两种方式与freq以及各种Dataset更好整合。
from informer2020.
对于更多的时间类型是否应该修改embedding编码方式 比如到second级别,就另second=61 ?
from informer2020.
对于更多的时间类型是否应该修改embedding编码方式 比如到second级别,就另second=61 ?
如果是timeF的embedding方式,目前已经支持second级别的时间类型;如果是fixed或learned的embedding方式,使用second级别还需要修改data/data_loader.py
中的代码让数据返回second级别的时间戳,以及修改model/embed.py
中的代码,增加对应的embedding层
我们会在这几天更新关于embedding的部分,让所有embedding都能支持timeF支持的freq
from informer2020.
对于更多的时间类型是否应该修改embedding编码方式 比如到second级别,就另second=61 ?
如果是timeF的embedding方式,目前已经支持second级别的时间类型;如果是fixed或learned的embedding方式,使用second级别还需要修改
data/data_loader.py
中的代码让数据返回second级别的时间戳,以及修改model/embed.py
中的代码,增加对应的embedding层我们会在这几天更新关于embedding的部分,让所有embedding都能支持timeF支持的freq
非常感谢,希望考虑到秒级时间的数据类型,可以是浮点类型,这样就可以覆盖更高分辨率的数据类型了
from informer2020.
@cookieminions 请问如果我的数据是70个点一个周期,我能否把return index.hour / 23.0 - 0.5 改成 return index.hour / 69.0 - 0.5 然后 offsets.Hour: [HourOfDay]
小时的单位是不是不影响运算,主要是周期?谢谢。
from informer2020.
@cookieminions 请问如果我的数据是70个点一个周期,我能否把return index.hour / 23.0 - 0.5 改成 return index.hour / 69.0 - 0.5 然后 offsets.Hour: [HourOfDay]
小时的单位是不是不影响运算,主要是周期?谢谢。如果你的数据是有date特征的,date是人类定义的日期和时间,那么不论周期是多少个点,直接使用timeF的embedding即可,不需要额外修改(这里index.hour会返回处于一天中的第几个小时,数值在0-23之间)
如果你的数据没有和日期相关的特征,但是有一个已知的周期如70个点,我的建议是:可以新增一个class,如IndexOfPeriod,在其__call__方法中 return index/69.0 - 0.5 (这里要注意的是,此处index不再是时间,也不再有index.hour这些属性,且应该是循环往复的,即0-69,0-69...,来标定处于周期中的哪个位置),然后再在下方增加offset.IdxPeriod:{IndexOfPeriod},并在embed.py对应的embedding的map中增加 'i':1
我们会考虑在之后的更新中加入对于如果没有date属性,只有一个已知的周期,或者只有顺序排布特点的数据的支持,如果你的数据有date属性,那么不用在意周期直接使用timeF就行
以下粗体字为添加后,运行时会出错,请问如何添加index i 来代表indexofPeriod。
class SecondOfMinute(TimeFeature):
"""Minute of hour encoded as value between [-0.5, 0.5]"""
def call(self, index: pd.DatetimeIndex) -> np.ndarray:
return index.second / 59.0 - 0.5
class MinuteOfHour(TimeFeature):
"""Minute of hour encoded as value between [-0.5, 0.5]"""
def call(self, index: pd.DatetimeIndex) -> np.ndarray:
return index.minute / 59.0 - 0.5
class HourOfDay(TimeFeature):
"""Hour of day encoded as value between [-0.5, 0.5]"""
def call(self, index: pd.DatetimeIndex) -> np.ndarray:
return index.hour / 23.0 - 0.5
class DayOfWeek(TimeFeature):
"""Hour of day encoded as value between [-0.5, 0.5]"""
def call(self, index: pd.DatetimeIndex) -> np.ndarray:
return index.dayofweek / 6.0 - 0.5
class DayOfMonth(TimeFeature):
"""Day of month encoded as value between [-0.5, 0.5]"""
def call(self, index: pd.DatetimeIndex) -> np.ndarray:
return (index.day - 1) / 30.0 - 0.5
class DayOfYear(TimeFeature):
"""Day of year encoded as value between [-0.5, 0.5]"""
def call(self, index: pd.DatetimeIndex) -> np.ndarray:
return (index.dayofyear - 1) / 365.0 - 0.5
class MonthOfYear(TimeFeature):
"""Month of year encoded as value between [-0.5, 0.5]"""
def call(self, index: pd.DatetimeIndex) -> np.ndarray:
return (index.month - 1) / 11.0 - 0.5
class weekOfYear(TimeFeature):
"""Week of year encoded as value between [-0.5, 0.5]"""
def call(self, index: pd.DatetimeIndex) -> np.ndarray:
return (index.isocalendar().week - 1) / 52.0 - 0.5
class IndexOfPeriod:
def call(self, index: pd.DatetimeIndex) -> np.ndarray:
return index/69.0 - 0.5
def time_features_from_frequency_str(freq_str: str) -> List[TimeFeature]:
"""
Returns a list of time features that will be appropriate for the given frequency string.
Parameters
freq_str
Frequency string of the form [multiple][granularity] such as "12H", "5min", "1D" etc.
"""
features_by_offsets = {
offsets.YearEnd: [],
offsets.QuarterEnd: [MonthOfYear],
offsets.MonthEnd: [MonthOfYear],
offsets.Week: [DayOfMonth, WeekOfYear],
offsets.Day: [DayOfWeek, DayOfMonth, DayOfYear],
offsets.BusinessDay: [DayOfWeek, DayOfMonth, DayOfYear],
offsets.Hour: [HourOfDay,DayOfWeek, DayOfMonth, DayOfYear],
offsets.Minute: [
MinuteOfHour,
HourOfDay,
DayOfWeek,
DayOfMonth,
DayOfYear,
],
offsets.Second: [
SecondOfMinute,
MinuteOfHour,
HourOfDay,
DayOfWeek,
DayOfMonth,
DayOfYear,
],
offset.IdxPeriod:[IndexOfPeriod]
}
offset = to_offset(freq_str)
for offset_type, feature_classes in features_by_offsets.items():
if isinstance(offset, offset_type):
return [cls() for cls in feature_classes]
supported_freq_msg = f"""
Unsupported frequency {freq_str}
The following frequencies are supported:
Y - yearly
alias: A
M - monthly
W - weekly
D - daily
B - business days
H - hourly
T - minutely
alias: min
S - secondly
i - period
"""
from informer2020.
我们会在下次更新时加上这个可选项,即数据如果没有时间属性,只有由数字表现的周期
修改的话这里还涉及到数据的加载以及方法中index类型的定义,至少在def call(self, index: pd.DatetimeIndex) -> np.ndarray:
这里需要改为def call(self, index) -> np.ndarray:
, 以及对应修改数据加载部分的pd.to_datetime
如果方便的话,也可以提供你的一部分数据(涵盖1-2个周期)以及其中的周期表示方法,帮助我们完善这个部分的设计
from informer2020.
我的数据没有明确的周期,平均周期在100个点左右(如上图),这种情况应该如何处理,能否不使用周期进行预测。谢谢。
test.xlsx
from informer2020.
我的数据没有明确的周期,平均周期在100个点左右(如上图),这种情况应该如何处理,能否不使用周期进行预测。谢谢。
test.xlsx
如果数据没有一个确定的周期,也没有时间信息,那么就只依靠positional encoding的信息就行,如果强行设置一个周期反而可能会造成不好的影响
在现有的代码下,你可以修改models/embed.py
中的第107行为x = self.value_embedding(x) + self.position_embedding(x)
即可,然后在你的数据文件中还是需要增加一个date列,不过日期可以随便填(可以都填成一个如2021-01-01 00:00:00),因为在embedding中不会用到这个日期信息了
from informer2020.
我的数据没有明确的周期,平均周期在100个点左右(如上图),这种情况应该如何处理,能否不使用周期进行预测。谢谢。
test.xlsx如果数据没有一个确定的周期,也没有时间信息,那么就只依靠positional encoding的信息就行,如果强行设置一个周期反而可能会造成不好的影响
在现有的代码下,你可以修改
models/embed.py
中的第107行为x = self.value_embedding(x) + self.position_embedding(x)
即可,然后在你的数据文件中还是需要增加一个date列,不过日期可以随便填(可以都填成一个如2021-01-01 00:00:00),因为在embedding中不会用到这个日期信息了
谢谢, 那么这行代码是否不用改动 args.freq = 'h',
args.seq_len,args.label_len 和args.pred_len也可以不需要根据周期改动了?
from informer2020.
不用改动freq,因为不会用到时序信息
但是seq_len, label_len, pred_len还是需要根据你自己的数据和任务进行相应调整,如pred_len是预测长度,这和你的应用目标有关,而seq_len和label_len则可以根据你对数据的观察设置,如设为100或140或70等
from informer2020.
不用改动freq,因为不会用到时序信息
但是seq_len, label_len, pred_len还是需要根据你自己的数据和任务进行相应调整,如pred_len是预测长度,这和你的应用目标有关,而seq_len和label_len则可以根据你对数据的观察设置,如设为100或140或70等
谢谢,我还是想请问一下,如果我想设置一个周期为70个数据点(比如新建一个叫i的选项来取代原本的h)。哪些代码部分需要修改?数据目前有两列,一列是Date时间,另一列是数据。Date那一列的名字和时间序列是否也需要修改?谢谢
from informer2020.
如果你的数据中的Date是有实际意义的,那么我建议不需要关心周期是什么,让模型自己去学习和理解即可
如果你的数据中的Date没有实际意义,而是数据大概有一个70个点的周期,那么可以这样修改,首先在timefeatures.py中增加:
class IndexOfPeriod(TimeFeature):
"""Minute of hour encoded as value between [-0.5, 0.5]"""
def __call__(self, index) -> np.ndarray:
return index / 69.0 - 0.5
然后修改offsets中已有的任意一个,如offsets.Second,改为offsets.Second:[IndexOfPeriod],然后相应地在embed.py中修改TimeFeatureEmbedding中的freq_map,修改其中的's'为1
之后还需要修改dataloader中的数据加载部分,一方面你要确保自己的date列不再是时间数据,而是和周期对应的0-69之间的数,另一方面就是修改其中的data_stamp = time_features(pd.to_datetime(df_stamp['date'].values), freq=self.freq)
为data_stamp = time_features(df_stamp['date'].values, freq=self.freq)
之后在训练时使用--freq s
就可以了
from informer2020.
如果你的数据中的Date是有实际意义的,那么我建议不需要关心周期是什么,让模型自己去学习和理解即可
如果你的数据中的Date没有实际意义,而是数据大概有一个70个点的周期,那么可以这样修改,首先在timefeatures.py中增加:
class IndexOfPeriod(TimeFeature): """Minute of hour encoded as value between [-0.5, 0.5]""" def __call__(self, index) -> np.ndarray: return index / 69.0 - 0.5
然后修改offsets中已有的任意一个,如offsets.Second,改为offsets.Second:[IndexOfPeriod],然后相应地在embed.py中修改TimeFeatureEmbedding中的freq_map,修改其中的's'为1
之后还需要修改dataloader中的数据加载部分,一方面你要确保自己的date列不再是时间数据,而是和周期对应的0-69之间的数,另一方面就是修改其中的
data_stamp = time_features(pd.to_datetime(df_stamp['date'].values), freq=self.freq)
为data_stamp = time_features(df_stamp['date'].values, freq=self.freq)
之后在训练时使用
--freq s
就可以了
谢谢您,我按照上面的修改后出现以下错误
Use GPU: cuda:0
start training : informer_custom_ftS_sl200_ll100_pl100_dm512_nh8_el2_dl1_df1024_atprob_fc5_ebtimeF_dtTrue_exp_0>>>>>>>>>>>>>>>>>>>>>>>>>>
UFuncTypeError Traceback (most recent call last)
in ()
10 # train
11 print('>>>>>>>start training : {}>>>>>>>>>>>>>>>>>>>>>>>>>>'.format(setting))
---> 12 exp.train(setting)
13
14 # test
6 frames
/content/Informer2020/exp/exp_informer.py in train(self, setting)
144
145 def train(self, setting):
--> 146 train_data, train_loader = self._get_data(flag = 'train')
147 vali_data, vali_loader = self._get_data(flag = 'val')
148 test_data, test_loader = self._get_data(flag = 'test')
/content/Informer2020/exp/exp_informer.py in _get_data(self, flag)
85 target=args.target,
86 timeenc=timeenc,
---> 87 freq=freq
88 )
89 print(flag, len(data_set))
/content/Informer2020/data/data_loader.py in init(self, root_path, flag, size, features, data_path, target, scale, timeenc, freq)
216 self.root_path = root_path
217 self.data_path = data_path
--> 218 self.read_data()
219
220 def read_data(self):
/content/Informer2020/data/data_loader.py in read_data(self)
258 data_stamp = df_stamp.drop(['date'],1).values
259 elif self.timeenc==1:
--> 260 data_stamp = time_features(df_stamp['date'].values, freq=self.freq)
261 data_stamp = data_stamp.transpose(1,0)
262
/content/Informer2020/utils/timefeatures.py in time_features(dates, freq)
108
109 def time_features(dates, freq='h'):
--> 110 return np.vstack([feat(dates) for feat in time_features_from_frequency_str(freq)])
/content/Informer2020/utils/timefeatures.py in (.0)
108
109 def time_features(dates, freq='h'):
--> 110 return np.vstack([feat(dates) for feat in time_features_from_frequency_str(freq)])
/content/Informer2020/utils/timefeatures.py in call(self, index)
19 """Minute of hour encoded as value between [-0.5, 0.5]"""
20 def call(self, index) -> np.ndarray:
---> 21 return index / 99.0 - 0.5
22
23
UFuncTypeError: ufunc 'true_divide' cannot use operands with types dtype('<M8[ns]') and dtype('float64')
from informer2020.
请检查数据中的date属性是否存在数值问题,报错和date的数据类型有关系,应该保证date列不再是时间数据,而是和周期对应的0-69之间的数字
from informer2020.
我现在以100为周期,excel的周期对应0-99之间的数字。不知这样改是否正确
from informer2020.
理论上是没有问题的,但是在程序中你的date列似乎存在dtype('<M8[ns]')的数据,你可以再检查数据或者尝试用astype等方法把date.values的dtype都变成np.float64
from informer2020.
你可以在time_features中打印一下dates数据看一下数据类型,因为也可能你的dataloader中修改的位置不对,你可以把所有DataSet中相关部分都改成data_stamp = time_features(df_stamp['date'].values, freq=self.freq)
from informer2020.
你可以在time_features中打印一下dates数据看一下数据类型,因为也可能你的dataloader中修改的位置不对,你可以把所有DataSet中相关部分都改成
data_stamp = time_features(df_stamp['date'].values, freq=self.freq)
我更改了所有dataset相关的部分,但还是出现同样的错误。数据里到99的时候是否需要重置到0
from informer2020.
Related Issues (20)
- 关于启用单显卡计算后服务器宕机的问题
- 预测多目标时一直出现ValueError: list.remove(x): x not in list问题怎么办啊 HOT 3
- 想问下为何原来代码中是M,target只有1个。不应该是MS吗
- 请求帮助:面对训练变化和预测差异
- 关于一段段数据的问题!!!!!!!! HOT 1
- 关于预测结果长度问题
- 作者大大,想问一下关于替换自己数据集的问题 HOT 2
- 关于解码器的self.mix为True时的疑惑,out.shape = 32,96,8,72, 为什么要将out变成32,8,96,72呢? HOT 1
- 关于多变量预测的问题
- 关于作者colab可视化代码的问题 HOT 1
- v2版本
- [email protected]
- mask中为什么使用了triu函数,而不是tril函数 HOT 1
- 关于采用多个训练数据集的问题 HOT 1
- 是否可以训练的时候做归一化,预测的时候做反归一化 HOT 8
- 111
- 论文中的MSE HOT 1
- MSE与MAE值缩放 HOT 3
- test出来的预测值进行可视化,但是没有时间那一列,想问一下如何在可视化的csv文件中加入时间列,目的是知道测试的什么时间的数据
- 请问为何同为ETTm1数据集跑出的结果经可视化后groundtruth会和论文不同? HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from informer2020.