How to Prepare Univariate Time Series Data for Long Short-Term Memory Networks

It can be hard to prepare data when you’re just getting started with deep learning.

Long Short-Term Memory, or LSTM, recurrent neural networks expect three-dimensional input in the Keras Python deep learning library.

If you have a long sequence of thousands of observations in your time series data, you must split your time series into samples and then reshape it for your LSTM model.

In this tutorial, you will discover exactly how to prepare your univariate time series data for an LSTM model in Python with Keras.

Let’s get started.

How to Prepare Univariate Time Series Data for Long Short-Term Memory Networks

How to Prepare Univariate Time Series Data for Long Short-Term Memory Networks
Photo by Miguel Mendez, some rights reserved.

How to Prepare Time Series Data

Perhaps the most common question I get is how to prepare time series data for supervised learning.

I have written a few posts on the topic, such as:

But, these posts don’t help everyone.

I recently got this email:

I have two columns in my data file with 5000 rows, column 1 is time (with 1 hour interval) and column 2 is bits/sec and I am trying to forecast bits/sec. In that case can you please help me to set sample, time step and feature [for LSTMs]?

There are few problems here:

  • LSTMs expect 3D input, and it can be challenging to get your head around this the first time.
  • LSTMs don’t like sequences of more than 200-400 time steps, so the data will need to be split into samples.

In this tutorial, we will use this question as the basis for showing one way to specifically prepare data for the LSTM network in Keras.

1. Load the Data

I assume you know how to load the data as a Pandas Series or DataFrame.

If not, see these posts:

Here, we will mock loading by defining a new dataset in memory with 5,000 time steps.

Running this piece both prints the first 5 rows of data and the shape of the loaded data.

We can see we have 5,000 rows and 2 columns: a standard univariate time series dataset.

2. Drop Time

If your time series data is uniform over time and there is no missing values, we can drop the time column.

If not, you may want to look at imputing the missing values, resampling the data to a new time scale, or developing a model that can handle missing values. See posts like:

Here, we just drop the first column:

Now we have an array of 5,000 values.

3. Split Into Samples

LSTMs need to process samples where each sample is a single time series.

In this case, 5,000 time steps is too long; LSTMs work better with 200-to-400 time steps based on some papers I’ve read. Therefore, we need to split the 5,000 time steps into multiple shorter sub-sequences.

I write more about splitting up long sequences here:

There are many ways to do this, and you may want to explore some depending on your problem.

For example, perhaps you need overlapping sequences, perhaps non-overlapping is good but your model needs state across the sub-sequences and so on.

Here, we will split the 5,000 time steps into 25 sub-sequences of 200 time steps each. Rather than using NumPy or Python tricks, we will do this the old fashioned way so you can see what is going on.

We now have 25 sub sequences of 200 time steps each.

If you’d prefer to do this in a one liner, go for it. I’d love to see what you can come up with.
Post your approach in the comments below.

4. Reshape Subsequences

The LSTM needs data with the format of [samples, time steps and features].

Here, we have 25 samples, 200 time steps per sample, and 1 feature.

First, we need to convert our list of arrays into a 2D NumPy array of 25 x 200.

Running this piece, you should see:

Next, we can use the reshape() function to add one additional dimension for our single feature.

And that is it.

The data can now be used as an input (X) to an LSTM model.

Further Reading

This section provides more resources on the topic if you are looking to go deeper.

Related Posts

API

Summary

In this tutorial, you discovered how to convert your long univariate time series data into a form that you can use to train an LSTM model in Python.

Did this post help? Do you have any questions?
Let me know in the comments below.

Develop LSTMs for Sequence Prediction Today!

Long Short-Term Memory Networks with Python

Develop Your Own LSTM models in Minutes

…with just a few lines of python code

Discover how in my new Ebook:
Long Short-Term Memory Networks with Python

It provides self-study tutorials on topics like:
CNN LSTMs, Encoder-Decoder LSTMs, generative models, data preparation, making predictions and much more…

