【问题标题】:Data cleaning and preparation for Time-Series-LSTMTime-Series-LSTM 的数据清理和准备
【发布时间】:2019-05-08 06:14:02
【问题描述】:

我需要准备我的数据以将其输入 LSTM 以预测第二天。 我的数据集是以秒为单位的时间序列,但我每天只有 3-5 小时的数据。 (我只有这个特定的数据集所以不能改变它) 我有Date-Time 和某个Value。 例如:

datetime..............Value      
2015-03-15 12:00:00...1000

2015-03-15 12:00:01....10

.

.

我想写一个我提取的代码,例如4 小时并删除特定月份的第一个提取小时(因为此数据有误)。 我设法编写了一个代码来提取例如x-Data(输入)和y-Data(输出)需要 2 小时。 我希望我能向你解释我的问题。

数据集是以秒为单位的 1 年数据,缺少下午 6 点到晚上 11 点的休息时间。 在例如8-11月第一个小时是错误数据,需要删除。

init = True
for day in np.unique(x_df.index.date):
    temp = x_df.loc[(day + pd.DateOffset(hours=18)):(day + pd.DateOffset(hours=20))]

if len(temp) == 7201:
if init:
    x_df1 = np.array([temp.values])
    init = False
else:
    #print (temp.values.shape)
    x_df1 = np.append(x_df1, np.array([temp.values]), axis=0)
#else:
#if not temp.empty:
    #print (temp.index[0].date(), len(temp))

x_df1 = np.array(x_df1)

print('X-Shape:', x_df1.shape, 
'Y-Shape:', y_df1.shape)
#sample, timesteps and features for LSTM
X-Shape: (32, 7201, 6) Y-Shape: (32, 7201)

我的预期结果是有一个数据集,例如每天 4 小时,例如第一个小时。八月、九月和十月被删除。 如果有人也可以为我提供更好的代码,我也会很高兴。

【问题讨论】:

    标签: python time-series lstm data-cleaning


    【解决方案1】:

    可能不是最有效的解决方案,但也许它仍然适合。

    首先让我们为每个月的前 4 个月和 5 天生成一些随机数据:

    import random
    import pandas as pd
    
    df = pd.DataFrame()
    for month in range(1,5): #First 4 Months
        for day in range(5,10): #5 Days
            hour = random.randint(18,19)
            minute = random.randint(1,59)
            dt = datetime.datetime(2018,month,day,hour,minute,0)
            dti = pd.date_range(dt, periods=60*60*4, freq='S')
            values = [random.randrange(1, 101, 1) for _ in range(len(dti))]
            df = df.append(pd.DataFrame(values, index=dti, columns=['Value']))
    

    现在让我们定义一个函数来过滤每天的第一行:

    def first_value_per_day(df):
        res_df = df.groupby(df.index.date).apply(lambda x: x.iloc[[0]])
        res_df.index = res_df.index.droplevel(0)
        return res_df
    

    并打印结果:

    print(first_value_per_day(df))
    
                         Value
    2018-01-05 18:31:00     85
    2018-01-06 18:25:00     40
    2018-01-07 19:54:00     52
    2018-01-08 18:23:00     46
    2018-01-09 18:08:00     51
    2018-02-05 18:58:00      6
    2018-02-06 19:12:00     16
    2018-02-07 18:18:00     10
    2018-02-08 18:32:00     50
    2018-02-09 18:38:00     69
    2018-03-05 19:54:00    100
    2018-03-06 18:37:00     70
    2018-03-07 18:58:00     26
    2018-03-08 18:28:00     30
    2018-03-09 18:34:00     71
    2018-04-05 18:54:00      2
    2018-04-06 19:16:00    100
    2018-04-07 18:52:00     85
    2018-04-08 19:08:00     66
    2018-04-09 18:11:00     22
    

    所以,现在我们需要一个应该处理的特定月份的列表,在本例中为 2 和 3。现在我们使用定义的函数并过滤每个 选定 月份的日期并循环超过那些在每天+1小时后找到第一个条目中所有值的索引并删除它们:

    MONTHS_TO_MODIFY = [2,3]
    HOURS_TO_DROP = 1
    
    fvpd = first_value_per_day(df)
    for m in MONTHS_TO_MODIFY:
        fvpdm = fvpd[fvpd.index.month == m]
        for idx, value in fvpdm.iterrows():
            start_dt = idx
            end_dt = idx + datetime.timedelta(hours=HOURS_TO_DROP)
            index_list = df[(df.index >= start_dt) & (df.index < end_dt)].index.tolist()
            df.drop(index_list, inplace=True)
    

    结果:

    print(first_value_per_day(df))
    
                         Value
    2018-01-05 18:31:00     85
    2018-01-06 18:25:00     40
    2018-01-07 19:54:00     52
    2018-01-08 18:23:00     46
    2018-01-09 18:08:00     51
    2018-02-05 19:58:00      1
    2018-02-06 20:12:00     42
    2018-02-07 19:18:00     34
    2018-02-08 19:32:00     34
    2018-02-09 19:38:00     61
    2018-03-05 20:54:00     15
    2018-03-06 19:37:00     88
    2018-03-07 19:58:00     36
    2018-03-08 19:28:00     38
    2018-03-09 19:34:00     42
    2018-04-05 18:54:00      2
    2018-04-06 19:16:00    100
    2018-04-07 18:52:00     85
    2018-04-08 19:08:00     66
    2018-04-09 18:11:00     22
    
    

    【讨论】:

    • 非常感谢,我稍微调整了一下,效果很好。
    • 很高兴听到,我很乐意提供帮助,欢迎来到 Stack Overflow。如果此答案帮助您解决了问题,请将其标记为已接受。 :-)
    猜你喜欢
    • 2020-02-10
    • 2022-01-14
    • 2021-12-20
    • 2021-03-04
    • 1970-01-01
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多