날씨 데이터셋

예측에 사용할 시계열 데이터로 독일의 Max Planck Institute for Biogeochemistry에서 관측한 날씨 데이터셋을 사용합니다.

이 날씨 데이터셋은 2003년 이후 10분 간격으로 관측된 온도, 대기압, 습도와 같은 14종류의 다양한 관측치를 포함하고 있습니다.

편의를 위해 2009년부터 2016년 사이의 데이터만 사용합니다.


데이터셋 준비하기

아래의 코드와 같이 필요한 라이브러리들을 불러온 다음, 날씨 데이터셋을 다운로드합니다.

import tensorflow as tf
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd

mpl.rcParams['figure.figsize'] = (8, 6)
mpl.rcParams['axes.grid'] = False

zip_path = tf.keras.utils.get_file(
  origin='https://storage.googleapis.com/tensorflow/tf-keras-datasets/jena_climate_2009_2016.csv.zip',
  fname='jena_climate_2009_2016.csv.zip',
  extract=True)
csv_path, _ = os.path.splitext(zip_path)
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/jena_climate_2009_2016.csv.zip
13574144/13568290 [==============================] - 1s 0us/step

이제 날씨 데이터가 준비되었습니다.




데이터셋 살펴보기

Pandas를 이용해서 csv 형식의 데이터를 잠시 들여다 보겠습니다.

df = pd.read_csv(csv_path)
print(df.head())
print(df.columns)
Date Time  p (mbar)    ...     max. wv (m/s)  wd (deg)
0  01.01.2009 00:10:00    996.52    ...              1.75     152.3
1  01.01.2009 00:20:00    996.57    ...              1.50     136.1
2  01.01.2009 00:30:00    996.53    ...              0.63     171.6
3  01.01.2009 00:40:00    996.51    ...              0.50     198.0
4  01.01.2009 00:50:00    996.51    ...              0.63     214.3

[5 rows x 15 columns]
Index(['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)'],
dtype='object')

df.head()는 DataFrame 객체의 작은 샘플을 보기 위해 사용합니다. 입력한 숫자만큼의 행을 출력하지만 기본적으로 5개의 행을 출력하도록 되어있습니다.

출력 결과를 보면 날짜-시간, 대기압, 온도 등의 순서로 15개의 열 (column)을 갖고, 10분 간격으로 기록된 데이터임을 알 수 있습니다.

따라서 하루에 144 (6×24)개의 데이터들이 있습니다.



뉴럴네트워크 모델을 훈련하는데 사용할 특정한 시간 윈도우의 데이터를 얻기 위해 아래의 함수를 사용합니다.

def univariate_data(dataset, start_index, end_index, history_size, target_size):
    data = []
    labels = []

    start_index = start_index + history_size
    if end_index is None:
        end_index = len(dataset) - target_size

    for i in range(start_index, end_index):
        indices = range(i - history_size, i)
        # Reshape data from (history_size,) to (history_size, 1)
        data.append(np.reshape(dataset[indices], (history_size, 1)))
        labels.append(dataset[i+target_size])
    return np.array(data), np.array(labels)

history_size는 과거 데이터의 크기를 의미합니다.

target_size는 모델이 얼마 동안의 미래를 예측할지를 의미합니다.



TRAIN_SPLIT = 300000
tf.random.set_seed(13)

이제부터 데이터셋의 앞에서부터 300,000개 행의 데이터를 훈련에 사용하고, 이후의 데이터들을 검증 (validation)에 사용합니다.

300,000개의 데이터는 약 2,083일 정도의 데이터입니다.

재현성을 보장하기 위해 시드를 설정합니다.



지금까지 작성한 코드는 아래와 같습니다.

import tensorflow as tf
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import os
import pandas as pd

mpl.rcParams['figure.figsize'] = (8, 6)
mpl.rcParams['axes.grid'] = False

zip_path = tf.keras.utils.get_file(
  origin='https://storage.googleapis.com/tensorflow/tf-keras-datasets/jena_climate_2009_2016.csv.zip',
  fname='jena_climate_2009_2016.csv.zip',
  extract=True)
csv_path, _ = os.path.splitext(zip_path)

df = pd.read_csv(csv_path)
print(df.head())
print(df.columns)


def univariate_data(dataset, start_index, end_index, history_size, target_size):
  data = []
  labels = []

  start_index = start_index + history_size
  if end_index is None:
      end_index = len(dataset) - target_size

  for i in range(start_index, end_index):
      indices = range(i - history_size, i)
      # Reshape data from (history_size,) to (history_size, 1)
      data.append(np.reshape(dataset[indices], (history_size, 1)))
      labels.append(dataset[i+target_size])
  return np.array(data), np.array(labels)


TRAIN_SPLIT = 300000
tf.random.set_seed(13)


이전글/다음글