[중급] 가볍게 이것저것
[스마트 빌딩] 건물의 전력 소비량 알아보기_1
PassionPython
2019. 8. 21. 16:21
COMmercial Building Energy Data set
(COMBED)
데이터분석, 시각화
이 데이터 셋은 한 대학교 건물로부터 얻은 1달 간의 전력 소비량 데이터 입니다.
컬럼 설명
(데이터는 다음의 링크에서 다운받으실 수 있습니다)
time
- 타임스탬프, 1/30 Hz 주기이고 밀리초(ms) 단위로 획득됩니다.
Power
- 건물의 해당 시간 전기 에너지 소비량
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
path = 'data/COMBED/total_main.csv'
building = pd.read_csv(path, sep=',')
building.head()
1401695783000.0 | 40767.359375 | |
---|---|---|
0 | 1.401696e+12 | 41936.476562 |
1 | 1.401696e+12 | 40863.601562 |
2 | 1.401696e+12 | 40860.156250 |
3 | 1.401696e+12 | 44302.625000 |
4 | 1.401696e+12 | 41400.218750 |
# 데이터 셋에 컬럼명이 들어있지 않기 때문에, 직접 넣어줍니다.
building.columns = ['time', 'Power']
# 컬럼명이 제대로 들어간 것을 확인합니다.
building.head()
time | Power | |
---|---|---|
0 | 1.401696e+12 | 41936.476562 |
1 | 1.401696e+12 | 40863.601562 |
2 | 1.401696e+12 | 40860.156250 |
3 | 1.401696e+12 | 44302.625000 |
4 | 1.401696e+12 | 41400.218750 |
# .astype() 을 이용하여 데이터의 형태를 바꿀 수 있습니다.
# ms 영역대의 데이터이므로, datetime64[ms] 로 바꾸어줍니다.
# 이렇게 바꾼 데이터를 datetime 컬럼에 넣어줍니다.
building['datetime'] = building['time'].astype("datetime64[ms]")
# s 영역대의 데이터라면, datetime64[s] 를 넣어주어야 합니다.
# 시간 datetime이 제대로 들어간 것을 확인합니다.
building.head()
# 14년도 6월 2일 07시 56분 경 부터 획득하였습니다.
# 30 초 주기로 들어간 것을 확인하였습니다.
time | Power | datetime | |
---|---|---|---|
0 | 1.401696e+12 | 41936.476562 | 2014-06-02 07:56:53 |
1 | 1.401696e+12 | 40863.601562 | 2014-06-02 07:57:23 |
2 | 1.401696e+12 | 40860.156250 | 2014-06-02 07:57:53 |
3 | 1.401696e+12 | 44302.625000 | 2014-06-02 07:58:23 |
4 | 1.401696e+12 | 41400.218750 | 2014-06-02 07:58:53 |
# .tail로 14년도 7월 1일 04시 까지 획득하였음을 확인합니다.
building.tail()
time | Power | datetime | |
---|---|---|---|
82882 | 1.404187e+12 | 31189.355469 | 2014-07-01 03:57:53 |
82883 | 1.404187e+12 | 31259.027344 | 2014-07-01 03:58:23 |
82884 | 1.404187e+12 | 34298.542969 | 2014-07-01 03:58:53 |
82885 | 1.404187e+12 | 33069.281250 | 2014-07-01 03:59:23 |
82886 | 1.404187e+12 | 34743.265625 | 2014-07-01 03:59:53 |
# building 데이터에 연, 월, 일, 시, 분, 초를 나타내는 새로운 컬럼을 생성합니다.
# 각각의 이름을 datetime-month/day/hour/minute/second라고 지정합니다.
# 이 컬럼에 날짜(datetime) 컬럼의 dt(datetime의 약자입니다) 옵션을 활용하여 월일시분을 따로 넣어줍니다.
building["datetime-month"] = building["datetime"].dt.month
building["datetime-day"] = building["datetime"].dt.day
building["datetime-hour"] = building["datetime"].dt.hour
building["datetime-minute"] = building["datetime"].dt.minute
# dayofweek는 날짜에서 요일(월~일)을 가져오는 기능입니다.
# 값은 0(월), 1(화), 2(수), 3(목), 4(금), 5(토), 6(일) 을 나타냅니다.
building["datetime-dayofweek"] = building["datetime"].dt.dayofweek
# building 변수에 할당된 데이터의 행렬 사이즈를 출력합니다.
# 출력은 (row, column) 으로 표시됩니다.
print(building.shape)
# .head()로 building 데이터의 상위 5개를 띄우되,
# datetime과 이와 연관된 나머지 다섯 개의 컬럼만을 출력합니다.
building[["datetime", "datetime-month", "datetime-day",
"datetime-hour", "datetime-minute", "datetime-dayofweek"]].head()
(82887, 8)
datetime | datetime-month | datetime-day | datetime-hour | datetime-minute | datetime-dayofweek | |
---|---|---|---|---|---|---|
0 | 2014-06-02 07:56:53 | 6 | 2 | 7 | 56 | 0 |
1 | 2014-06-02 07:57:23 | 6 | 2 | 7 | 57 | 0 |
2 | 2014-06-02 07:57:53 | 6 | 2 | 7 | 57 | 0 |
3 | 2014-06-02 07:58:23 | 6 | 2 | 7 | 58 | 0 |
4 | 2014-06-02 07:58:53 | 6 | 2 | 7 | 58 | 0 |
# matplotlib의 subplots를 사용합니다. 이 함수는 여러 개의 시각화를 한 화면에 띄울 수 있도록 합니다.
# 이번에는 2x2으로 총 4개의 시각화를 한 화면에 띄웁니다.
figure, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2)
# 시각화의 전체 사이즈는 18x8로 설정합니다.
figure.set_size_inches(18, 8)
# seaborn의 barplot으로 subplots의 각 구역에
# 월, 일, 시, 분 별 전력 소비량을 출력합니다.
sns.barplot(data=building, x="datetime-month", y="Power", ax=ax1)
sns.lineplot(data=building, x="datetime-day", y="Power", ax=ax2)
sns.lineplot(data=building, x="datetime-hour", y="Power", ax=ax3)
sns.barplot(data=building, x="datetime-minute", y="Power", ax=ax4)
<matplotlib.axes._subplots.AxesSubplot at 0x298f93887f0>
# 행을 시간으로, 열을 요일로 하는 피벗 테이블인 pivoted을 만들고
pivoted = building.pivot_table(index = 'datetime-dayofweek', columns = 'datetime-hour', values = 'Power')
# 이 피벗 테이블을 히트맵 방식으로 시각화 합니다. cmap 옵션은 색 분포를 의미합니다.
sns.heatmap(pivoted, cmap='hot')
plt.gcf().set_size_inches(20, 5)