首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >时间序列的数据清洗和准备.LSTM

时间序列的数据清洗和准备.LSTM
EN

Stack Overflow用户
提问于 2019-05-07 17:59:50
回答 1查看 473关注 0票数 0

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

代码语言:javascript
复制
datetime..............Value      
2015-03-15 12:00:00...1000

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

.

.

我想编写一段代码,在其中提取4小时,并删除仅用于特定月份的第一个提取小时(因为这些数据是错误的)。我成功地编写了一个代码来提取x-Data (输入)和y-Data (输出)的2小时。我希望我能向你解释我的问题。

数据集是一年的秒数据,6pm-11 6pm丢失。例如,8月至11月的第一个小时是错误的数据,需要删除。

代码语言:javascript
复制
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个小时,其中第一个小时,如8月,9月和10月被删除。如果有人也能为我提供更好的代码,我也会非常高兴。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-07 22:14:02

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

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

代码语言:javascript
复制
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']))

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

代码语言:javascript
复制
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

并打印结果:

代码语言:javascript
复制
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小时后的第一个条目中查找所有值的索引,并删除它们:

代码语言:javascript
复制
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)

结果:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56028177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档