Commit fcd81614 authored by Mirko Birbaumer's avatar Mirko Birbaumer
Browse files

Formulation of questions

parent 1079c388
Pipeline #446901 passed with stage
in 12 minutes and 9 seconds
%% Cell type:markdown id: tags:
# Exercise 1 - Classifying newswires: A multiclass classification example
In this exercise, you will build a model to classify Reuters newswires into 46 mutually exclusive topics. Because we have many classes, this problem is an instance of multiclass classification, and because each data point should be classified into only one category, the problem is more specifically an instance of single-label multiclass classification.
If each data point could belong to multiple categories (in this case, topics), we’d be facing a multilabel multiclass classification problem.
%% Cell type:markdown id: tags:
### The Reuters dataset
You’ll work with the _Reuters_ dataset, a set of short newswires and their topics, published by Reuters in 1986. It’s a simple, widely used toy dataset for text classification. There are 46 different topics; some topics are more represented than others, but each topic
has at least 10 examples in the training set.
Like IMDB and MNIST, the Reuters dataset comes packaged as part of Keras. Let’s take a look.
%% Cell type:code id: tags:
``` python
from tensorflow.keras.datasets import reuters
(train_data, train_labels), (test_data, test_labels) = reuters.load_data(num_words=10000)
```
%% Cell type:markdown id: tags:
As with the IMDB dataset, the argument `num_words=10000` restricts the data to the 10'000 most frequently occurring words found in the data.
You have 8'982 training examples and 2'246 test examples:
%% Cell type:code id: tags:
``` python
print(len(train_data))
print(len(test_data))
```
%%%% Output: stream
8982
2246
%% Cell type:markdown id: tags:
As with the IMDB reviews, each example is a list of integers (word indices):
%% Cell type:code id: tags:
``` python
train_data[10]
```
%%%% Output: execute_result
[1,
245,
273,
207,
156,
53,
74,
160,
26,
14,
46,
296,
26,
39,
74,
2979,
3554,
14,
46,
4689,
4329,
86,
61,
3499,
4795,
14,
61,
451,
4329,
17,
12]
%% Cell type:markdown id: tags:
Here’s how you can decode it back to words, in case you’re curious.
%% Cell type:code id: tags:
``` python
word_index = reuters.get_word_index()
reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])
decoded_newswire = " ".join(
# Note that the indices are offset by 3 because 0, 1,
# and 2 are reserved indices for “padding,”
# “start of sequence,” and “unknown.”
[reverse_word_index.get(i - 3, "?") for i in train_data[10]])
```
%% Cell type:code id: tags:
``` python
decoded_newswire
```
%%%% Output: execute_result
'? period ended december 31 shr profit 11 cts vs loss 24 cts net profit 224 271 vs loss 511 349 revs 7 258 688 vs 7 200 349 reuter 3'
%% Cell type:markdown id: tags:
The label associated with an example is an integer between 0 and 45 — a _topic_ index:
%% Cell type:code id: tags:
``` python
train_labels[10]
```
%%%% Output: execute_result
3
%% Cell type:code id: tags:
``` python
dataset = [decoded_newswire[1:-1]]
print(dataset)
```
%%%% Output: stream
[' period ended december 31 shr profit 11 cts vs loss 24 cts net profit 224 271 vs loss 511 349 revs 7 258 688 vs 7 200 349 reuter ']
%% Cell type:code id: tags:
``` python
from tensorflow.keras.layers import TextVectorization
text_vectorization = TextVectorization(
# Configures the layer to return sequences of words encoded
# as integer indices. There are several other output modes
# available, which you will see in action in a bit.
output_mode="int",
)
text_vectorization.adapt(dataset)
text_vectorization.get_vocabulary()
```
%%%% Output: execute_result
['',
'[UNK]',
'vs',
'profit',
'loss',
'cts',
'7',
'349',
'shr',
'revs',
'reuter',
'period',
'net',
'ended',
'december',
'688',
'511',
'31',
'271',
'258',
'24',
'224',
'200',
'11']
%% Cell type:markdown id: tags:
### TODO: Preparing the Data
Multi-hot encode your lists to turn them into vectors of 0s and 1s. This would
mean, for instance, turning the sequence $[8, 5]$ into a 10'000-dimensional vector
that would be all 0s except for indices 8 and 5, which would be 1s.
%% Cell type:code id: tags:
``` python
import numpy as np
def vectorize_sequences(sequences, dimension=10000):
results = np.zeros((len(sequences), dimension))
for i, sequence in enumerate(sequences):
for j in sequence:
results[i, j] = 1.
<< YOUR CODE HERE >>
return results
```
%% Cell type:code id: tags:
``` python
X_train = vectorize_sequences(train_data)
X_test = vectorize_sequences(test_data)
```
%% Cell type:markdown id: tags:
### TODO: One-Hot Encode the Labels
To vectorize the labels, there are two possibilities:
1. you can cast the label list as an integer tensor, or
2. you can use one-hot encoding.
One-hot encoding is a widely used format for categorical data, also called categorical encoding. In this case, one-hot encoding of
the labels consists of embedding each label as an all-zero vector with a 1 in the place of the label index.
%% Cell type:code id: tags:
``` python
from tensorflow.keras.utils import to_categorical
y_train = to_categorical(train_labels)
y_test = to_categorical(test_labels)
y_train = << YOUR CODE HERE >>
y_test = << YOUR CODE HERE >>
```
%% Cell type:markdown id: tags:
### TODO: Building your Fully Connected Neural Network Model
In this topic-classification we are trying to classify short snippets of text. The number of output classes is 46.
In a stack of Dense layers like those we’ve been using, each layer can only access information present in the output of the previous layer.
If one layer drops some information relevant to the classification problem, this information can never be recovered by later layers: each layer can potentially become an information bottleneck. To learn to separate 46 different classes:
too small layers may act as information bottlenecks, permanently dropping relevant information. For this reason we’ll use larger layers. Let’s go with 2 hidden layers each consisting of 64 units.
%% Cell type:markdown id: tags:
#### 1. Define Model
%% Cell type:code id: tags:
``` python
import tensorflow as tf
model = tf.keras.Sequential([
tf.keras.layers.Dense(64, activation="relu"),
tf.keras.layers.Dense(64, activation="relu"),
tf.keras.layers.Dense(46, activation="softmax")
<< YOUR CODE HERE >>
])
```
%% Cell type:markdown id: tags:
#### 2. Compile Model
%% Cell type:code id: tags:
``` python
model.compile(optimizer="rmsprop",
loss="categorical_crossentropy",
metrics=["accuracy"])
```
%% Cell type:markdown id: tags:
#### 3. Fit Model
%% Cell type:code id: tags:
``` python
X_val = X_train[:1000]
partial_X_train = X_train[1000:]
y_val = y_train[:1000]
partial_y_train = y_train[1000:]
history = model.fit(partial_X_train,
partial_y_train,
epochs=20,
batch_size=512,
validation_data=(X_val, y_val))
```
%%%% Output: stream
Epoch 1/20
16/16 [==============================] - 5s 243ms/step - loss: 2.6391 - accuracy: 0.5238 - val_loss: 1.7219 - val_accuracy: 0.6400
Epoch 2/20
16/16 [==============================] - 2s 155ms/step - loss: 1.4167 - accuracy: 0.7075 - val_loss: 1.3007 - val_accuracy: 0.7210
Epoch 3/20
16/16 [==============================] - 2s 141ms/step - loss: 1.0560 - accuracy: 0.7781 - val_loss: 1.1373 - val_accuracy: 0.7530
Epoch 4/20
16/16 [==============================] - 2s 121ms/step - loss: 0.8347 - accuracy: 0.8251 - val_loss: 1.0406 - val_accuracy: 0.7780
Epoch 5/20
16/16 [==============================] - 2s 152ms/step - loss: 0.6695 - accuracy: 0.8628 - val_loss: 1.0090 - val_accuracy: 0.7800
Epoch 6/20
16/16 [==============================] - 2s 112ms/step - loss: 0.5355 - accuracy: 0.8923 - val_loss: 0.9347 - val_accuracy: 0.8130
Epoch 7/20
16/16 [==============================] - 2s 114ms/step - loss: 0.4362 - accuracy: 0.9094 - val_loss: 0.9231 - val_accuracy: 0.8070
Epoch 8/20
16/16 [==============================] - 2s 133ms/step - loss: 0.3563 - accuracy: 0.9250 - val_loss: 0.9006 - val_accuracy: 0.8130
Epoch 9/20
16/16 [==============================] - 2s 111ms/step - loss: 0.2967 - accuracy: 0.9367 - val_loss: 1.0024 - val_accuracy: 0.7920
Epoch 10/20
16/16 [==============================] - 2s 136ms/step - loss: 0.2489 - accuracy: 0.9429 - val_loss: 0.9413 - val_accuracy: 0.8070
Epoch 11/20
16/16 [==============================] - 2s 117ms/step - loss: 0.2144 - accuracy: 0.9485 - val_loss: 0.9109 - val_accuracy: 0.8180
Epoch 12/20
16/16 [==============================] - 2s 106ms/step - loss: 0.1908 - accuracy: 0.9516 - val_loss: 0.9332 - val_accuracy: 0.8090
Epoch 13/20
16/16 [==============================] - 2s 111ms/step - loss: 0.1693 - accuracy: 0.9534 - val_loss: 0.9461 - val_accuracy: 0.8090
Epoch 14/20
16/16 [==============================] - 2s 112ms/step - loss: 0.1577 - accuracy: 0.9538 - val_loss: 0.9792 - val_accuracy: 0.8040
Epoch 15/20
16/16 [==============================] - 2s 107ms/step - loss: 0.1422 - accuracy: 0.9558 - val_loss: 1.0086 - val_accuracy: 0.8080
Epoch 16/20
16/16 [==============================] - 2s 113ms/step - loss: 0.1331 - accuracy: 0.9575 - val_loss: 1.0155 - val_accuracy: 0.8070
Epoch 17/20
16/16 [==============================] - 2s 106ms/step - loss: 0.1319 - accuracy: 0.9578 - val_loss: 1.0134 - val_accuracy: 0.8060
Epoch 18/20
16/16 [==============================] - 2s 107ms/step - loss: 0.1206 - accuracy: 0.9568 - val_loss: 1.0325 - val_accuracy: 0.8140
Epoch 19/20
16/16 [==============================] - 1s 93ms/step - loss: 0.1208 - accuracy: 0.9578 - val_loss: 1.0760 - val_accuracy: 0.8020
Epoch 20/20
16/16 [==============================] - 2s 106ms/step - loss: 0.1142 - accuracy: 0.9580 - val_loss: 1.1040 - val_accuracy: 0.8020
%% Cell type:code id: tags:
``` python
import matplotlib.pyplot as plt
loss = history.history["loss"]
val_loss = history.history["val_loss"]
epochs = range(1, len(loss) + 1)
plt.figure(figsize=(8, 8))
plt.plot(epochs, loss, label='Training Loss')
plt.plot(epochs, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
```
%%%% Output: execute_result
Text(0.5, 1.0, 'Training and Validation Loss')
%%%% Output: display_data
![](data:image/png;base64,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)
%% Cell type:code id: tags:
``` python
acc = history.history["accuracy"]
val_acc = history.history["val_accuracy"]
plt.figure(figsize=(8, 8))
plt.plot(epochs, acc, label='Training Accuracy')
plt.plot(epochs, val_acc, label='Validation Accuracy')
plt.legend(loc='upper right')
plt.title('Training and Validation Accuracy')
plt.show()
```
%%%% Output: display_data
![](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAeMAAAHiCAYAAADbK6SdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/d3fzzAAAACXBIWXMAAAsTAAALEwEAmpwYAABMrElEQVR4nO3deXxU1f3G8c/JnkCAhLAHZF9EZAug4ALuW0VwxRW1oLbVamstVdtq1Wpbf12siqVq3UVFpaio7IKoVRAEZAubJKwhCYGQhCxzfn/cSZiEJCRkkjvL8369hkzu3Jn53pkwz5xzz7nXWGsRERER90S4XYCIiEi4UxiLiIi4TGEsIiLiMoWxiIiIyxTGIiIiLlMYi4iIuExhLEHJGPOxMeYmf6/rJmPMNmPMOY3wuIuMMT/2Xr/OGDOnLusex/N0McbkG2Mij7dWkXClMJYm4/2gLr94jDGFPr9fV5/HstZeaK192d/rBiJjzBRjzOJqlqcYY4qNMSfV9bGsta9ba8/zU12VvjxYa7dba5tba8v88fjVPJ8xxmwxxqxtjMcXcZPCWJqM94O6ubW2ObAd+JHPstfL1zPGRLlXZUB6DRhpjOlWZfk1wGpr7RoXanLDGUBboLsxZlhTPrH+JqWxKYzFdcaY0caYTGPMr40xu4H/GGOSjDEfGmOyjDG53uupPvfx7XqdaIz53BjzpHfdrcaYC49z3W7GmMXGmIPGmHnGmGeMMa/VUHddanzEGLPU+3hzjDEpPrffYIz5wRiTbYx5oKbXx1qbCSwAbqhy043AK8eqo0rNE40xn/v8fq4xZr0xJs8Y8zRgfG7rYYxZ4K1vnzHmdWNMK+9trwJdgA+8PRv3GWO6GmNseXAZYzoaY2YZY3KMMZuMMZN8HvshY8zbxphXvK/N98aYtJpeA6+bgP8Cs73XfbervzFmrve59hhj7vcujzTG3G+M2ex9nuXGmM5Va/WuW/XvZKkx5m/GmGzgodpeD+99Ohtj3vO+D9nGmKeNMTHemgb4rNfWGFNgjGlzjO2VMKIwlkDRHkgGTgAm4/xt/sf7exegEHi6lvuPADYAKcCfgReMMeY41n0D+BpoDTzE0QHoqy41XgvcjNOiiwHuBTDGnAhM9T5+R+/zVRugXi/71mKM6QMM8tZb39eq/DFSgPeAB3Fei83AKN9VgMe99fUDOuO8Jlhrb6By78afq3mK6UCm9/5XAH80xpzlc/ul3nVaAbNqq9kYk+B9jNe9l2uMMTHe2xKBecAn3ufqCcz33vUXwATgIqAFcAtQUNvr4mMEsAVoBzxGLa+HcfaTfwj8AHQFOgHTrbXF3m283udxJwDzrbVZdaxDwoG1VhddmvwCbAPO8V4fDRQDcbWsPwjI9fl9EfBj7/WJwCaf2xIAC7Svz7o4QVYKJPjc/hrwWh23qboaH/T5/SfAJ97rv8P5sC6/rZn3NTinhsdOAA4AI72/Pwb89zhfq8+9128EvvJZz+CE549reNzLgBXVvYfe37t6X8sonKAqAxJ9bn8ceMl7/SFgns9tJwKFtby21wNZ3seOA/KAcd7bJvjWVeV+G4Cx1SyvqLWW12n7Md7vitcDOLW8vmrWG4HzxcV4f18GXNXY/8d0Ca6LWsYSKLKstUXlvxhjEowx//J24x4AFgOtTM0jdXeXX7HWlrd8mtdz3Y5Ajs8ygIyaCq5jjbt9rhf41NTR97GttYeA7Jqey1vTO8CN3lb8dcAr9aijOlVrsL6/G2PaGWOmG2N2eB/3NZwWdF2Uv5YHfZb9gNNiLFf1tYkzNe+bvQl421pb6v07eZcjXdWdcVr11anttmOp9N4f4/XoDPxgrS2t+iDW2v/hbN9oY0xfnJb7rOOsSUKUwlgCRdXTh/0S6AOMsNa2wBm8Az77NBvBLiDZ2yVarnMt6zekxl2+j+19ztbHuM/LwFXAuUAi8EED66hag6Hy9v4R530Z4H3c66s8Zm2nfNuJ81om+izrAuw4Rk1H8e7/Pgu43hiz2zjjCq4ALvJ2tWcA3Wu4ewbQo5rlh7w/fd/r9lXWqbp9tb0eGUCXWr5MvOxd/wZghu8XTxFQGEvgSsTZ97nfGJMM/L6xn9Ba+wNOF+JD3oE3pwI/aqQaZwCXGGNO8+77/APH/v+4BNgPTOPI/siG1PER0N8YM94bIndROZASgXwgzxjTCfhVlfvvoYYQtNZmAF8Ajxtj4owxJwO34rQm6+sGYCPOF45B3ktvnC71CTj7ajsYY+42xsQaYxKNMSO8930eeMQY08s4TjbGtLbO/todOAEfaYy5hepD21dtr8fXOF9unjDGNPNus+/+99eAcTiB/MpxvAYS4hTGEqj+DsQD+4CvcAbnNIXrcPb/ZQOPAm8Bh2tY9+8cZ43W2u+Bn+IMwNoF5OKES233sTgf5CdQ+QP9uOqw1u4DrgSewNneXsBSn1UeBobg7J/9CGewl6/HgQeNMfuNMfdW8xQTcPbN7gTeB35vrZ1Xl9qquAl41lq72/cCPAfc5O0KPxfni9NuIB0Y473vX4G3gTk4+9xfwHmtACbhBGo20B/ny0Ntanw9rDO3+kc4XdDbcd7Lq31uzwC+xWlZL6n/SyChrnxAgYhUwxjzFrDeWtvoLXMJbcaYF4Gd1toH3a5FAo/CWMSHcQ4mkQNsBc4DZgKnWmtXuFmXBDdjTFdgJTDYWrvV3WokEKmbWqSy9jhTXPKBp4A7FMTSEMaYR4A1wF8UxFITtYxFRERcppaxiIiIyxTGIiIiLnPtTCQpKSm2a9eubj29iIhIk1q+fPk+a221JwhxLYy7du3KsmXL3Hp6ERGRJmWM+aGm29RNLSIi4jKFsYiIiMsUxiIiIi5zbZ+xiEgoKCkpITMzk6IinYhJHHFxcaSmphIdHV3n+yiMRUQaIDMzk8TERLp27YpzFkoJZ9ZasrOzyczMpFu3bnW+n7qpRUQaoKioiNatWyuIBQBjDK1bt653T4nCWESkgRTE4ut4/h4UxiIiQSw7O5tBgwYxaNAg2rdvT6dOnSp+Ly4urvW+y5Yt46677jrmc4wcOdJf5QJw991306lTJzwej18fN5hpn7GISBBr3bo1K1euBOChhx6iefPm3HvvvRW3l5aWEhVV/Ud9WloaaWlpx3yOL774wi+1Ang8Ht5//306d+7MZ599xpgxY/z22L5q2+5ApJaxiEiImThxIrfffjsjRozgvvvu4+uvv+bUU09l8ODBjBw5kg0bNgCwaNEiLrnkEsAJ8ltuuYXRo0fTvXt3nnrqqYrHa968ecX6o0eP5oorrqBv375cd911lJ/5b/bs2fTt25ehQ4dy1113VTxuVYsWLaJ///7ccccdvPnmmxXL9+zZw7hx4xg4cCADBw6s+ALwyiuvcPLJJzNw4EBuuOGGiu2bMWNGtfWdfvrpXHrppZx44okAXHbZZQwdOpT+/fszbdq0ivt88sknDBkyhIEDB3L22Wfj8Xjo1asXWVlZgPOloWfPnhW/N7bg+dogIhLgHv7ge9buPODXxzyxYwt+/6P+9b5fZmYmX3zxBZGRkRw4cIAlS5YQFRXFvHnzuP/++3n33XePus/69etZuHAhBw8epE+fPtxxxx1HTc9ZsWIF33//PR07dmTUqFEsXbqUtLQ0brvtNhYvXky3bt2YMGFCjXW9+eabTJgwgbFjx3L//fdTUlJCdHQ0d911F2eeeSbvv/8+ZWVl5Ofn8/333/Poo4/yxRdfkJKSQk5OzjG3+9tvv2XNmjUVI5lffPFFkpOTKSwsZNiwYVx++eV4PB4mTZpUUW9OTg4RERFcf/31vP7669x9993MmzePgQMH0qZNtYeS9ju1jEVEQtCVV15JZGQkAHl5eVx55ZWcdNJJ3HPPPXz//ffV3ufiiy8mNjaWlJQU2rZty549e45aZ/jw4aSmphIREcGgQYPYtm0b69evp3v37hUBWFMYFxcXM3v2bC677DJatGjBiBEj+PTTTwFYsGABd9xxBwCRkZG0bNmSBQsWcOWVV5KSkgJAcnLyMbd7+PDhlaYUPfXUUwwcOJBTTjmFjIwM0tPT+eqrrzjjjDMq1it/3FtuuYVXXnkFcEL85ptvPubz+YtaxiIifnI8LdjG0qxZs4rrv/3tbxkzZgzvv/8+27ZtY/To0dXeJzY2tuJ6ZGQkpaWlx7VOTT799FP279/PgAEDACgoKCA+Pr7GLu2aREVFVQz+8ng8lQaq+W73okWLmDdvHl9++SUJCQmMHj261ilHnTt3pl27dixYsICvv/6a119/vV51NYRaxiIiIS4vL49OnToB8NJLL/n98fv06cOWLVvYtm0bAG+99Va167355ps8//zzbNu2jW3btrF161bmzp1LQUEBZ599NlOnTgWgrKyMvLw8zjrrLN555x2ys7MBKrqpu3btyvLlywGYNWsWJSUl1T5fXl4eSUlJJCQksH79er766isATjnlFBYvXszWrVsrPS7Aj3/8Y66//vpKPQtNQWEsIhLi7rvvPn7zm98wePDgerVk6yo+Pp5nn32WCy64gKFDh5KYmEjLli0rrVNQUMAnn3zCxRdfXLGsWbNmnHbaaXzwwQf84x//YOHChQwYMIChQ4eydu1a+vfvzwMPPMCZZ57JwIED+cUvfgHApEmT+Oyzzxg4cCBffvllpdawrwsuuIDS0lL69evHlClTOOWUUwBo06YN06ZNY/z48QwcOJCrr7664j6XXnop+fn5TdpFDWDKR8I1tbS0NKvzGYtIsFu3bh39+vVzuwzX5efn07x5c6y1/PSnP6VXr17cc889bpdVb8uWLeOee+5hyZIlDXqc6v4ujDHLrbXVziVTy1hERBrs3//+N4MGDaJ///7k5eVx2223uV1SnVlrsdby+OOPc/nll/PoY3+kzOOhtAkPSqKWsYhIAzRFy9haS5nHuZR6ql73UOaxeLwf5db7j3Wu4fsRb72PVXm9I7da398tYCDCGCIqfnqvRxxZZowhIgIiy6/7rhtR+X6+h4m01uKxTt0eb/0e32XWHrXcVqzru5yK2yq22mc7alxe5XWqTmSEoX/HljXeXpv6tow1mlpEpAl5fIO1zHpbYEeH7ZFlTtjWFBkGQ2SEwRgwzgLnJ6bi9/Ifxvgs9y4s7x41JqJieXlmWp+gK/F4Kgemp/Ygq7ZWbyh77JEvBfW9b6UvBd6f0ZHe2s2Rbau87Qbfw0Ubn9cEn9uqvn4RTXjIcYWxiEgDWAslZR5vuDrBWuoN2lKPx/uzcujWJMI4wRoZYYiKMERHRxAVEUlkRETFMt+f5Re3TlRRtfVqa2nV+rZgTXWhGlFd0BqMz/JQpjAWkbBhbZWWpzcwj26Reigpsxw6XMq+/GJyDhWTnX+Y7EPF7Ms/THZ+MdmHnJ9/Ors1pbuOPuqWASIjIoiKdMIzJjqKqEhTTageCdqIpmyK+UGEMUREBlfNgUphLCIBqaTMw/6CEvYXFJNbUEJuQTH7C4rJOVS+zFm+v6CY/QUlFJd5vN2+lVuiR5Z5qKVRWieJcVGkNI+ldbMYuqU0I61rMolxlo6t4omKMET5hK+bLVYJPgpjEWkSxaUeduwvZOf+QnIOFVeErO913+A9WFTzfNiYqAiSEqJJSoihVUI0Pdo0Jy46wmmJRhgiI49ufVb6PdIQXd4ijax5vfiYSFKax5LSPJakZtHERh19EIh169aR0jy2miqbxpgxY5gyZQrnn39+xbK///3vbNiwoeIgGlWNHj2aJ598krS0NC666CLeeOMNWrVqVWmd6s4AVdXMmTPp3bt3xUkZfve733HGGWdwzjnnNHzDcE61+M4775CRkUFERGhP/lEYi4hfWGvJLShhe06Bc8k+VHE9I6eQnXmFVDdmJzE2ilbNyoM1hq4pzUhKiHEuzaJplRBTKXiTEmJIiIlUq9NrwoQJTJ8+vVIYT58+nT//+c91uv/s2bOP+7lnzpzJJZdcUhHGf/jDH477saoKt1Mtul+BiASN8tbtkZAtYHt2AT94r+cfrtyabZMYS5fkBEZ0S6ZzcgJdkhPolBRPcjMnWFvFxxATFdotnsZ2xRVX8OCDD1JcXExMTAzbtm1j586dnH766dxxxx188803FBYWcsUVV/Dwww8fdf+uXbuybNkyUlJSeOyxx3j55Zdp27YtnTt3ZujQoYAzh3jatGkUFxfTs2dPXn31VVauXMmsWbP47LPPePTRR3n33Xd55JFHuOSSS7jiiiuYP38+9957L6WlpQwbNoypU6cSGxtL165duemmm/jggw8oKSnhnXfeoW/fvkfVVX6qxauvvpo333yzIoz37NnD7bffzpYtWwCYOnUqI0eO5JVXXuHJJ5/EGMPJJ5/Mq6++ysSJEyvqAedUi/n5+SxatIjf/va3JCUlsX79ejZu3Mhll11GRkYGRUVF/PznP2fy5MmAc6rF+++/n7KyMlJSUpg7dy59+vThiy++oE2bNng8Hnr37s2XX37ZoDM8KYxF5Cg5h4pZti2H9L35bM8uqAjfXXmFlfa7xkRF0MUbsiO6JVdc79I6gdSkeBJiwuwj5uMpsHu1fx+z/QC48Ikab05OTmb48OF8/PHHjB07lunTp3PVVVdhjOGxxx4jOTmZsrIyzj77bFatWsXJJ59c7eMsX76c6dOns3LlSkpLSxkyZEhFGI8fP55JkyYB8OCDD/LCCy9w5513cumll1YKu3JFRUVMnDiR+fPn07t3b2688UamTp3K3XffDUBKSgrffvstzz77LE8++STPP//8UfWE26kWw+x/iohUZ1deIV9vzam4pO/Nr7itvHU73Kd1e0Jr52eb5rFBNwI4FJV3VZeH8QsvvADA22+/zbRp0ygtLWXXrl2sXbu2xjBesmQJ48aNIyEhAXCO0VxuzZo1PPjgg+zfv5/8/PxKXeLV2bBhA926daN3794A3HTTTTzzzDMVYTx+/HgAhg4dynvvvXfU/ctPtfjXv/6VxMTEilMtXnLJJSxYsKDiNIflp1p85ZVX/HKqxffffx+g4lSLWVlZNZ5qcezYsdx9991+O9WiwlgkzFhr2brvEN9sy+F/W3P4ZlsOGTmFADSPjWLoCUlcNrgTw7sl079ji/Br3TZELS3YxjR27Fjuuecevv32WwoKChg6dChbt27lySef5JtvviEpKYmJEyfWevrA2kycOJGZM2cycOBAXnrpJRYtWtSgestPw1jTKRjD8VSL2lkjEuLKPJbvd+bx0tKt/OT15Qx7bD5n/d9n/Prd1SzakEX/Di357SUn8uGdp7Hyd+fy8i3D+emYngzrmqwgDhLNmzdnzJgx3HLLLUyYMAGAAwcO0KxZM1q2bMmePXv4+OOPa32MM844g5kzZ1JYWMjBgwf54IMPKm47ePAgHTp0oKSkpFLwJCYmcvDgwaMeq0+fPmzbto1NmzYB8Oqrr3LmmWfWeXvC8VSL+p8mEmKKSz2s3pHn7XLOZtkPuRXThDq1iuf0XikM65rM8G7J9GjTTKOSQ8SECRMYN24c06dPB2DgwIEMHjyYvn370rlzZ0aNGlXr/YcMGcLVV1/NwIEDadu2LcOGDau47ZFHHmHEiBG0adOGESNGVATwNddcw6RJk3jqqaeYMWNGxfpxcXH85z//4corr6wYwHX77bfXaTvKT7X43HPPVSyreqrFyZMn88ILLxAZGcnUqVM59dRTK061GBkZyeDBg3nppZeYNGkSY8eOZeDAgVxwwQW1nmrxueeeo1+/fvTp06faUy16PB7atm3L3LlzAacb/+abb/bbqRZ1ogiRIFdUUsbyH3KdLuetOazIyKWoxOma69GmGcO7tWZ4tySGdU0mNSnB5WpDj06hGJ6OdapFnShCJMSVlnlYtSOPLzbtY+mmbJZvz6W41EOEgRM7tuDa4ScwvFsSaV2TXT0YhUioeuKJJ5g6dapf9hWXUxiLBDhrLRv35LN00z6+2LyP/23J4aB3Pm+/Di248ZQTGNUzhbSuSSTGRbtcrUjomzJlClOmTPHrYyqMRQJQRk4BX2x2Wr5fbM5mX/5hAE5oncAlAzsyqmdrTu3emtZq+YqEBIWxSADIzj/MF5uzKwJ4e04BACnNYxnVszWjeqQwsmdr7fMNUNZaDYSTCsczFkthLOKC/MOlfL01m6Wbslm6aR/rdzujUxNjoxjRvTU3j+rKqJ4p9GrbXB/yAS4uLo7s7Gxat26t90qw1pKdnU1cXFy97qcwFmkixaUe3v02kxnLM/kuYz+lHktMVARpJyTxq/P7MLJHawZ0aklUpKb/B5PU1FQyMzPJyspyuxQJEHFxcaSmptbrPgpjkUZWUuZhxvJMnl6wiR37C+nbPpHJZ3RnVM8Uhp6QRFx0ww8YIO6Jjo6udFhFkeOhMBZpJCVlHt5dnsnTCzeRmVvIwNSWPHrZSYzu00bdmSJSicJYxM9Kyjy8920m/1zghPDJqS35w9j+jOnTViEsItVSGIv4SUmZh/e/3cE/F6aTkVPIgE4tefjS/pzVVyEsIrVTGIs0UGmZh/dW7ODpBZvYnlPAgE4teegmhbCI1J3CWOQ4lZZ5mLlyJ/9ckM4P2QWc1KkFz9+Yxtn9FMIiUj8KY5F6Ki3z8F9vCG/LLqB/xxb8+8Y0zlEIi8hxUhiL1FFpmYdZ3+3knws2sXXfIU7s0IJpNwzl3BPbKYRFpEEUxiLHUOaxzPpuB/+cv4kt+w7Rr0ML/nXDUM5TCIuInyiMRWpQ5rF88N1OnpqfzpZ9h+jbPpHnrndCOCJCISwi/qMwFqnGqsz93DdjFet3H/SG8BDOO7G9QlhEGoXCWMRHUUkZ/5ifzrTFW2jTPJZnrh3ChScphEWkcSmMRbxWbM/lVzNWsWlvPlendeaBS/rRIi7a7bJEJAwojCXsFZWU8be5G/n3ki20bxHHy7cM58zebdwuS0TCiMJYwtryH3L41Tur2LLvENeO6MJvLuxLolrDItLEFMYSlgqLy3hyzgZeXLqVji3jef3HIxjVM8XtskQkTCmMJex8vTWH+2Z8x7bsAm445QR+fWFfmsfqv4KIuEefQBI2CopL+fMnG3j5y22kJsXzxqQRjOyh1rCIuE9hLGHhy83Z/PrdVWzPKWDiyK7cd0EfEmL05y8igUGfRhLSDh0u5YmP1/PqVz9wQusE3pp8CiO6t3a7LBGRShTGErKWbtrHfTNWsTOvkFtP68a95/UhPibS7bJERI6iMJaQc7CohMc/Xs8b/9tO95RmvHPbqaR1TXa7LBGRGimMJaQs3pjFlHdXsftAEZPP6M4vzu1NXLRawyIS2BTGEhIOFJXw2IfreGtZBj3aNGPGHSMZ0iXJ7bJEROpEYSxB74vN+/jFW9+x92ARd4zuwc/P7qXWsIgEFYWxBK3SMg//mJ/O0ws30S2lGe/fMIqBnVu5XZaISL0pjCUo7dhfyM/fXMGyH3K5cmgqD4/tr3nDIhK09OklQeeTNbu4b8YqPBb+cc0gxg7q5HZJIiINojCWoFFUUsajH63lta+2c3JqS/45YTAntG7mdlkiIg2mMJagkL7nIHe+uYL1uw8y+Yzu3HteH2KiItwuS0TEL+r0aWaMucAYs8EYs8kYM6Wa208wxsw3xqwyxiwyxqT6v1QJR9Zapn+9nR89/TlZBw/z0s3DuP+ifgpiEQkpx2wZG2MigWeAc4FM4BtjzCxr7Vqf1Z4EXrHWvmyMOQt4HLihMQqW8HGgqITfvLeaj1btYlTP1vztqkG0bRHndlkiIn5Xl27q4cAma+0WAGPMdGAs4BvGJwK/8F5fCMz0Y40Shr7dnstdb65gV14Rvzq/D3ec2YOICON2WSIijaIufX2dgAyf3zO9y3x9B4z3Xh8HJBpjdGocqTePxzJ10Waueu5LrIW3bzuVn47pqSAWkZDmrwFc9wJPG2MmAouBHUBZ1ZWMMZOByQBdunTx01NLqNh7sIhfvv0dS9L3cfGADvxx/ABaxke7XZaISKOrSxjvADr7/J7qXVbBWrsTb8vYGNMcuNxau7/qA1lrpwHTANLS0uzxlSyhaPHGLH7x9koOFpXyx3EDmDC8M8aoNSwi4aEuYfwN0MsY0w0nhK8BrvVdwRiTAuRYaz3Ab4AX/V2ohKbiUg//N2cD/1q8hd7tmvPGpFPo3S7R7bJERJrUMcPYWltqjPkZ8CkQCbxorf3eGPMHYJm1dhYwGnjcGGNxuql/2og1S4jYnl3AndNX8F3Gfq4b0YXfXnKiTvAgImHJWOtOb3FaWppdtmyZK88t7pv13U4eeG81xsCfLj+ZCwd0cLskEZFGZYxZbq1Nq+42HYFLmlRBcSkPz1rLW8syGHpCEv+4ZhCpSQlulyUi4iqFsTSZ0jIPk15Zxhebs/nZmJ7cfU4voiJ1JC0REYWxNJk/f7qBpZuy+fPlJ3PVsM7HvoOISJhQs0SaxKzvdjJt8RZuPPUEBbGISBUKY2l0a3ce4L4Z3zGsaxIPXnyi2+WIiAQchbE0qv0Fxdz22jJaxkfzzHVDdLYlEZFqaJ+xNJoyj+XON1ewJ+8w0287hbaJOuOSiEh1FMbSaJ6cs4El6ft4YvwAhnRJcrscEZGApT5DaRQfrdrF1EWbuXZEF64ZrpOCiIjURmEsfrdh90F+NeM7hnRpxe9/pAFbIiLHojAWv8orLOG2V5fRLDaKqdcPJTZKx5oWETkWhbH4jcdjuXv6CnbsL2TqdUNo10IDtkRE6kJhLH7z93kbWbghi9//qD9pXZPdLkdEJGgojMUvPv1+N08t2MTVaZ25boQGbImI1IfCWBps096D/PLt7xjYuRUPj+2PMcbtkkREgorCWBrkQFEJk19dTlx0BM9dP4S4aA3YEhGpLx30Q46bx2P5xVvfsT27gNd/PIIOLePdLklEJCipZSzH7Z8LNjFv3R5+e8mJjOje2u1yRESClsJYjsv8dXv427yNXD4klRtPPcHtckREgprCWOptS1Y+d09fyYBOLXls3EkasCUi0kAKY6mX/MOlTH51OdFRETx3w1AN2BIR8QMN4JI683gsv3x7JVv3HeLVW4fTqZUGbImI+INaxlJnUz/bzKff7+H+i/oxskeK2+WIiIQMhbHUycINe3lyzgYuG9SRW0Z1dbscEZGQojCWY9q27xA/f3MF/dq34PHxJ2vAloiInymMpVaHDpdy26vLiYgw/OuGocTHaMCWiIi/KYylRtZa7puxivS9B3l6whA6Jye4XZKISEhSGEuN/rV4Cx+t3sWUC/tyWi8N2BIRaSwKY6nW2p0H+MunG7j45A5MOr272+WIiIQ0hbEcxeOxPDBzNa3io3nsMh1hS0SksSmM5ShvfL2dFdv388DF/WiVEON2OSIiIU9hLJXsPVjEnz5Zz8gerRk3uJPb5YiIhAWFsVTyyIfrOFzi4VF1T4uINBmFsVRYvDGLD77byU/G9KB7m+ZulyMiEjYUxgJAUUkZD85cQ/eUZtwxuofb5YiIhBWdtUkAeHrBJrbnFPDGpBHERukoWyIiTUktYyF9z0H+tXgz44d00tmYRERcoDAOcx6P5YH319AsNooHLurndjkiImFJYRzmZizP5OttOdx/YT9aN491uxwRkbCkMA5j2fmH+ePH6xjeNZkr01LdLkdEJGwpjMPYY7PXcehwKY+N05xiERE3KYzD1Beb9/HetzuYfEZ3erVLdLscEZGwpjAOQ4dLy3jw/TV0SU7gzrN6uV2OiEjY0zzjMDR10Wa27DvEK7cMJy5ac4pFRNymlnGY2ZKVz7MLN/OjgR05o3cbt8sREREUxmHFWsuDM9cQGx3Bby/RnGIRkUChMA4jM1fu4IvN2fz6gr60TYxzuxwREfFSGIeJ/QXFPPrhOgZ3acW1w7u4XY6IiPjQAK4w8cTH69lfWMJr4wYQEaE5xSIigUQt4zDwzbYcpn+Twa2ndaNfhxZulyMiIlUojENccamH+99bTadW8dx9juYUi4gEInVTh7h/L9lC+t58XrgpjYQYvd0iIoFILeMQtj27gKfmp3NB//ac3a+d2+WIiEgNFMYhylrLg/9dQ1SE4feXnuh2OSIiUguFcYj6cNUuFm/M4t7z+9ChZbzb5YiISC0UxiEor7CEP3y4lgGdWnLjqV3dLkdERI5BI3pC0JOfbiA7/zAv3jSMSM0pFhEJeGoZh5gV23N57X8/cOOpXRmQ2tLtckREpA4UxiGktMzD/e+voV1iHL88r7fb5YiISB2pmzqE/GfpNtbtOsBz1w8hMS7a7XJERKSO1DIOETv2F/LXuRs5u29bzu/f3u1yRESkHhTGIcBay+//uwaAh8f2xxgN2hIRCSYK4xCwaEMW89bt5Z5ze5GalOB2OSIiUk8K4yBnreVv8zbSOTmem0d1c7scERE5DgrjILdww15WZeZx55heREfq7RQRCUb69A5i1lr+Pi+dzsnxjBvSye1yRETkOCmMg1h5q/hnY3qqVSwiEsT0CR6kylvFqUnxjB+S6nY5IiLSADroR5BatCGLVZl5/OnyAWoVi/8dzodV0wEDJ42H+CS3KxIJaQrjIOS0ijeqVSz+dygbvp4GX/8LCnOdZZ/8Bvr9CAZfD93OhAh9+RPxN4VxEFq0IYvv1CoWf9qfAV8+A9++DCUF0PcSGHU3RMXAitdg1duwZga07AKDr4NB10KrLm5XLRIyFMZBRq1i8au962HpP2D1287vJ18NI++Ctn2PrNNhIJz7CGz4yAnmRU84l+5nwuAbnOCOjnOnfpEQoTAOMuWt4ifGq1UsDZDxDXz+NydgoxNg+GQ45SfQqnP160fHwUmXO5f922Hlm7DyNXj3VohrCQOucrqxOw5q0s2QIFF6GDbNgzXvwc5vnS99p9zh/O0IAMZa68oTp6Wl2WXLlrny3MHKWstlzywl+1AxC345mpioIAzjj38NK9+ALqdCt9Oh2xnQbkBg7If0eGDv97B1CWxdDBlfQdfTYNy/IKaZ29U1nLWwab4Twj987gzKGn4bjLgNEpLr/3geD2xbAitehbWzoOwwtB/gtJYHXHl8jymho6wEtixyAnj9R3A4z/mba3si/LAU4lrBqLucv8HY5m5X2ySMMcuttWnV3qYwDh4LN+zl5v98wxPjB3DN8CDcX7f+I5h+LXQZCYf2QvYmZ3lcKyf0up3hXNr0haY42YW1sG+jE7xbF8O2z6Ewx7ktqZvTPbtuFnQcDNe+Dc1SGr+mxlBWCmtnwud/hz2roUUnOPVnMORG/30IFubCmnedbuydKyAyBvpe7LSWu4+BiEj/PI8ENk+Z8wVtzXvO/53CXIhtCf0ugf7jnV0bkdHO38jCxyH9U0hIgdPuhrRbISa0j62vMA4B1loue/YLsvMPB2er+MAumDrS6Qa9dZ4zMOjAziOt0G2Lne5PgGZtoOvp3pbzmZDc3T/hbC3kbvV5ziWQv8e5rUWq98vA6c5zl3fXrvvQ6Ypt0QlueA+Suja8jqZSUgQrX4cvnoLcbZDS2xmUNeBK5/VvLLtXw4rXYdVbzpebFqnOgK9B10Kyjp8ecjwepxdpzXuw9r/OF+3oZtD3IieAe54NUbHV3zfjG1j4GGxZCM3bwWm/gKETQ3YMgsI4BAR1q9jjgdfGw/av4PYlkNKr+vVyt1UOyoO7nOWJHY+0mrudXr9RvHmZlR8zL8NZ3rydN/C9j5nUrebA3/4VvHG109q7fobTYg5kRXnwzQvw1VTng7HTUOdDrs9FTbs7oPQwbPjY6cbeNB+wzmt+4lhnP7U/GQOteznd5CH6QR5QrIUdy50A/v59OLgTouKg13nOuIJe59WvlbttKSz8o7P7pEUnOP2Xzu6OxvzS6AKFcZAL+lbxl8/Ap/fDJX+HtJvrdh9rnW5s3y7kgn3ObUldvUF6phOkie2P3C9/r899lkDOFmd5fHLlrvCU3vVrbWdtgNcud7rdrn4VepxV9/s2lYN74KtnYdmLcPgA9DgbTrvH2W63z3Gdlwnfvel0Y+dua7zniYiG9idBpzTnS0hqGiT3cH9MQlkp5GyGveucHqCoOCesohOc8QjR8U5rstKyBGe52+9dOWth9ypvAL/nbEdENPQ612kB97kAYhMb9vhbP4MFj0Hm186X7jPug4ETIDI0xhorjINceav48fEDmBBsreLdq+HfZ0HPc+Ga14//g8Xjgax1Tit3m/dSlOfcltLbaa3uXg1Z651lsS3ghFFHWr5t+zf8A/nATnjtCti3AS6bCidf1bDH85dD+5xWxYrXwFMCJ17m7IMLxBa8xwMHdoD1+PlxS2HvWshc5rTYdq6A4nzntriW0HGIE8ydhjpB3byNf5+/og4P7P/BCd29a52fWeudsQllxcfxgMYbzlWD2yewYxJ8gtwn0I+6XzX3qUvI7V3nBPCad50vFCYSeoxxArjvxRDf6ji2qxbWOiOvFz7mvI/J3eHMKTDgiqAfe6AwDmLWWsY9+wVZBw+z8N4gaxWXFMK00U5r8o4voVlr/z22p8wJ3/IW8K5V0K7/kZZvh4GN8x+3cD+8db3znOc+AiPvdK/lYq1zMI5PpsDhg85gqZF3Quse7tQTSDxlTgBmLoMd3oDesxZsmXN7yy6QOvRIOHcYWL9uVWudL2floZu13vtzg3PQlHItuzhzttv2c0YRt+nr7DcvK4HiQ866JQVQXP7zkM/vh6pZXtPt3t89pfV7nSKijw5x38DO3uxsl4lwelj6j4d+l/r3/3JNrIUNs50vmnvWQEofGD3F+bLpdk/HcVIYB7FFG/YyMVhbxbN/5Rxa8fr3nEEcoaL0MLx/m7Ov7JSfwHmPNf2HQ+4P8OE9sHk+pA6DS//pfOBLzYoPOV/aysM5cznkeQcNmkhod2Ll7u2U3s4Xuvwsn1buOm8Ar3em6pRr3t4buP18grdPw7ptj4dvyFcK7GqCvaTw2OGf0NoJvxPHQmK7pt2Wch4PrPuvM/p63wZodxKM/o3TKg+ULvw6UhgHqaBuFW+cA29cCaf8FC74o9vV+J/H4+wH/99Up7Uw7rmaR4z69XnL4H/PwYJHndbK2b+HYbcGffeda/L3eoPZG9A7vj0SsjGJzgCiguwj68cnO0FbtbWrOdWNz1PmdJUvesLpLu8wCMY84OyzDpJQri2M67RX3BhzAfAPIBJ43lr7RJXbuwAvA62860yx1s5uSNECn23MYmXGfh4fPyC4gjh/L/z3J8432LN/53Y1jSMiAi54HFp0gLm/g0NZzj7xxjyi0O7VMOsu5whGvS+Ai/8PWuqQqA3SvC30udC5gPMlK2fzkXAuO+wN337Qpp+zfpB88IeciEhnnEb/8c60uc/+5HzhTx3mhHK3MxvnvWmi9/uYLWNjTCSwETgXyAS+ASZYa9f6rDMNWGGtnWqMORGYba3tWtvjqmVcu6BtFVsLb1zl7MudvCg8uk6/e8v58tGmL1w3wwlofyophM/+7MwXjk+CC//kfCApFCSclRY78+gX/8UZFNgY4lrClO1+e7iGtoyHA5ustVu8DzYdGAus9VnHAi2811sCO4+/XAFYnL6PlRn7+eO4IGsVf/M8pM+BC/8SHkEMMPBq5+hcb98IL5wL17/r7C/0h61L4IOfO621QdfDeY+oS1QEnF0IaTc7B5NZ9XbjBHJT7Hoqf6o6rNMJyPD5PRMYUWWdh4A5xpg7gWbAOX6pLkyVn5mpU6t4rhgaRN2Qe9fBnAedCf/DJ7ldTdPqeTZM/AhevwJePN85fGbn4cf/eIW5Tvf3t68486pvmOlMJxGRyqJiYcgNblfRYP5qck0AXrLWpgIXAa8aY456bGPMZGPMMmPMsqysLD89dehZnL6PFdv389MxPYOnVVx6GN79McQ0h7HPhGcXasdBcOtcpyv55Uth/XEMm7DWOaTgMyOcQ0qO+rkzLUxBLBLS6vJJvwPwPa9aqneZr1uBtwGstV8CccBRR9W31k6z1qZZa9PatGmkSfdBLmhbxfP/4MwFvOxZZ5BLuEru5gRy237w1nWw/KW63/fATph+ndPd3bwdTFoA5/4h5A+eLyJ1C+NvgF7GmG7GmBjgGmBWlXW2A2cDGGP64YSxmr7HIShbxZsXwJdPw7AfQ+/z3a7Gfc1SYOKH0PMcZ3/vwsedFm9NPB7nWNLPjHDmDZ/7B5i0UOcGFgkjx9xnbK0tNcb8DPgUZ9rSi9ba740xfwCWWWtnAb8E/m2MuQdnMNdE69YE5iAWlK3iQ9nw/h3O0XHOfcTtagJHTDO45g344G747AnnpBcX//Xoww9mbYQP7oLtXzpTM370d+fwfyISVuo0z9g7Z3h2lWW/87m+Fhjl39LCzxJvq/ixcScFR6vYWph1p3NQhOveUXdqVZHRMPZp50QWS5505l9f8aLzOpUWw9K/O9MyohNg7LPOqNBw3NcuInULY2l85a3iji3juHJo52PfIRB8+zJs+AjOexQ6nOx2NYHJGDj7t87c44/uhVcuhTN/DXN+6xxa8aTL4YInwns/u4gojAPFkvR9fBtMreJ96fDJb5yu1VN+6nY1gW/Yj51BWTNudaY/tegEE95yTjsnImFPYRwAgq5VXFrsTGOKinWOyRykZ1Bpcv1+5MxF3rIITrm96U8iICIBS2EcAIKuVbzoj7BrJVz9GrTo6HY1waXzMOciIuIjCD75Q5u1ln/MTw+eVvHWJfD532HIjU5LT0REGkxh7LLPN+1j+Q+5/CQY5hUX5jrn8U3uDuc/7nY1IiIhQ93ULnL2FXtbxWkBPq/YWmfObP4euHUOxDZ3uyIRkZAR4E2x0ObbKo6NCvCTw3/3JqydCWPuh05D3a5GRCSkKIxdElSt4pwtMPtXcMIoGHW329WIiIQchbFLlm7KDo5WcVkJvDsJTCSM+xdEBHCtIiJBSvuMXVBpXnGgt4oX/wV2LHMO49gqCEZ7i4gEIbWMXbB0UzbLfsjljkBvFW//ygnjgROcwzaKiEijUMu4iZW3iju0jOMqN1rFZSVwaB8U7INDWc71Q1k+l+wj1w/ugpad4cI/N32dIiJhRGHcxMpbxY9cdpJ/W8U5W+HAjioBW03gFu2v/v4RUdCsjXMu3mZtoHUP5+fQiRDXwn91iojIURTGTez5z7fQvoWfW8WL/uQcorISAwnJ3oBtA+1Pcn4mpBwJ3IpLCsS11On7RERcojBuQvsLivk8fR+3nt7Nf63iL591gnjAVTD4+iMBG5909InsRUQkIOnTugnN+X4PpR7LxQM6+OcBv30VPv0N9LsULpuq8BURCVIaTd2EPlq9i9SkeAZ0atnwB/t+JnxwF/Q4Cy5/XkEsIhLEFMZNZH9BMUs37ePiAR0wDd03u2mecz7h1GHOaQyjYv1TpIiIuEJh3ETmrHW6qC9qaBf1D1/C9OuhbV+49m2IaeafAkVExDUK4yYy29tFfXJqA7qod30Hb1wFLTvB9e9DfCu/1SciIu5RGDeBvIISlm7ax0UN6aLO2givjnemIN34X2jexr9FioiIaxTGTWDO2t2UlDWgi3r/dnj1Mmce8A0zoWWAH89aRETqRUNwm8Ds1bvo1CqegcfTRZ2/F14ZC8X5MPEjSOnp/wJFRMRVahk3srzCEj7ftI+LBrSvfxd1YS68Og4O7obrZkD7AY1TpIiIuEot40Y2d+2e4+uiPpwPr18J+zbCtW9B5+GNU6CIiLhOYdzIyruoB3VuVfc7lRTB9Gthx3K46hXnwB4iIhKy1E3diPIKS1iSnsWFJ9Wji7qsFN69FbZ+BmOfgX4/atwiRUTEdQrjRjSvvIv65Dp2UXs8MOtnsP5D5xzCg65t3AJFRCQgKIwb0ezVu+jYMo7BdemithY++TV89yaMeRBG3Nbo9YmISGBQGDeSA0UlLEnfx4V1PdDHwsfg62lw6s/gjHsbv0AREQkYCuNGMm/tHorLPHUbRb30KVj8FxhyI5z3qHNwDxERCRsK40Yye/UuOtSli3r5SzD3t9B/HFzydwWxiEgYUhg3ggNFJSzeuI8LT+pAREQt4brmXfjgbuh5LoybBhGRTVajiIgEDoVxI5i/zumivvjk9jWvtHEOvDcZupzqzCWOimm6AkVEJKAojBvBR6t2075FHIM7J1W/wral8PYN0K4/XDsdYhKatkAREQkoCmM/O1hUwuL0LC4c0L76LuqdK+CNq6HVCc45ieMacH5jEREJCQpjP1uwfi/FpR4urm4UdUEOTL8e4pPgxpnQrHWT1yciIoFHx6b2s49W7aJ9iziGdKnSRW0tzLoT8vfAj+dCi47uFCgiIgFHLWM/yj9cyqKNWVxwUjVd1N887xzm8tyHoeNgdwoUEZGApDD2o/nr9jhd1FWPRb17NXz6APQ6H075iTvFiYhIwFIY+9Hs1bto1yKWob5d1MWH4J2bnf3Elz2rg3qIiMhRFMZ+cuhwKYs2ZB19oI/Z90H2Jrj839Asxb0CRUQkYCmM/WT++r0cLq1yLOpV78DK1+CMX0G3M9wrTkREAprC2E9mr9pF28RY0k7wdlFnb4YP73GOsHXmr90tTkREAprC2A8OHS5l4Ya9XFg+irq0GGbc4hxrevy/IVIzyEREpGZKCT9YULWLev7DsGslXP06tOrsam0iIhL41DL2g9mrd9EmMZa0rsnOCSC+fBqGT4Z+l7hdmoiIBAGFcQMVFB/poo7M3w0zb4d2A+DcR9wuTUREgoS6qRtowfq9FJV4uKh/W3jvFigphCtehOg4t0sTEZEgoTBuoNmrd5HSPJbhO16GbUtg7LPQprfbZYmISBBRN3UDFBSXsmD9Xm7ruoeIRY/DgCth0LVulyUiIkFGYdwAC9dnEVtygBt3PgKtusDFf9XhLkVEpN7UTd0As1ft5G/xLxBTtA+umwNxLdwuSUREgpDC+DgVFpfRbuNrnBXxPzj3Meg0xO2SREQkSKmb+jgt+99ifm1eJbfTaJ0WUUREGkRhfDyKD9FryV0cMM1JvPrfEKGXUUREjp9S5DiUfvQr2h7O4L89HiaqRVu3yxERkSCnMK6v1TOI+u51ni4bS79TL3a7GhERCQEK4/rI2QIf3M3muJN4NWYCI7olu12RiIiEAIVxXXlPi2gjIplccAfnnNSJqEi9fCIi0nBKk7qa/zDsXMGKwY+yuTiJi8tPlygiItJACuO6SJ/rnBZx2CT+k3MSyc1iOKW7uqhFRMQ/FMbHcmAXvH8btDuJorMeZv66PZzfv526qEVExG+UKLXxlMH7k72nRfwPizYfpKC4jIvURS0iIn6kMK7N53+DrYvhor9Am97MXr2LpIRoTu3e2u3KREQkhCiMa1KQA4seh/7jYdB1FJWUebuo26uLWkRE/EqpUpNN88FTCqf+DIzhs41ZHFIXtYiINAKFcU3S50BCCnQcDMDs1btolRDNqT3URS0iIv6lMK6Opww2zYNe50JEhLeLei/nn9ieaHVRi4iInylZqrPjWyjMccIYWLwxi/zDpVx0srqoRUTE/xTG1UmfAyYCepwFHOmiHqkuahERaQQK4+qkz4HOIyA+iaKSMuat28t5J7ZTF7WIiDQKpUtVB/fArpUVXdRL0vc5XdQaRS0iIo1EYVzVprnOz17nAU4Xdcv4aEb1THGxKBERCWUK46rS50BiB2h3EodLy5i3do+6qEVEpFEpYXyVlcDmhU4XtTEs2biPgxpFLSIijUxh7Cvjf3D4APQ6H3C6qFvERTGqh7qoRUSk8SiMfaXPgYho6H4mpWUe5q7dw3n92xMTpZdJREQaj1LGV/pcOGEkxCay+0ARBw+XMvSEJLerEhGREKcwLrc/A/aurRhFnZFTCEDnpAQ3qxIRkTCgMC6XPsf5WR7GuQUAdE6Od6siEREJE3UKY2PMBcaYDcaYTcaYKdXc/jdjzErvZaMxZr/fK21s6XOh1QmQ0guAzNxCjIEOLRXGIiLSuKKOtYIxJhJ4BjgXyAS+McbMstauLV/HWnuPz/p3AoMbodbGU1IEWz+DQdeBMQBk5hTQoUWcBm+JiEijq0vSDAc2WWu3WGuLgenA2FrWnwC86Y/imswPS6GkoKKLGpxu6tRk7S8WEZHGV5cw7gRk+Pye6V12FGPMCUA3YEHDS2tC6XMhKg66nV6xKCOnkNQkdVGLiEjj83cf7DXADGttWXU3GmMmG2OWGWOWZWVl+fmpGyB9DnQ7A6Kd8D1cWsaeg0UaSS0iIk2iLmG8A+js83uqd1l1rqGWLmpr7TRrbZq1Nq1NmzZ1r7IxZW+GnM2Vuqh37i/CWuisbmoREWkCdQnjb4BexphuxpgYnMCdVXUlY0xfIAn40r8lNrLyKU09z6lYlJHjTGtSN7WIiDSFY4axtbYU+BnwKbAOeNta+70x5g/GmEt9Vr0GmG6ttY1TaiNJnwMpvSG5W8WizFzvAT/UMhYRkSZwzKlNANba2cDsKst+V+X3h/xXVhMpPgTbPofhkystzsgtIDrS0L5FnEuFiYhIOAnvSbRbF0NZsXPKRB8ZOQV0bBVPZIRxqTAREQkn4R3G6XMgpjl0GVlpcWaupjWJiEjTCd8wttaZX9x9NETFVLopM7dA05pERKTJhG8YZ62HvIxKU5oACopL2ZdfrMFbIiLSZMI3jDd+6vyssr+4fCS1uqlFRKSphG8Yp8+FdgOgRcdKizNzy+cYq2UsIiJNIzzDuCgPtn95VKsYnGNSg85jLCIiTSc8w3jzQrBlR+0vBmdaU2xUBG2ax7pQmIiIhKPwDOP0uRDXClKHHXVT+bQmYzTHWEREmkb4hbHHA5vmQs+zIfLoA5Bl5BZoJLWIiDSp8Avj3asgf0+1XdTgdFNrjrGIiDSl8Avj9LmAgR5nH3VTXmEJB4pKNa1JRESaVBiG8afQaQg0P/p8yuXTmtRNLSIiTSm8wvhQNmQuq6WL2jutSd3UIiLShMIrjDfPB2y184vB94Af6qYWEZGmE15hnD4HmrWBDoOrvTkzt5DmsVG0Sohu4sJERCSchU8Ye8pg0zzoeS5EVL/ZGTkFmmMsIiJNLnzCeMdyKMytsYsanDnGOia1iIg0tfAJ4/Q5YCKhx5hqb7bWkplbqGNSi4hIkwufMN74KXQeAfFJ1d6cc6iYguIyjaQWEZEmFx5hfGCXc+StWruoy8/WpDAWEZGmFR5hvGme87OG+cWgaU0iIuKe8Ajj9DmQ2BHa9a9xlSPnMVbLWEREmlboh3FZiXP+4l7nQi1TljJyC0hKiKZ57NFnchIREWlMoR/G27+C4oPQ+/xaV3POY6xWsYiINL3QD+P0ORARDd3OrHW1zJwCTWsSERFXhEcYdx0Fsc1rXMXj8c4xVstYRERcENphnPsDZK2vdRQ1wN6Dhyku82gktYiIuCK0w3jTXOfnMcK4YlqTRlKLiIgLQjuM0+dCUldo3bPW1TK8YaxuahERcUPohnFJEWz5zGkVH+MsTOVzjNVNLSIibgjdMP7hcygthF61T2kCp5u6TWIscdGRTVCYiIhIZaEbxulzISreGUl9DBk5hXRWq1hERFwSmmFsrXOWpm5nQPSxQzYjt0CHwRQREdeEZhhnb4bcrbWepalcaZmHXXlF2l8sIiKuCc0wTp/j/KxDGO/KK6LMYzWSWkREXBO6YZzSx5nWdAwV05rUTS0iIi4JvTA+nA8/LK1TqxggU9OaRETEZaEXxlsXQ1nxMY+6VS4zt4AIAx1bKYxFRMQdoRfG6XMgJhG6nFqn1TNyC+nQMp7oyNB7KUREJDiEVgJZ68wv7jEaomLqdJeMnAJ1UYuIiKtCK4z3roUDmXXuogbIzC0kVSOpRUTERaEVxuVTmnrWbfDW4dIy9hwsonOyWsYiIuKeEAvjudB+ALToUKfVd+QWYq3O1iQiIu4KnTAu3A/bv6p3FzVoWpOIiLgrdMJ4y0KwZfUKYx3wQ0REAkHohHH6XIhPgtRhdb5LRk4h0ZGGdi3iGrEwERGR2oVGGHs83ilNZ0NE3c9JnJFbQMdW8URGmEYsTkREpHahEca7VsKhvfXqogZnn7EGb4mIiNtCI4x3r4aIKOh5dr3ulplToGlNIiLiuii3C/CLoTdB/3EQ16LOdzl0uJTsQ8U64IeIiLguNFrGUK8gBtixX9OaREQkMIROGNdTRo6mNYmISGBQGKubWkREXBa2YZyZW0hcdAQpzet2dicREZHGErZhnJFbQGpSAsZojrGIiLgrfMM4p5DOGrwlIiIBIHzD2NsyFhERcVtYhnFeYQkHi0p1wA8REQkIYRnGGkktIiKBJCzDOFOnThQRkQASpmGso2+JiEjgCMswzsgpIDE2ipbx0W6XIiIiEqZhnFtIarLmGIuISGAIyzDOzC1QF7WIiASMsAtja633gB8avCUiIoEh7MI4+1AxhSVlmmMsIiIBI+zC+MhIarWMRUQkMIRdGB85j7FaxiIiEhjCL4xzdfQtEREJLOEXxjmFJDeLoVlslNuliIiIAGEYxprWJCIigSYMw1jTmkREJLCEVRh7PJYduYWkavCWiIgEkLAK470HD1Nc5tG0JhERCShhFcZHRlKrZSwiIoEjvMI4R+cxFhGRwBNWYVx+9K1OrdQyFhGRwBFWYZyRU0DbxFjioiPdLkVERKRCeIVxboG6qEVEJOCEVxjnFGrwloiIBJywCePSMg+7DxRpWpOIiAScOoWxMeYCY8wGY8wmY8yUGta5yhiz1hjzvTHmDf+W2XC78ooo81idrUlERALOMc+WYIyJBJ4BzgUygW+MMbOstWt91ukF/AYYZa3NNca0bayCj1fFtCa1jEVEJMDUpWU8HNhkrd1irS0GpgNjq6wzCXjGWpsLYK3d698yG658WpO6qUVEJNDUJYw7ARk+v2d6l/nqDfQ2xiw1xnxljLnAXwX6S0ZuAREGOrSKc7sUERGRSvx1Ut8ooBcwGkgFFhtjBlhr9/uuZIyZDEwG6NKli5+eum4ycgro0DKe6MiwGbMmIiJBoi7JtAPo7PN7qneZr0xglrW2xFq7FdiIE86VWGunWWvTrLVpbdq0Od6aj0tmbqHOYywiIgGpLmH8DdDLGNPNGBMDXAPMqrLOTJxWMcaYFJxu6y3+K7PhdMAPEREJVMcMY2ttKfAz4FNgHfC2tfZ7Y8wfjDGXelf7FMg2xqwFFgK/stZmN1bR9VVUUsaeA4c1klpERAJSnfYZW2tnA7OrLPudz3UL/MJ7CTg79jsjqTXHWEREAlFYjGbStCYREQlkYRHGR85jrJaxiIgEnvAI49wCoiMN7RI1x1hERAJPWIRxZm4hnVrFExFh3C5FRETkKOERxjma1iQiIoErLMI4I7dQg7dERCRghXwYHzpcSs6hYh19S0REAlbIh3H5tCZ1U4uISKAK+TA+ch5jtYxFRCQwhXwYZ+aWzzFWy1hERAJTyIdxRm4h8dGRtG4W43YpIiIi1Qr9MM4pIDUpHmM0x1hERAJT6IdxbqG6qEVEJKCFfBhn5hZoWpOIiAS0kA7jvIISDhaV6jzGIiIS0EI6jDNydbYmEREJfCEdxuXTmnQoTBERCWQhHcYZOd6jbymMRUQkgIV2GOcWkBgXRcuEaLdLERERqVFIh3FmbqFaxSIiEvBCOozLD/ghIiISyEI2jK21TstYB/wQEZEAF7JhvC+/mMKSMp2tSUREAl7IhrGmNYmISLAI2TDOyPVOa1I3tYiIBLjQDeOc8paxuqlFRCSwhWwYZ+YWktwshmaxUW6XIiIiUqsQDuMCDd4SEZGgELJhnJFTQKr2F4uISBAIyTD2eCw79uvoWyIiEhxCMoz3HCyipMxq8JaIiASFkAzjirM1qZtaRESCQIiGsTOtSQO4REQkGIRkGGd6D/jRsZXCWEREAl9IhnFGbgHtWsQSFx3pdikiIiLHFJphnFOgkdQiIhI0QjKMM3MLNZJaRESCRsiFcUmZh115Oo+xiIgEj5AL4137i/BY1E0tIiJBI+TCuOI8xsnqphYRkeAQcmGckVs+x1gtYxERCQ6hF8Y5hURGGDq0jHO7FBERkToJvTDOLaBDyziiIkNu00REJESFXGJpWpOIiASbkAtjHfBDRESCTUiFcVFJGXsPHtYcYxERCSohFcY79jsniFA3tYiIBJOQCuOKUyeqZSwiIkEktMLYe+pE7TMWEZFgElJhnJlbQExkBG0TY90uRUREpM5CK4xzCumUFE9EhHG7FBERkToLqTDOyC3Q4C0REQk6IRXGmbk6daKIiASfkAnjQ4dLyTlUrJaxiIgEnZAJY52tSUREglXohHGOd1qTuqlFRCTIhEwYZ3pbxuqmFhGRYBMyYZyRU0h8dCStm8W4XYqIiEi9hE4Y5xbQOTkeYzTHWEREgkvIhHFmbqEGb4mISFAKiTC21pKZowN+iIhIcAqJMM4rLOHg4VKNpBYRkaAUEmGcmVt+HmOFsYiIBJ+QCOPy8xirm1pERIJRSIRxZIShf8cW6qYWEZGgFOV2Af5wXv/2nNe/vdtliIiIHJeQaBmLiIgEM4WxiIiIyxTGIiIiLlMYi4iIuExhLCIi4jKFsYiIiMsUxiIiIi5TGIuIiLhMYSwiIuIyhbGIiIjLFMYiIiIuUxiLiIi4TGEsIiLiMoWxiIiIyxTGIiIiLlMYi4iIuExhLCIi4jKFsYiIiMuMtdadJzYmC/jBlSdvHCnAPreLaAShuF2huE0QmtulbQoeobhd/t6mE6y1baq7wbUwDjXGmGXW2jS36/C3UNyuUNwmCM3t0jYFj1DcrqbcJnVTi4iIuExhLCIi4jKFsf9Mc7uARhKK2xWK2wShuV3apuARitvVZNukfcYiIiIuU8tYRETEZQrjejDGdDbGLDTGrDXGfG+M+Xk164w2xuQZY1Z6L79zo9b6MsZsM8as9ta8rJrbjTHmKWPMJmPMKmPMEDfqrCtjTB+f92ClMeaAMebuKusExXtljHnRGLPXGLPGZ1myMWauMSbd+zOphvve5F0n3RhzU9NVXbsatukvxpj13r+v940xrWq4b61/q26pYZseMsbs8Pkbu6iG+15gjNng/f81pemqPrYatustn23aZoxZWcN9A/W9qvaz3NX/V9ZaXep4AToAQ7zXE4GNwIlV1hkNfOh2rcexbduAlFpuvwj4GDDAKcD/3K65HtsWCezGmeMXdO8VcAYwBFjjs+zPwBTv9SnAn6q5XzKwxfszyXs9ye3tqWWbzgOivNf/VN02eW+r9W81wLbpIeDeY9wvEtgMdAdigO+qfq4E2nZVuf3/gN8F2XtV7We5m/+v1DKuB2vtLmvtt97rB4F1QCd3q2oyY4FXrOMroJUxpoPbRdXR2cBma21QHmTGWrsYyKmyeCzwsvf6y8Bl1dz1fGCutTbHWpsLzAUuaKw666O6bbLWzrHWlnp//QpIbfLCGqCG96kuhgObrLVbrLXFwHSc9zcg1LZdxhgDXAW82aRFNVAtn+Wu/b9SGB8nY0xXYDDwv2puPtUY850x5mNjTP+mrey4WWCOMWa5MWZyNbd3AjJ8fs8keL6IXEPNHxbB+F4BtLPW7vJe3w20q2adYH7PbsHpianOsf5WA83PvF3vL9bQ7RnM79PpwB5rbXoNtwf8e1Xls9y1/1cK4+NgjGkOvAvcba09UOXmb3G6QwcC/wRmNnF5x+s0a+0Q4ELgp8aYM9wuyB+MMTHApcA71dwcrO9VJdbpOwuZaRHGmAeAUuD1GlYJpr/VqUAPYBCwC6dLN5RMoPZWcUC/V7V9ljf1/yuFcT0ZY6Jx3rzXrbXvVb3dWnvAWpvvvT4biDbGpDRxmfVmrd3h/bkXeB+n68zXDqCzz++p3mWB7kLgW2vtnqo3BOt75bWnfDeB9+featYJuvfMGDMRuAS4zvtheJQ6/K0GDGvtHmttmbXWA/yb6msNuvcJwBgTBYwH3qppnUB+r2r4LHft/5XCuB68+0deANZZa/9awzrtvethjBmO8xpnN12V9WeMaWaMSSy/jjOQZk2V1WYBNxrHKUCeT3dOIKvxm3swvlc+ZgHlozhvAv5bzTqfAucZY5K83aPneZcFJGPMBcB9wKXW2oIa1qnL32rAqDKuYhzV1/oN0MsY083bk3MNzvsb6M4B1ltrM6u7MZDfq1o+y937f+X2qLZgugCn4XRbrAJWei8XAbcDt3vX+RnwPc6IyK+AkW7XXYft6u6t9ztv7Q94l/tulwGewRn1uRpIc7vuOmxXM5xwbemzLOjeK5wvE7uAEpz9U7cCrYH5QDowD0j2rpsGPO9z31uATd7LzW5vyzG2aRPOvrjy/1vPedftCMyu7W81EC41bNOr3v8vq3A+6DtU3Sbv7xfhjOjdHEjbVNN2eZe/VP5/yWfdYHmvavosd+3/lY7AJSIi4jJ1U4uIiLhMYSwiIuIyhbGIiIjLFMYiIiIuUxiLiIi4TGEsIiLiMoWxiIiIyxTGIiIiLvt/BL3f6fDUneUAAAAASUVORK5CYII=)
%% Cell type:markdown id: tags:
#### 4. Model Evaluation
%% Cell type:code id: tags:
``` python
results = model.evaluate(X_test, y_test)
print(results)
```
%%%% Output: stream
71/71 [==============================] - 1s 7ms/step - loss: 1.2564 - accuracy: 0.7845
[1.2563728094100952, 0.7845057845115662]
%% Cell type:markdown id: tags:
#### 5. Prediction
%% Cell type:code id: tags:
``` python
predictions = model.predict(X_test)
np.argmax(predictions[0])
```
%%%% Output: execute_result
3
%% Cell type:markdown id: tags:
# Exercise 2 - Recurrent Neural Networks for Prediction of Temperature Time Series
%% Cell type:markdown id: tags:
Throughout this exercise, all of our code examples will target a single problem: predicting the temperature 24 hours in the future, given a timeseries of hourly measurements of quantities such as atmospheric pressure and humidity, recorded over the recent past by a set of sensors on the roof of a building. As you will see, it’s a fairly challenging
problem!
We’ll use this temperature-forecasting task to highlight what makes timeseries data fundamentally different from the kinds of datasets you’ve encountered so far. You’ll see that densely connected networks and convolutional networks aren’t well-equipped to deal with this kind of dataset, while recurrent neural networks (RNNs) really shine on this type of problem.
We’ll work with a weather timeseries dataset recorded at the weather station at the Max Planck Institute for Biogeochemistry in Jena, Germany. In this dataset, 14 different quantities (such as temperature, pressure, humidity, wind direction, and so on) were recorded every 10 minutes over several years. The original data goes back to 2003, but the subset of the data we’ll download is limited to 2009–2016.
Let’s start by downloading and uncompressing the data:
%% Cell type:code id: tags:
``` python
!wget https://s3.amazonaws.com/keras-datasets/jena_climate_2009_2016.csv.zip
!unzip jena_climate_2009_2016.csv.zip
```
%% Cell type:markdown id: tags:
Now let’s inspect the data of the Jena weather dataset:
%% Cell type:code id: tags:
``` python
import os
fname = os.path.join("jena_climate_2009_2016.csv")
print(fname)
```
%%%% Output: stream
jena_climate_2009_2016.csv
%% Cell type:code id: tags:
``` python
with open(fname) as f:
data = f.read()
```
%% Cell type:code id: tags:
``` python
lines = data.split("\n")
print(lines[:2])
```
%%%% Output: stream
['"Date Time","p (mbar)","T (degC)","Tpot (K)","Tdew (degC)","rh (%)","VPmax (mbar)","VPact (mbar)","VPdef (mbar)","sh (g/kg)","H2OC (mmol/mol)","rho (g/m**3)","wv (m/s)","max. wv (m/s)","wd (deg)"', '01.01.2009 00:10:00,996.52,-8.02,265.40,-8.90,93.30,3.33,3.11,0.22,1.94,3.12,1307.75,1.03,1.75,152.30']
%% Cell type:markdown id: tags:
This outputs a count of 420'551 lines of data (each line is a timestep: a record of a
date and 14 weather-related values), as well as the following header:
%% Cell type:code id: tags:
``` python
header = lines[0].split(",")
lines = lines[1:]
print(header)
print(len(lines))
```
%%%% Output: stream
['"Date Time"', '"p (mbar)"', '"T (degC)"', '"Tpot (K)"', '"Tdew (degC)"', '"rh (%)"', '"VPmax (mbar)"', '"VPact (mbar)"', '"VPdef (mbar)"', '"sh (g/kg)"', '"H2OC (mmol/mol)"', '"rho (g/m**3)"', '"wv (m/s)"', '"max. wv (m/s)"', '"wd (deg)"']
420451
%% Cell type:markdown id: tags:
Now, convert all 420'451 lines of data into NumPy arrays: one array for the temperature
(in degrees Celsius), and another one for the rest of the data — the features we
will use to predict future temperatures. Note that we discard the `Date Time` column.
%% Cell type:code id: tags:
``` python
import numpy as np
temperature = np.zeros((len(lines),))
raw_data = np.zeros((len(lines), len(header) - 1))
print(temperature.shape)
print(raw_data.shape)
```
%%%% Output: stream
(420451,)
(420451, 14)
%% Cell type:code id: tags:
``` python
for i, line in enumerate(lines):
values = [float(x) for x in line.split(",")[1:]]
# We store column 1 in the “temperature” array.
temperature[i] = values[1]
# We store all columns (including the temperature) in the “raw_data” array.
raw_data[i, :] = values[:]
```
%% Cell type:code id: tags:
``` python
temperature[:2]
print(raw_data[:3])
```
%%%% Output: stream
[[ 9.96520e+02 -8.02000e+00 2.65400e+02 -8.90000e+00 9.33000e+01
3.33000e+00 3.11000e+00 2.20000e-01 1.94000e+00 3.12000e+00
1.30775e+03 1.03000e+00 1.75000e+00 1.52300e+02]
[ 9.96570e+02 -8.41000e+00 2.65010e+02 -9.28000e+00 9.34000e+01
3.23000e+00 3.02000e+00 2.10000e-01 1.89000e+00 3.03000e+00
1.30980e+03 7.20000e-01 1.50000e+00 1.36100e+02]
[ 9.96530e+02 -8.51000e+00 2.64910e+02 -9.31000e+00 9.39000e+01
3.21000e+00 3.01000e+00 2.00000e-01 1.88000e+00 3.02000e+00
1.31024e+03 1.90000e-01 6.30000e-01 1.71600e+02]]
%% Cell type:markdown id: tags:
The figure below shows the plot of temperature (in degrees Celsius) over time. On this plot,
you can clearly see the yearly periodicity of temperature — the data spans 8 years.
%% Cell type:code id: tags:
``` python
%matplotlib inline
from matplotlib import pyplot as plt
plt.plot(range(len(temperature)), temperature)
```