안녕하세요!

[데이터 분석] 데이터 수집하여 파일로 저장해보기 본문

개발일지/데이터 분석

[데이터 분석] 데이터 수집하여 파일로 저장해보기

shinyfood 2023. 11. 28. 23:38
728x90
반응형

이번 챕터에 들어가기에 앞서 데이터를 공공데이터에서 받아왔음을 알린다.

 

<한국전력거래소 시간별 전력수요량 데이터 수집>
 - 수집위치 : data.go.kr

 

데이터 불러들이기

 

import pandas as pd
file_path = "./01_data/한국전력거래소_시간별 전력수요량_20211231.csv"
df = pd.read_csv(file_path, encoding="euc-kr")

해당하는 파일을 다운받은 뒤, 전 게시물에서 한것처럼 파일의 경로를 지정해주고, df라는 변수로 해당 파일을 읽기로하자.

 

df라고 칭해진 한국전력거래소_시간별 전력수요량_20211231.csv

df.info()
# 결측

빠질 수 없는 결측 검사.

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 365 entries, 0 to 364
Data columns (total 25 columns):
 #   Column  Non-Null Count  Dtype 
---  ------  --------------  ----- 
 0   날짜      365 non-null    object
 1   1시      365 non-null    int64 
 2   2시      365 non-null    int64 
 3   3시      365 non-null    int64 
 4   4시      365 non-null    int64 
 5   5시      365 non-null    int64 
 6   6시      365 non-null    int64 
 7   7시      365 non-null    int64 
 8   8시      365 non-null    int64 
 9   9시      365 non-null    int64 
 10  10시     365 non-null    int64 
 11  11시     365 non-null    int64 
 12  12시     365 non-null    int64 
 13  13시     365 non-null    int64 
 14  14시     365 non-null    int64 
 15  15시     365 non-null    int64 
 16  16시     365 non-null    int64 
 17  17시     365 non-null    int64 
 18  18시     365 non-null    int64 
 19  19시     365 non-null    int64 
 20  20시     365 non-null    int64 
 21  21시     365 non-null    int64 
 22  22시     365 non-null    int64 
 23  23시     365 non-null    int64 
 24  24시     365 non-null    int64 
dtypes: int64(24), object(1)
memory usage: 71.4+ KB

모두 365개로 멀쩡함을 확인. 날짜라는 데이터의 값들은 object 나머지는 int형이다.

df.describe()
# 이상

또한 빠질 수 없는 이상검사.

이상없음을 확인.

 

### 컬럼명의 시간을 데이터화하기 위하여
# - 컬럼명 추출하기
col_list = df.columns
col_list

이제 컬럼명을 추출하여 테이블화를 준비하자.

Index(['날짜', '1시', '2시', '3시', '4시', '5시', '6시', '7시', '8시', '9시', '10시',
       '11시', '12시', '13시', '14시', '15시', '16시', '17시', '18시', '19시', '20시',
       '21시', '22시', '23시', '24시'],
      dtype='object')

3개의 열(년도, 시간, 전력량)을 가지는 데이터 프레임 생성

result_df = pd.DataFrame(columns=["년도", "시간","전력량"])
result_df

이렇게 빈 테이블을 하나 생성한다. DB에서 빈 테이블을 생성하는것과 같다고 보면된다. 이후 DB에 넣기위한 작업이라고 생각하자.

 

col_list[0]
'날짜'
col_list[1:]
Index(['1시', '2시', '3시', '4시', '5시', '6시', '7시', '8시', '9시', '10시', '11시',
       '12시', '13시', '14시', '15시', '16시', '17시', '18시', '19시', '20시', '21시',
       '22시', '23시', '24시'],
      dtype='object')

이처럼 col_list로 놓은것의 0번은 날짜 1부터 끝까지는 시간으로 나온다.

 

여기서부터 우리는 고민해야한다.

 

DB에 데이터를 넣고 정보를 뽑아내려면, 어떤식으로 컬럼을 만들어야 제일 좋은 결과값을 얻을 수 있을까?

날짜와 시간이 컬럼인 25개?

아니다.

우리는 날짜라는것과 시간이라는것 그리고 전력량이라는 데이터를 갖고있기때문에 이를 따로 컬럼으로 뽑아낼 필요가 있다. 그를위해 이런 작업을한다.

 

### 데이터프레임에 데이터 행단위 추가하기
result_df = pd.DataFrame(columns=["년도", "시간","전력량"])

for index, row in df.iterrows() :
    # print(row)
    ### 년도 데이터 
    ymd  = row[col_list[0]]
    
    ### 시간과 전력량 데이터
    
    data = row[col_list[1:]]
    # print(data)

    ### 시간과 전력량을 각각 추출하여 데이터프레임에 넣기
    # - 넣을 값 : 날짜, 시간, 전력량
    for time, value in data.items():
        # print(ymd,"/",time, "/", value)

        ### 행단위로 데이터프레임에 추가하기 위해서 추가할 행의 데이터프레임 생성.
        df_temp = pd.DataFrame({"년도":[ymd],"시간":[time],"전력량":[value]})

        ### 데이터프레임에 행단위로 추가하기
        # - concat() : 데이터프레임과 데이터프레임을 행단위 또는 컬럼단위로(axis=1) 
        # 추가할 때 사용 (axis = 0 행단위 axis = 1 열단위)
        # - ignore_index=True : 행이 추가될 때 행 인덱스 번호를 자동증가 시키기 
        #                     : 기본값 False
        result_df = pd.concat([result_df, df_temp], axis=0, ignore_index = True)

### 최종 결과 출력하기
print(result_df)

iterrowspandas에서 제공하는 DataFrame의 메서드다. DataFrame의 각 행에 대해 (인덱스, Series) 쌍을 반환하며, DataFrame을 순회하면서 각 행의 데이터를 가져올 때 사용된다.

 

ymd를 날짜로놓고 data를 시간으로놓고 모두 열로 바꾼다.

이후 data를 딕셔너리처럼 time과 value값으로 각각 넣고, 그 값을 df_temp라는 이름으로 데이터프레임화를 한다.

이 결과값을 concat을 이용하여 우리가 아까 만들어놨던 깨끗한 테이블인 result_df에 넣어준다.

for문을 반복하면, 계속해서 0번째가 들어가게되는데 ignore_index = True를 이용하면 자바에서 generated values를 쓴것처럼 index가 1씩 증가하면서 들어간다.

결국 프린트하면 결과는 이러하다. 

(매우 길지만 3가지의 분류로 입력이 완료됐다.)

정제된 데이터 파일로 저장하기

### 저장할 경로 지정
save_path = "./01_data/new_data.csv"
### index = False : 인덱스 번호값은 저장하지 않기(기본값 True)
result_df.to_csv(save_path, index = False)

save_path를 이용해 새로운 데이터를 csv파일로 저장하도록 하자.

기본적으로 index = False를 주지 않으면 옆에 필요없는 데이터도 들어가게 되니 주의하도록하자.

 

728x90
반응형