From f64ea533195edf4e1c6a474cc39bfb951e601078 Mon Sep 17 00:00:00 2001 From: Jen Looper Date: Wed, 12 May 2021 17:45:40 -0400 Subject: [PATCH] first pass at time series intro --- TimeSeries/1-Introduction/README.md | 150 +++++++++++++++--- TimeSeries/1-Introduction/images/currency.png | Bin 0 -> 72656 bytes .../1-Introduction/images/energy-plot.png | Bin 0 -> 46268 bytes .../1-Introduction/images/july-2014.png | Bin 0 -> 43657 bytes .../solution/common/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 215 bytes .../__pycache__/extract_data.cpython-37.pyc | Bin 0 -> 1221 bytes .../common/__pycache__/utils.cpython-37.pyc | Bin 0 -> 4602 bytes .../solution/common/environment.yaml | 28 ++++ .../solution/common/extract_data.py | 37 +++++ .../1-Introduction/solution/common/utils.py | 145 +++++++++++++++++ .../1-Introduction/solution/notebook.ipynb | 134 +++++----------- .../1-Introduction/working/common/__init__.py | 0 .../__pycache__/__init__.cpython-37.pyc | Bin 0 -> 214 bytes .../__pycache__/extract_data.cpython-37.pyc | Bin 0 -> 1220 bytes .../common/__pycache__/utils.cpython-37.pyc | Bin 0 -> 4601 bytes .../working/common/environment.yaml | 28 ++++ .../working/common/extract_data.py | 37 +++++ .../1-Introduction/working/common/utils.py | 145 +++++++++++++++++ .../1-Introduction/working/notebook.ipynb | 111 +++++++++++++ 20 files changed, 703 insertions(+), 112 deletions(-) create mode 100644 TimeSeries/1-Introduction/images/currency.png create mode 100644 TimeSeries/1-Introduction/images/energy-plot.png create mode 100644 TimeSeries/1-Introduction/images/july-2014.png create mode 100644 TimeSeries/1-Introduction/solution/common/__init__.py create mode 100644 TimeSeries/1-Introduction/solution/common/__pycache__/__init__.cpython-37.pyc create mode 100644 TimeSeries/1-Introduction/solution/common/__pycache__/extract_data.cpython-37.pyc create mode 100644 TimeSeries/1-Introduction/solution/common/__pycache__/utils.cpython-37.pyc create mode 100644 TimeSeries/1-Introduction/solution/common/environment.yaml create mode 100644 TimeSeries/1-Introduction/solution/common/extract_data.py create mode 100644 TimeSeries/1-Introduction/solution/common/utils.py create mode 100644 TimeSeries/1-Introduction/working/common/__init__.py create mode 100644 TimeSeries/1-Introduction/working/common/__pycache__/__init__.cpython-37.pyc create mode 100644 TimeSeries/1-Introduction/working/common/__pycache__/extract_data.cpython-37.pyc create mode 100644 TimeSeries/1-Introduction/working/common/__pycache__/utils.cpython-37.pyc create mode 100644 TimeSeries/1-Introduction/working/common/environment.yaml create mode 100644 TimeSeries/1-Introduction/working/common/extract_data.py create mode 100644 TimeSeries/1-Introduction/working/common/utils.py create mode 100644 TimeSeries/1-Introduction/working/notebook.ipynb diff --git a/TimeSeries/1-Introduction/README.md b/TimeSeries/1-Introduction/README.md index ebbaa7f0..60aca44d 100644 --- a/TimeSeries/1-Introduction/README.md +++ b/TimeSeries/1-Introduction/README.md @@ -1,53 +1,163 @@ # Introduction to Time Series Forecasting -![Introduction to Time Series Forecasting](video-url) [![Introduction to Time Series Forecasting](https://img.youtube.com/vi/mAv1SEXUKhE/0.jpg)](https://youtu.be/mAv1SEXUKhE "Introduction to Time Series Forecasting") > Introduction to Time Series Forecasting with Francesca Lazzeri; starting at 7:13. ## [Pre-lecture quiz](link-to-quiz-app) -In this lesson and the following one, you will learn a bit about Time Series Forecasting, an interesting and valuable part of a ML scientist's repertoire that is a bit lesser known than other topics. Time Series Forecasting is a sort of crystal ball: based on past performance of a variable such as price, you can predict its future potential value. It's a powerful and interesting field especially in business, unsurprisingly, given its direct application to problems of value. While deep learning techniques have started to be used to gain more insights in the prediction of future performance, it remains a field greatly informed by classic ML techniques. +In this lesson and the following one, you will learn a bit about Time Series Forecasting, an interesting and valuable part of a ML scientist's repertoire that is a bit lesser known than other topics. Time Series Forecasting is a sort of crystal ball: based on past performance of a variable such as price, you can predict its future potential value. + +It's a powerful and interesting field especially in business, given its direct application to problems of value, pricing, inventory, and supply chain issues. While deep learning techniques have started to be used to gain more insights in the prediction of future performance, Time Series Forecasting remains a field greatly informed by classic ML techniques. + +> Penn State's useful Time Series curriculum can be found [here](https://online.stat.psu.edu/stat510/lesson/1) ### Introduction -Supposing you maintain an array of smart parking meters that provide data about how often they are used and for how long over time. What if you could generate revenue to maintain your streets by tweaking the prices of the meters when there is greater demand for them? What if you could predict, based on the meter's past performance, its future value according to the laws of supply and demand? This is a challenge that could be tackled by a Time Series problem. It wouldn't make those in search of a rare parking spot in busy times very happy to have to pay more for it, but it would be a sure way to generate revenue to clean the streets! +Supposing you maintain an array of smart parking meters that provide data about how often they are used and for how long over time. What if you could generate revenue to maintain your streets by slightly augmenting the prices of the meters when there is greater demand for them? What if you could predict, based on the meter's past performance, its future value according to the laws of supply and demand? This is a challenge that could be tackled by Time Series Forecasting. It wouldn't make those folks in search of a rare parking spot in busy times very happy to have to pay more for it, but it would be a sure way to generate revenue to clean the streets! -Let's explore some of the types of Time Series algorithms and start a notebook in preparation of cleaning some data. The data you will analyze is taken from the GEFCom2014 forecasting competition. It consists of 3 years of hourly electricity load and temperature values between 2012 and 2014. Given the historical patterns of electricity load and temperature, you can predict future values of electricity load. In this example, you'll learn how to forecast one time step ahead, using historical load data only. +Let's explore some of the types of Time Series algorithms and start a notebook to clean and prepare some data. The data you will analyze is taken from the GEFCom2014 forecasting competition. It consists of 3 years of hourly electricity load and temperature values between 2012 and 2014. Given the historical patterns of electricity load and temperature, you can predict future values of electricity load. In this example, you'll learn how to forecast one time step ahead, using historical load data only. Before starting, however, it's useful to understand what's going on behind the scenes. -## Types of Time Series Forecasting +## Some Definitions + +When encountering the term 'time series' you need to understand its use in several different contexts. +### Time Series + +In mathematics, "a time series is a series of data points indexed (or listed or graphed) in time order. Most commonly, a time series is a sequence taken at successive equally spaced points in time." An example of a time series is the daily closing value of the Dow Jones Industrial Average.[source](https://en.wikipedia.org/wiki/Time_series). The use of time series plots and statistical modeling is frequently encountered in signal processing, weather forecasting, earthquake prediction, and other fields where events occur and data points can be plotted over time. +### Time Series Analysis + +Time Series Analysis is the analysis of the above mentioned time series data. Time series data can take distinct forms, including 'interrupted time series' which detects patterns in a time series' evolution before and after an interrupting event. The type of analysis needed for the time series depends on the nature of the data. Time series data itself can take the form of series of numbers or characters. + +The analysis be performed using a variety of methods, including frequency-domain and time-domain, linear and nonlinear, and more. [Learn more](https://www.itl.nist.gov/div898/handbook/pmc/section4/pmc4.htm) about the may ways to analyze this type of data. +### Time Series Forecasting + +Time Series Forecasting is the use of a model to predict future values based on patterns displayed by previously gathered data as it occurred in the past. While it is possible to use regression models to explore time series data, with time indices as x variables on a plot, this type of data is best analyzed using special types of models. + +Time series data is a list of ordered observations, unlike data that can be analyzed by linear regression. The most common one is ARIMA, an acronym that stands for "Autoregressive Integrated Moving Average". +ARIMA models "relate the present value of a series to past values and past prediction errors." [source](https://online.stat.psu.edu/stat510/lesson/1/1.1). They are most appropriate for analyzing time-domain data, where data is ordered over time. + +> There are several types of ARIMA models, which you can learn about [here](https://people.duke.edu/~rnau/411arim.htm) and which you will touch on in the next lesson. + +In the next lesson, you will build an ARIMA model using [Univariate Time Series](https://itl.nist.gov/div898/handbook/pmc/section4/pmc44.htm), which focuses on one variable that changes its value over time. An example of this type of data is [this dataset](https://itl.nist.gov/div898/handbook/pmc/section4/pmc4411.htm) that records the monthly C02 concentration at the Mauna Loa Observatory: + +| CO2 | YearMonth | Year | Month | +| :----: | :-------: | :---: | :---: | +| 330.62 | 1975.04 | 1975 | 1 | +| 331.40 | 1975.13 | 1975 | 2 | +| 331.87 | 1975.21 | 1975 | 3 | +| 333.18 | 1975.29 | 1975 | 4 | +| 333.92 | 1975.38 | 1975 | 5 | +| 333.43 | 1975.46 | 1975 | 6 | +| 331.85 | 1975.54 | 1975 | 7 | +| 330.01 | 1975.63 | 1975 | 8 | +| 328.51 | 1975.71 | 1975 | 9 | +| 328.41 | 1975.79 | 1975 | 10 | +| 329.25 | 1975.88 | 1975 | 11 | +| 330.97 | 1975.96 | 1975 | 12 | + +✅ Identify the variable that changes over time in this dataset + + +## Time Series [data characteristics](https://online.stat.psu.edu/stat510/lesson/1/1.1) to consider + +When looking at time series data, you might notice that it has certain characteristics that you need to take into account and mitigate to better understand its patterns. If you consider time series data as potentially providing a 'signal' that you want to analyze, these characteristics can be thought of as 'noise'. You often will need to reduce this 'noise' by offsetting some of these characteristics using some statistical techniques. +### Trends +Measurable increases and decreases over time +### [Seasonality](https://machinelearningmastery.com/time-series-seasonality-with-python/) +Periodic fluctuations, such as holiday rushes that might affect sales, for example. [Take a look](https://itl.nist.gov/div898/handbook/pmc/section4/pmc443.htm) at how different types of plots display seasonality in data. +### Outliers +Outliers are far away from the standard data variance. +### Long-run cycle +Independent of seasonality, data might display a long-run cycle such as an economic down-turn that lasts longer than a year. +### Constant variance +Over time, some data display constant fluctuations, such as energy usage per day and night. +### Abrupt changes +The data might display an abrupt change that might need further analysis. The abrupt shuttering of businesses due to COVID, for example, caused changes in data. -## Algorithms +### Stationary -## Some Math +✅ Here is a [sample time series plot](https://www.kaggle.com/kashnitsky/topic-9-part-1-time-series-analysis-in-python) showing daily in-game currency spent over a few years. Can you identify any of the characteristics listed above in this data? -## ARIMA +![in-game currency spend](./images/currency.png) -## [Topic 1] +## Getting started with power usage data -### Task: +Let's get started creating a time series model to predict future power usage given past usage. -Work together to progressively enhance your codebase to build the project with shared code: +> The data in this example is taken from the GEFCom2014 forecasting competition. It consists of 3 years of hourly electricity load and temperature values between 2012 and 2014. +> +> Tao Hong, Pierre Pinson, Shu Fan, Hamidreza Zareipour, Alberto Troccoli and Rob J. Hyndman, "Probabilistic energy forecasting: Global Energy Forecasting Competition 2014 and beyond", International Journal of Forecasting, vol.32, no.3, pp 896-913, July-September, 2016. -```html -code blocks +In the `working` folder of this lesson, open the `notebook.ipynb` file. Start by adding libraries that will help you load and visualize remote data + +```python +import os +import matplotlib.pyplot as plt +from common.utils import load_data +from common.extract_data import extract_data +%matplotlib inline ``` +Note, you are using the files from the included `common` folder which set up your environment and handle downloading the data. -✅ Knowledge Check - use this moment to stretch students' knowledge with open questions +Next, download, move and extract the zip file of data: -## [Topic 2] +```python +data_dir = './data' -## [Topic 3] +if not os.path.exists(os.path.join(data_dir, 'energy.csv')): + # Download and move the zip file + !wget https://www.dropbox.com/s/pqenrr2mcvl0hk9/GEFCom2014.zip + !mv GEFCom2014.zip ./data + # If not done already, extract zipped data and save as csv + extract_data(data_dir) +``` +Take a look at the way the data looks: -## 🚀Challenge +``` +energy = load_data(data_dir)[['load']] +energy.head() +``` +You can see that there are two columns representing date and load: + +| date | load | +| :-----------------: | :----: | +| 2012-01-01 00:00:00 | 2698.0 | +| 2012-01-01 01:00:00 | 2558.0 | +| 2012-01-01 02:00:00 | 2444.0 | +| 2012-01-01 03:00:00 | 2402.0 | +| 2012-01-01 04:00:00 | 2403.0 | + +Now, plot the data: + +```python +energy.plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) +plt.xlabel('timestamp', fontsize=12) +plt.ylabel('load', fontsize=12) +plt.show() +``` +![energy plot](images/energy-plot.png) + +Now, plot the first week of July 2014 -Add a challenge for students to work on collaboratively in class to enhance the project +```python +energy['2014-07-01':'2014-07-07'].plot(y='load', subplots=True, figsize=(15, 8), fontsize=12) +plt.xlabel('timestamp', fontsize=12) +plt.ylabel('load', fontsize=12) +plt.show() +``` -Optional: add a screenshot of the completed lesson's UI if appropriate +![july](images/july-2014.png) -## [Post-lecture quiz](link-to-quiz-app) +A beautiful plot! Take a look at these plots and see if you can determine any of the characteristics listed above. What can we surmise just by visualizing the data? +In the next lesson, you will create an ARIMA model to create some forecasts. + +## 🚀Challenge + +tbd + +## [Post-lecture quiz](link-to-quiz-app) ## Review & Self Study **Assignment**: [Assignment Name](assignment.md) diff --git a/TimeSeries/1-Introduction/images/currency.png b/TimeSeries/1-Introduction/images/currency.png new file mode 100644 index 0000000000000000000000000000000000000000..7f4b77eb70316291d42e198eae7c72c91dc07dab GIT binary patch literal 72656 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 Qfl!3Er=LgpuJ8;025?YV1ONa4 literal 0 HcmV?d00001 diff --git a/TimeSeries/1-Introduction/images/energy-plot.png b/TimeSeries/1-Introduction/images/energy-plot.png new file mode 100644 index 0000000000000000000000000000000000000000..09c9bd85df8b3fab69623d023a788d963742fd6b GIT binary patch literal 46268 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 WS{fPZdeB~<-La-Ug_HD|C$kTwZvPo^`?MmL} z8PSC^!#%+%-8sF&Zt2XO3b`|^B0X^DJF z&=!>BGjHjm;FtdwQU6cG>Zp0OTOAsu3o8&@I&*L4!OAvStm)NJYvzsCVf8M7CahiJ ziRf!RB38mWv`^h_V)>&sv|%Hmuz5)>M#~0ly{#?1n^))D!pv^NolA#eXR&kNyy^$P zJU`qQ+1}3XgX#LU9v(2wrmbs3Z<-X-`GGjkQ^6qo+7X^ek%dF83-vIH&d<+#AVu*; zOnR}%A{7ZQt<&G`ea{=p+mHK<2=!3MJE|o znq`IYY>9>*8&C7BKt??l={U>PG{8RXb$530p9VbV^7Nt?tFuGo)RG+dq_brlp^R5B zJv81(B)ReVBvD!!S6!e3fj0h$kQvjaj!ivDQf}(~q&T!nz$aR=ShF-WwKx@u8>avh zNX}ruCoxZr%K%JMi-AoTc&eH4eidVBe93c`aoMny`AERbIyKY4a@hde_~ouEeR;Km zWd?nl%0TiH<5~KjMBc+){`nC7uDDduh~u@3g3IVY#N&+TT17994v(XFEM*dpQx@%` zR;lBxd%(}4EbU^I-8cL+$+1x?I>vO5xJlGKKdDCF4Qy~gM+fIu%Y1?hmTeRWcspPlrJ=#KB%az|Fr{l}pxX6|jn<$K5;7eml fZd;3`RF&Qk-&t1UQHJTI{E2-g%AVPv)#v>SN3L3e literal 0 HcmV?d00001 diff --git a/TimeSeries/1-Introduction/solution/common/__pycache__/utils.cpython-37.pyc b/TimeSeries/1-Introduction/solution/common/__pycache__/utils.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9af355373639dc0bf4f6cdd181b4862e5872fdca GIT binary patch literal 4602 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.1.1 +- ipykernel>=4.6.1 +- jupyter>=1.0.0 +- matplotlib==3.0.0 +- numpy==1.16.2 +- pandas==0.23.4 +- tensorflow==1.12.0 +- keras==2.2.4 +- scikit-learn==0.20.3 +- statsmodels==0.9.0 +- xlrd >= 1.0.0 +- pip: + - pyramid-arima==0.8.1 \ No newline at end of file diff --git a/TimeSeries/1-Introduction/solution/common/extract_data.py b/TimeSeries/1-Introduction/solution/common/extract_data.py new file mode 100644 index 00000000..04636cd0 --- /dev/null +++ b/TimeSeries/1-Introduction/solution/common/extract_data.py @@ -0,0 +1,37 @@ +import zipfile +import os +import sys +import pandas as pd + +# This function unzips the GEFCom2014 data zip file and extracts the 'extended' +# load forecasting competition data. Data is saved in energy.csv +def extract_data(data_dir): + GEFCom_dir = os.path.join(data_dir, 'GEFCom2014', 'GEFCom2014 Data') + + GEFCom_zipfile = os.path.join(data_dir, 'GEFCom2014.zip') + if not os.path.exists(GEFCom_zipfile): + sys.exit("Download GEFCom2014.zip from https://www.dropbox.com/s/pqenrr2mcvl0hk9/GEFCom2014.zip?dl=0 and save it to the '{}' directory.".format(data_dir)) + + # unzip root directory + zip_ref = zipfile.ZipFile(GEFCom_zipfile, 'r') + zip_ref.extractall(os.path.join(data_dir, 'GEFCom2014')) + zip_ref.close() + + # extract the extended competition data + zip_ref = zipfile.ZipFile(os.path.join(GEFCom_dir, 'GEFCom2014-E_V2.zip'), 'r') + zip_ref.extractall(os.path.join(data_dir, 'GEFCom2014-E')) + zip_ref.close() + + # load the data from Excel file + data = pd.read_excel(os.path.join(data_dir, 'GEFCom2014-E', 'GEFCom2014-E.xlsx'), parse_date='Date') + + # create timestamp variable from Date and Hour + data['timestamp'] = data['Date'].add(pd.to_timedelta(data.Hour - 1, unit='h')) + data = data[['timestamp', 'load', 'T']] + data = data.rename(columns={'T':'temp'}) + + # remove time period with no load data + data = data[data.timestamp >= '2012-01-01'] + + # save to csv + data.to_csv(os.path.join(data_dir, 'energy.csv'), index=False) diff --git a/TimeSeries/1-Introduction/solution/common/utils.py b/TimeSeries/1-Introduction/solution/common/utils.py new file mode 100644 index 00000000..43bff23f --- /dev/null +++ b/TimeSeries/1-Introduction/solution/common/utils.py @@ -0,0 +1,145 @@ +import numpy as np +import pandas as pd +import os +from collections import UserDict + +def load_data(data_dir): + """Load the GEFCom 2014 energy load data""" + + energy = pd.read_csv(os.path.join(data_dir, 'energy.csv'), parse_dates=['timestamp']) + + # Reindex the dataframe such that the dataframe has a record for every time point + # between the minimum and maximum timestamp in the time series. This helps to + # identify missing time periods in the data (there are none in this dataset). + + energy.index = energy['timestamp'] + energy = energy.reindex(pd.date_range(min(energy['timestamp']), + max(energy['timestamp']), + freq='H')) + energy = energy.drop('timestamp', axis=1) + + return energy + + +def mape(predictions, actuals): + """Mean absolute percentage error""" + return ((predictions - actuals).abs() / actuals).mean() + + +def create_evaluation_df(predictions, test_inputs, H, scaler): + """Create a data frame for easy evaluation""" + eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, H+1)]) + eval_df['timestamp'] = test_inputs.dataframe.index + eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h') + eval_df['actual'] = np.transpose(test_inputs['target']).ravel() + eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']]) + return eval_df + + +class TimeSeriesTensor(UserDict): + """A dictionary of tensors for input into the RNN model. + + Use this class to: + 1. Shift the values of the time series to create a Pandas dataframe containing all the data + for a single training example + 2. Discard any samples with missing values + 3. Transform this Pandas dataframe into a numpy array of shape + (samples, time steps, features) for input into Keras + + The class takes the following parameters: + - **dataset**: original time series + - **target** name of the target column + - **H**: the forecast horizon + - **tensor_structures**: a dictionary discribing the tensor structure of the form + { 'tensor_name' : (range(max_backward_shift, max_forward_shift), [feature, feature, ...] ) } + if features are non-sequential and should not be shifted, use the form + { 'tensor_name' : (None, [feature, feature, ...])} + - **freq**: time series frequency (default 'H' - hourly) + - **drop_incomplete**: (Boolean) whether to drop incomplete samples (default True) + """ + + def __init__(self, dataset, target, H, tensor_structure, freq='H', drop_incomplete=True): + self.dataset = dataset + self.target = target + self.tensor_structure = tensor_structure + self.tensor_names = list(tensor_structure.keys()) + + self.dataframe = self._shift_data(H, freq, drop_incomplete) + self.data = self._df2tensors(self.dataframe) + + def _shift_data(self, H, freq, drop_incomplete): + + # Use the tensor_structures definitions to shift the features in the original dataset. + # The result is a Pandas dataframe with multi-index columns in the hierarchy + # tensor - the name of the input tensor + # feature - the input feature to be shifted + # time step - the time step for the RNN in which the data is input. These labels + # are centred on time t. the forecast creation time + df = self.dataset.copy() + + idx_tuples = [] + for t in range(1, H+1): + df['t+'+str(t)] = df[self.target].shift(t*-1, freq=freq) + idx_tuples.append(('target', 'y', 't+'+str(t))) + + for name, structure in self.tensor_structure.items(): + rng = structure[0] + dataset_cols = structure[1] + + for col in dataset_cols: + + # do not shift non-sequential 'static' features + if rng is None: + df['context_'+col] = df[col] + idx_tuples.append((name, col, 'static')) + + else: + for t in rng: + sign = '+' if t > 0 else '' + shift = str(t) if t != 0 else '' + period = 't'+sign+shift + shifted_col = name+'_'+col+'_'+period + df[shifted_col] = df[col].shift(t*-1, freq=freq) + idx_tuples.append((name, col, period)) + + df = df.drop(self.dataset.columns, axis=1) + idx = pd.MultiIndex.from_tuples(idx_tuples, names=['tensor', 'feature', 'time step']) + df.columns = idx + + if drop_incomplete: + df = df.dropna(how='any') + + return df + + def _df2tensors(self, dataframe): + + # Transform the shifted Pandas dataframe into the multidimensional numpy arrays. These + # arrays can be used to input into the keras model and can be accessed by tensor name. + # For example, for a TimeSeriesTensor object named "model_inputs" and a tensor named + # "target", the input tensor can be acccessed with model_inputs['target'] + + inputs = {} + y = dataframe['target'] + y = y.as_matrix() + inputs['target'] = y + + for name, structure in self.tensor_structure.items(): + rng = structure[0] + cols = structure[1] + tensor = dataframe[name][cols].as_matrix() + if rng is None: + tensor = tensor.reshape(tensor.shape[0], len(cols)) + else: + tensor = tensor.reshape(tensor.shape[0], len(cols), len(rng)) + tensor = np.transpose(tensor, axes=[0, 2, 1]) + inputs[name] = tensor + + return inputs + + def subset_data(self, new_dataframe): + + # Use this function to recreate the input tensors if the shifted dataframe + # has been filtered. + + self.dataframe = new_dataframe + self.data = self._df2tensors(self.dataframe) diff --git a/TimeSeries/1-Introduction/solution/notebook.ipynb b/TimeSeries/1-Introduction/solution/notebook.ipynb index 206a803a..a973dbda 100644 --- a/TimeSeries/1-Introduction/solution/notebook.ipynb +++ b/TimeSeries/1-Introduction/solution/notebook.ipynb @@ -17,7 +17,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 9, "metadata": {}, "outputs": [], "source": [ @@ -37,37 +37,26 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 10, "metadata": {}, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "--2021-05-07 21:05:54-- https://www.dropbox.com/s/pqenrr2mcvl0hk9/GEFCom2014.zip\n", - "Resolving www.dropbox.com (www.dropbox.com)... 162.125.4.18, 2620:100:601c:18::a27d:612\n", - "Connecting to www.dropbox.com (www.dropbox.com)|162.125.4.18|:443... connected.\n", - "HTTP request sent, awaiting response... 301 Moved Permanently\n", - "Location: /s/raw/pqenrr2mcvl0hk9/GEFCom2014.zip [following]\n", - "--2021-05-07 21:05:54-- https://www.dropbox.com/s/raw/pqenrr2mcvl0hk9/GEFCom2014.zip\n", - "Reusing existing connection to www.dropbox.com:443.\n", - "HTTP request sent, awaiting response... 302 Found\n", - "Location: https://ucc95032fcc08d2029d05fd28ee3.dl.dropboxusercontent.com/cd/0/inline/BOCEToGt2aevQV-5JUv11oxvMKeMZawCv8xKhhnnNRk_WU4Kx0krYjqWCnZ5Mz-Mo4zz1s3aU-g-8ht9eLRMmjrvpWF64YWmIuCc8DcCC5lcQLw1nRq9PVdV-UorUHEGwc--ii4p-BgruOSvYD2Z_sIG/file# [following]\n", - "--2021-05-07 21:05:55-- https://ucc95032fcc08d2029d05fd28ee3.dl.dropboxusercontent.com/cd/0/inline/BOCEToGt2aevQV-5JUv11oxvMKeMZawCv8xKhhnnNRk_WU4Kx0krYjqWCnZ5Mz-Mo4zz1s3aU-g-8ht9eLRMmjrvpWF64YWmIuCc8DcCC5lcQLw1nRq9PVdV-UorUHEGwc--ii4p-BgruOSvYD2Z_sIG/file\n", - "Resolving ucc95032fcc08d2029d05fd28ee3.dl.dropboxusercontent.com (ucc95032fcc08d2029d05fd28ee3.dl.dropboxusercontent.com)... 162.125.9.15, 2620:100:6020:15::a27d:400f\n", - "Connecting to ucc95032fcc08d2029d05fd28ee3.dl.dropboxusercontent.com (ucc95032fcc08d2029d05fd28ee3.dl.dropboxusercontent.com)|162.125.9.15|:443... connected.\n", - "HTTP request sent, awaiting response... 302 Found\n", - "Location: /cd/0/inline2/BOBC3MCVXz0vCSNRo54hXfys_k17p8iSBszS5JgLbM0yzIThhytWiSw26nBAwT75Lqdd1Bm1RSlPRNQkYpJMesKBH-4Rm6o4WE-_vqWZo9ed7P4RWOY2Igvv5Mb4jixpp_rzihr24R_o22mTga57do_U6sy4GyAaso-ruDruvgLS_xBkzieyPgxcn640haWKrBwAuKMqsS9qEQ8MAwPekj7P4WmQcl-Al5X4ifm4YHKthQoooJ4ZDcz7-axWp8eQ23XqlQ4QvL0nsi7unWBQi_BOPSXXlqTN9IfeZpegQjNLFXi7zBko9Qkvo5BNFhTFNY-BBDbQDCQB-Xj6ENCBLiK1N7bbAUQW_n-WQc3PNVfpMva8kufOnA2yB4aYT7dgfs0/file [following]\n", - "--2021-05-07 21:05:55-- https://ucc95032fcc08d2029d05fd28ee3.dl.dropboxusercontent.com/cd/0/inline2/BOBC3MCVXz0vCSNRo54hXfys_k17p8iSBszS5JgLbM0yzIThhytWiSw26nBAwT75Lqdd1Bm1RSlPRNQkYpJMesKBH-4Rm6o4WE-_vqWZo9ed7P4RWOY2Igvv5Mb4jixpp_rzihr24R_o22mTga57do_U6sy4GyAaso-ruDruvgLS_xBkzieyPgxcn640haWKrBwAuKMqsS9qEQ8MAwPekj7P4WmQcl-Al5X4ifm4YHKthQoooJ4ZDcz7-axWp8eQ23XqlQ4QvL0nsi7unWBQi_BOPSXXlqTN9IfeZpegQjNLFXi7zBko9Qkvo5BNFhTFNY-BBDbQDCQB-Xj6ENCBLiK1N7bbAUQW_n-WQc3PNVfpMva8kufOnA2yB4aYT7dgfs0/file\n", - "Reusing existing connection to ucc95032fcc08d2029d05fd28ee3.dl.dropboxusercontent.com:443.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 126360077 (121M) [application/zip]\n", - "Saving to: ‘GEFCom2014.zip’\n", - "\n", - "GEFCom2014.zip 100%[===================>] 120.51M 88.0MB/s in 1.4s \n", - "\n", - "2021-05-07 21:05:58 (88.0 MB/s) - ‘GEFCom2014.zip’ saved [126360077/126360077]\n", - "\n" + "dyld: Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib\n", + " Referenced from: /usr/local/bin/wget\n", + " Reason: image not found\n", + "mv: rename GEFCom2014.zip to ./data/GEFCom2014.zip: No such file or directory\n" + ] + }, + { + "output_type": "error", + "ename": "SystemExit", + "evalue": "Download GEFCom2014.zip from https://www.dropbox.com/s/pqenrr2mcvl0hk9/GEFCom2014.zip?dl=0 and save it to the './data' directory.", + "traceback": [ + "An exception has occurred, use %tb to see the full traceback.\n", + "\u001b[0;31mSystemExit\u001b[0m\u001b[0;31m:\u001b[0m Download GEFCom2014.zip from https://www.dropbox.com/s/pqenrr2mcvl0hk9/GEFCom2014.zip?dl=0 and save it to the './data' directory.\n" ] } ], @@ -91,70 +80,27 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
load
2012-01-01 00:00:002698.0
2012-01-01 01:00:002558.0
2012-01-01 02:00:002444.0
2012-01-01 03:00:002402.0
2012-01-01 04:00:002403.0
\n", - "
" - ], - "text/plain": [ - " load\n", - "2012-01-01 00:00:00 2698.0\n", - "2012-01-01 01:00:00 2558.0\n", - "2012-01-01 02:00:00 2444.0\n", - "2012-01-01 03:00:00 2402.0\n", - "2012-01-01 04:00:00 2403.0" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" + "output_type": "error", + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: './data/energy.csv'", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0menergy\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mload_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata_dir\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'load'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0menergy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhead\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/MSFT/curricula/Currriculum-Dev/ml-for-beginners/TimeSeries/1-Introduction/solution/common/utils.py\u001b[0m in \u001b[0;36mload_data\u001b[0;34m(data_dir)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\"\"\"Load the GEFCom 2014 energy load data\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0menergy\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata_dir\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'energy.csv'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparse_dates\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'timestamp'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;31m# Reindex the dataframe such that the dataframe has a record for every time point\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision)\u001b[0m\n\u001b[1;32m 684\u001b[0m )\n\u001b[1;32m 685\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 686\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_read\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 687\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 688\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 450\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 451\u001b[0m \u001b[0;31m# Create the parser.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 452\u001b[0;31m \u001b[0mparser\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mTextFileReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfp_or_buf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 453\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 454\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mchunksize\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0miterator\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m 934\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"has_index_names\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"has_index_names\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 935\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 936\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mengine\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 937\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 938\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m_make_engine\u001b[0;34m(self, engine)\u001b[0m\n\u001b[1;32m 1166\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_make_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mengine\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"c\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1167\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mengine\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"c\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1168\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCParserWrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1169\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1170\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mengine\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"python\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, src, **kwds)\u001b[0m\n\u001b[1;32m 1996\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"usecols\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0musecols\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1997\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1998\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reader\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mparsers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTextReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msrc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1999\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munnamed_cols\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reader\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munnamed_cols\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2000\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mpandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader.__cinit__\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mpandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._setup_parser_source\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: './data/energy.csv'" + ] } ], "source": [ @@ -248,9 +194,8 @@ "name": "python3" }, "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" + "name": "python37364bit8d3b438fb5fc4430a93ac2cb74d693a7", + "display_name": "Python 3.7.0 64-bit ('3.7')" }, "language_info": { "codemirror_mode": { @@ -262,10 +207,15 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.6.9" + "version": "3.7.0" }, "nteract": { "version": "nteract-front-end@1.0.0" + }, + "metadata": { + "interpreter": { + "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d" + } } }, "nbformat": 4, diff --git a/TimeSeries/1-Introduction/working/common/__init__.py b/TimeSeries/1-Introduction/working/common/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/TimeSeries/1-Introduction/working/common/__pycache__/__init__.cpython-37.pyc b/TimeSeries/1-Introduction/working/common/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e04cc8b02a9248f67eba365e78bffa9ec46e2630 GIT binary patch literal 214 zcmYL@F$w}P5Jj_KA%b`gi#S->h=?wNg*Lm^QM2O`-6YFoqgZ(nFW{AIy@i#DAb$97 z{tUw~vu?M;f_kI-Hr7|fPe};VVAl#LSjPIv`oSoU|9IbE#$bgBtGVX*#|5vJXrt$ literal 0 HcmV?d00001 diff --git a/TimeSeries/1-Introduction/working/common/__pycache__/extract_data.cpython-37.pyc b/TimeSeries/1-Introduction/working/common/__pycache__/extract_data.cpython-37.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fc2ca0ba4aa0cfebd2e26d574854b321044025ac GIT binary patch literal 1220 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 literal 0 HcmV?d00001 diff --git a/TimeSeries/1-Introduction/working/common/environment.yaml b/TimeSeries/1-Introduction/working/common/environment.yaml new file mode 100644 index 00000000..bed0f5c4 --- /dev/null +++ b/TimeSeries/1-Introduction/working/common/environment.yaml @@ -0,0 +1,28 @@ +# To create the conda environment: +# $ conda env create -f environment.yaml +# +# To update the conda environment: +# $ conda env update -f environment.yaml +# +# To register the conda environment in Jupyter: +# $ conda activate dlts +# $ python -m ipykernel install --user --name dlts --display-name "Python (dlts)" + +name: dlts +channels: +- defaults +dependencies: +- python==3.6.6 +- pip>=19.1.1 +- ipykernel>=4.6.1 +- jupyter>=1.0.0 +- matplotlib==3.0.0 +- numpy==1.16.2 +- pandas==0.23.4 +- tensorflow==1.12.0 +- keras==2.2.4 +- scikit-learn==0.20.3 +- statsmodels==0.9.0 +- xlrd >= 1.0.0 +- pip: + - pyramid-arima==0.8.1 \ No newline at end of file diff --git a/TimeSeries/1-Introduction/working/common/extract_data.py b/TimeSeries/1-Introduction/working/common/extract_data.py new file mode 100644 index 00000000..04636cd0 --- /dev/null +++ b/TimeSeries/1-Introduction/working/common/extract_data.py @@ -0,0 +1,37 @@ +import zipfile +import os +import sys +import pandas as pd + +# This function unzips the GEFCom2014 data zip file and extracts the 'extended' +# load forecasting competition data. Data is saved in energy.csv +def extract_data(data_dir): + GEFCom_dir = os.path.join(data_dir, 'GEFCom2014', 'GEFCom2014 Data') + + GEFCom_zipfile = os.path.join(data_dir, 'GEFCom2014.zip') + if not os.path.exists(GEFCom_zipfile): + sys.exit("Download GEFCom2014.zip from https://www.dropbox.com/s/pqenrr2mcvl0hk9/GEFCom2014.zip?dl=0 and save it to the '{}' directory.".format(data_dir)) + + # unzip root directory + zip_ref = zipfile.ZipFile(GEFCom_zipfile, 'r') + zip_ref.extractall(os.path.join(data_dir, 'GEFCom2014')) + zip_ref.close() + + # extract the extended competition data + zip_ref = zipfile.ZipFile(os.path.join(GEFCom_dir, 'GEFCom2014-E_V2.zip'), 'r') + zip_ref.extractall(os.path.join(data_dir, 'GEFCom2014-E')) + zip_ref.close() + + # load the data from Excel file + data = pd.read_excel(os.path.join(data_dir, 'GEFCom2014-E', 'GEFCom2014-E.xlsx'), parse_date='Date') + + # create timestamp variable from Date and Hour + data['timestamp'] = data['Date'].add(pd.to_timedelta(data.Hour - 1, unit='h')) + data = data[['timestamp', 'load', 'T']] + data = data.rename(columns={'T':'temp'}) + + # remove time period with no load data + data = data[data.timestamp >= '2012-01-01'] + + # save to csv + data.to_csv(os.path.join(data_dir, 'energy.csv'), index=False) diff --git a/TimeSeries/1-Introduction/working/common/utils.py b/TimeSeries/1-Introduction/working/common/utils.py new file mode 100644 index 00000000..43bff23f --- /dev/null +++ b/TimeSeries/1-Introduction/working/common/utils.py @@ -0,0 +1,145 @@ +import numpy as np +import pandas as pd +import os +from collections import UserDict + +def load_data(data_dir): + """Load the GEFCom 2014 energy load data""" + + energy = pd.read_csv(os.path.join(data_dir, 'energy.csv'), parse_dates=['timestamp']) + + # Reindex the dataframe such that the dataframe has a record for every time point + # between the minimum and maximum timestamp in the time series. This helps to + # identify missing time periods in the data (there are none in this dataset). + + energy.index = energy['timestamp'] + energy = energy.reindex(pd.date_range(min(energy['timestamp']), + max(energy['timestamp']), + freq='H')) + energy = energy.drop('timestamp', axis=1) + + return energy + + +def mape(predictions, actuals): + """Mean absolute percentage error""" + return ((predictions - actuals).abs() / actuals).mean() + + +def create_evaluation_df(predictions, test_inputs, H, scaler): + """Create a data frame for easy evaluation""" + eval_df = pd.DataFrame(predictions, columns=['t+'+str(t) for t in range(1, H+1)]) + eval_df['timestamp'] = test_inputs.dataframe.index + eval_df = pd.melt(eval_df, id_vars='timestamp', value_name='prediction', var_name='h') + eval_df['actual'] = np.transpose(test_inputs['target']).ravel() + eval_df[['prediction', 'actual']] = scaler.inverse_transform(eval_df[['prediction', 'actual']]) + return eval_df + + +class TimeSeriesTensor(UserDict): + """A dictionary of tensors for input into the RNN model. + + Use this class to: + 1. Shift the values of the time series to create a Pandas dataframe containing all the data + for a single training example + 2. Discard any samples with missing values + 3. Transform this Pandas dataframe into a numpy array of shape + (samples, time steps, features) for input into Keras + + The class takes the following parameters: + - **dataset**: original time series + - **target** name of the target column + - **H**: the forecast horizon + - **tensor_structures**: a dictionary discribing the tensor structure of the form + { 'tensor_name' : (range(max_backward_shift, max_forward_shift), [feature, feature, ...] ) } + if features are non-sequential and should not be shifted, use the form + { 'tensor_name' : (None, [feature, feature, ...])} + - **freq**: time series frequency (default 'H' - hourly) + - **drop_incomplete**: (Boolean) whether to drop incomplete samples (default True) + """ + + def __init__(self, dataset, target, H, tensor_structure, freq='H', drop_incomplete=True): + self.dataset = dataset + self.target = target + self.tensor_structure = tensor_structure + self.tensor_names = list(tensor_structure.keys()) + + self.dataframe = self._shift_data(H, freq, drop_incomplete) + self.data = self._df2tensors(self.dataframe) + + def _shift_data(self, H, freq, drop_incomplete): + + # Use the tensor_structures definitions to shift the features in the original dataset. + # The result is a Pandas dataframe with multi-index columns in the hierarchy + # tensor - the name of the input tensor + # feature - the input feature to be shifted + # time step - the time step for the RNN in which the data is input. These labels + # are centred on time t. the forecast creation time + df = self.dataset.copy() + + idx_tuples = [] + for t in range(1, H+1): + df['t+'+str(t)] = df[self.target].shift(t*-1, freq=freq) + idx_tuples.append(('target', 'y', 't+'+str(t))) + + for name, structure in self.tensor_structure.items(): + rng = structure[0] + dataset_cols = structure[1] + + for col in dataset_cols: + + # do not shift non-sequential 'static' features + if rng is None: + df['context_'+col] = df[col] + idx_tuples.append((name, col, 'static')) + + else: + for t in rng: + sign = '+' if t > 0 else '' + shift = str(t) if t != 0 else '' + period = 't'+sign+shift + shifted_col = name+'_'+col+'_'+period + df[shifted_col] = df[col].shift(t*-1, freq=freq) + idx_tuples.append((name, col, period)) + + df = df.drop(self.dataset.columns, axis=1) + idx = pd.MultiIndex.from_tuples(idx_tuples, names=['tensor', 'feature', 'time step']) + df.columns = idx + + if drop_incomplete: + df = df.dropna(how='any') + + return df + + def _df2tensors(self, dataframe): + + # Transform the shifted Pandas dataframe into the multidimensional numpy arrays. These + # arrays can be used to input into the keras model and can be accessed by tensor name. + # For example, for a TimeSeriesTensor object named "model_inputs" and a tensor named + # "target", the input tensor can be acccessed with model_inputs['target'] + + inputs = {} + y = dataframe['target'] + y = y.as_matrix() + inputs['target'] = y + + for name, structure in self.tensor_structure.items(): + rng = structure[0] + cols = structure[1] + tensor = dataframe[name][cols].as_matrix() + if rng is None: + tensor = tensor.reshape(tensor.shape[0], len(cols)) + else: + tensor = tensor.reshape(tensor.shape[0], len(cols), len(rng)) + tensor = np.transpose(tensor, axes=[0, 2, 1]) + inputs[name] = tensor + + return inputs + + def subset_data(self, new_dataframe): + + # Use this function to recreate the input tensors if the shifted dataframe + # has been filtered. + + self.dataframe = new_dataframe + self.data = self._df2tensors(self.dataframe) diff --git a/TimeSeries/1-Introduction/working/notebook.ipynb b/TimeSeries/1-Introduction/working/notebook.ipynb new file mode 100644 index 00000000..56d4c74e --- /dev/null +++ b/TimeSeries/1-Introduction/working/notebook.ipynb @@ -0,0 +1,111 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "import os\n", + "import matplotlib.pyplot as plt\n", + "from common.utils import load_data\n", + "from common.extract_data import extract_data\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "output_type": "error", + "ename": "TypeError", + "evalue": "read_excel() got an unexpected keyword argument 'parse_date'", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mTypeError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[1;32m 2\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexists\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata_dir\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'energy.csv'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 4\u001b[0;31m \u001b[0mextract_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata_dir\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m", + "\u001b[0;32m~/Documents/MSFT/curricula/Currriculum-Dev/ml-for-beginners/TimeSeries/1-Introduction/working/common/extract_data.py\u001b[0m in \u001b[0;36mextract_data\u001b[0;34m(data_dir)\u001b[0m\n\u001b[1;32m 24\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 25\u001b[0m \u001b[0;31m# load the data from Excel file\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 26\u001b[0;31m \u001b[0mdata\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_excel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata_dir\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'GEFCom2014-E'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'GEFCom2014-E.xlsx'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparse_date\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m'Date'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 27\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 28\u001b[0m \u001b[0;31m# create timestamp variable from Date and Hour\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/util/_decorators.py\u001b[0m in \u001b[0;36mwrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 294\u001b[0m )\n\u001b[1;32m 295\u001b[0m \u001b[0mwarnings\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwarn\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmsg\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mFutureWarning\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstacklevel\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mstacklevel\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 296\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfunc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m*\u001b[0m\u001b[0margs\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwargs\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 297\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 298\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mwrapper\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;31mTypeError\u001b[0m: read_excel() got an unexpected keyword argument 'parse_date'" + ] + } + ], + "source": [ + "data_dir = './data'\n", + "\n", + "if not os.path.exists(os.path.join(data_dir, 'energy.csv')):\n", + " extract_data(data_dir)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "output_type": "error", + "ename": "FileNotFoundError", + "evalue": "[Errno 2] No such file or directory: './data/energy.csv'", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)", + "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0menergy\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mload_data\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata_dir\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'load'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0menergy\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhead\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/Documents/MSFT/curricula/Currriculum-Dev/ml-for-beginners/TimeSeries/1-Introduction/working/common/utils.py\u001b[0m in \u001b[0;36mload_data\u001b[0;34m(data_dir)\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0;34m\"\"\"Load the GEFCom 2014 energy load data\"\"\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 8\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 9\u001b[0;31m \u001b[0menergy\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mpath\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjoin\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdata_dir\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'energy.csv'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparse_dates\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'timestamp'\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 10\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 11\u001b[0m \u001b[0;31m# Reindex the dataframe such that the dataframe has a record for every time point\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision)\u001b[0m\n\u001b[1;32m 684\u001b[0m )\n\u001b[1;32m 685\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 686\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_read\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 687\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 688\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 450\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 451\u001b[0m \u001b[0;31m# Create the parser.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 452\u001b[0;31m \u001b[0mparser\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mTextFileReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfp_or_buf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 453\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 454\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mchunksize\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0miterator\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m 934\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"has_index_names\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"has_index_names\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 935\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 936\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mengine\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 937\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 938\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m_make_engine\u001b[0;34m(self, engine)\u001b[0m\n\u001b[1;32m 1166\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_make_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mengine\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"c\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1167\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mengine\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"c\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1168\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCParserWrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1169\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1170\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mengine\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"python\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, src, **kwds)\u001b[0m\n\u001b[1;32m 1996\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"usecols\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0musecols\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1997\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1998\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reader\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mparsers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTextReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msrc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1999\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munnamed_cols\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reader\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munnamed_cols\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2000\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32mpandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader.__cinit__\u001b[0;34m()\u001b[0m\n", + "\u001b[0;32mpandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._setup_parser_source\u001b[0;34m()\u001b[0m\n", + "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: './data/energy.csv'" + ] + } + ], + "source": [ + "energy = load_data(data_dir)[['load']]\n", + "energy.head()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernel_info": { + "name": "python3" + }, + "kernelspec": { + "name": "python37364bit8d3b438fb5fc4430a93ac2cb74d693a7", + "display_name": "Python 3.7.0 64-bit ('3.7')" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.0" + }, + "nteract": { + "version": "nteract-front-end@1.0.0" + }, + "metadata": { + "interpreter": { + "hash": "70b38d7a306a849643e446cd70466270a13445e5987dfa1344ef2b127438fa4d" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} \ No newline at end of file