import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os
from glob import glob
from tqdm.notebook import tqdm
rf_filepaths = glob("./data/rf_data/*.csv")
water_filepaths = glob("./data/water_data/*.csv")
rf_files = []
water_files = []
for filepath in rf_filepaths:
rf_files.append(pd.read_csv(filepath))
for filepath in water_filepaths:
water_files.append(pd.read_csv(filepath))
sample_submission = pd.read_csv("./data/sample_submission.csv")
csv 파일을 불러와 넣어준다.
데이터를 각각 찍어보면 다음과 같다
rf_files[0].head()
water_files[0].head()
# datetime string to unixtime integer
def str_to_unixtime(str_time):
return int(pd.Timestamp(str_time).timestamp())
for file in rf_files:
file['time'] = file['ymdhm'].apply(str_to_unixtime)
for file in water_files:
file['time'] = file['ymdhm'].apply(str_to_unixtime)
앞서 외부데이터 정리에서 다뤘던 것과 동일한 방법으로
시계열 데이터를 integer 형태의 데이터로 바꿔준다.
plt.figure(figsize=(25,10))
sns.lineplot(x = water_files[0].time, y = water_files[0].wl_1018662)
sns.lineplot(x = water_files[0].time, y = water_files[0].wl_1018680)
sns.lineplot(x = water_files[0].time, y = water_files[0].wl_1018683)
sns.lineplot(x = water_files[0].time, y = water_files[0].wl_1019630)
청담대교, 잠수교, 한강대교, 행주대교의 수위를 예측해야 한다.
시간을 x축, 수위를 y축으로 한 그래프를 그려보면 다음과 같다.
각 대교들의 그래프는 전체적으로는 비슷한 모형을 띄고 있지만, 확연하게 각 수위가 조금씩 다른 모습을 확인할 수 있다.
water_files에는 수 많은 물 관련 데이터들이 들어있으니
더 정확하게 correlation map을 그려서 상관관계를 파악해보자
# draw correlation map
def draw_corr_map(data):
corr = data.corr()
fig, ax = plt.subplots(figsize=(10,10))
sns.heatmap(corr, mask=np.zeros_like(corr, dtype=np.bool), cmap="YlGnBu",
square=True, ax=ax)
plt.show()
draw_corr_map(water_files[0])
각 수위(wl)와 유량(fw)끼리의 상관관계는 매우 높은 것으로 나타난다.
또한 팔당댐의 공용량은 팔당댐 현재수위, 저수량과 강력한 마이너스 상관관계를 갖는다.
(저수량이 많으면, 현재 수위가 높고, 공용량은 줄어든다는 것을 알 수 있다)
시간과 강수량의 관게도 알아보자.
plt.figure(figsize=(25,10))
sns.lineplot(x = rf_files[0].time, y = rf_files[0].rf_10184100)
sns.lineplot(x = rf_files[0].time, y = rf_files[0].rf_10184110)
sns.lineplot(x = rf_files[0].time, y = rf_files[0].rf_10184140)
이와 같이 강수량을 나타낼 수 있다.
아무래도 비가 많이 오면 각 대교의 수위가 달라질 것으로 보이니, 이들의 관계가 어떻게 되는지
더 자세히 알아보자.
# normalize pd series
def normalize(series):
return (series - series.min()) / (series.max() - series.min())
plt.figure(figsize=(18,8))
sns.lineplot(x = rf_files[0].time, y =normalize(rf_files[0].rf_10184100))
sns.lineplot(x = water_files[0].time, y = normalize(water_files[0].wl_1018662))
이와 같이 강수량과 수위는 꽤나 상관관계가 있는 것으로 보인다.
상관관계를 확인했으니 얼른 데이터 전처리를 해주자.