Finally Bring LSTM Recurrent Neural Networks to
Your Sequence Predictions Projects

Skip the Academics. Just Results.

Click to learn more.


13 Responses to How to Prepare Univariate Time Series Data for Long Short-Term Memory Networks

  1. Steven November 17, 2017 at 9:44 am #

    Great article! I wish I had this a couple months ago when I was struggling with doing the same thing for Tensorflow. Glad to see the solution I had mostly aligns with yours.

    You mention some papers that discuss optimal sample size. Would you be able to share a link to those? I’m interested to see how the authors arrive at that number.

  2. went November 17, 2017 at 12:32 pm #

    Hi Jason, thx for sharing.

    let say I have a timeseries dataset [1,2,3,4,5,6,7,8] and need to split it with time steps of 4, in your article, the result will be [1,2,3,4], [5,6,7,8]. But in some other articles I’ve read, the result sometime will be is this way: [1,2,3,4], [2,3,4,5],[3,4,5,6],[4,5,6,7],[5,6,7,8].

    so what will be the best way to split the samples? thx.

    • Jason Brownlee November 18, 2017 at 10:11 am #

      All 3 approaches you have listed are valid, try each and see what works best for your problem.

      • Martin November 21, 2017 at 12:31 am #

        Is there litterature on the subject? The 3 solutions seem to have a very distinct training time for large datasets. I assume that for the second solution we should keep the memory for the cell, but not for the third, right?

        Also, is there a risk that the training overexposed certain timesteps(timestep 5 in the example) in early learning, giving a bigger weight to this data.

        BTW great blog and your book on LSTM is the best I found on the subject. thx.

  3. a November 17, 2017 at 7:51 pm #

    Nice article. One thing I live about Python is list comprehension. One possible one-liner could be

    samples = [data[i:i+length] for i in range(0,n, length)]

  4. Pedro Cadahía November 17, 2017 at 10:38 pm #

    Went, what you want is called “sliding window”, you could get it in the next code:

    from itertools import islice

    def window(seq, n=2):
    “Returns a sliding window (of width n) over data from the iterable”
    ” s -> (s0,s1,…s[n-1]), (s1,s2,…,sn), … ”
    it = iter(seq)
    result = tuple(islice(it, n))
    if len(result) == n:
    yield result
    for elem in it:
    result = result[1:] + (elem,)
    yield result

  5. Daniel Salvador November 20, 2017 at 7:43 pm #

    Hi Jason! First, I have to say that I really like your posts, they are very helpful.

    I’m facing a time series classification problem (two classes) where I have series of around 120-200 time steps and 7 variables each. The problem is that I have only 3000 samples to train. What do you think, Is it feasible a priori to feed a LSTM network or I need more samples?

    You mention that LSTM doesn’t work well with more than 200-400 timesteps. What about the number of features? Would you do dimensionality reduction?

    Thank you very much in advance!

    • Jason Brownlee November 22, 2017 at 10:40 am #

      LSTMs can support multiple features.

      It does not sound like enough data.

      You could try splitting the sequence up into multiple subsequences to see if that helps?

  6. Staffan November 21, 2017 at 6:40 am #

    Hi Jason,

    Thank you for this excellent summary, your work is really impressive…I’m especially impressed by how many blog posts you have taken the time to write.

    I was wondering why an LSTM network prefers a sequence of 200 – 400 samples, is this due to a memory allocation issue? Or can a longer sequence affect accuracy (I wouldn’t guess this but perhaps it’s possible)?

    What role does the batch size play here? Couldn’t this restriction in sequence length be mitigated by selecting a correct batch size?

    BR
    Staffan

    • Jason Brownlee November 22, 2017 at 10:45 am #

      It seems to be a limitation on the training algorithm. I have seen this issue discussed in the literature, but have not pushed hard to better understand it myself.

      I’d encourage you to test different configurations on your problem.

Leave a Reply