공공 데이터를 통한 시장 동향 이해 - 데이터 전처리 3

dpwl·2024년 4월 29일
0

Data Analysis with SQL

목록 보기
7/120

여러 개의 파일을 처리해야 할 때는 하나하나 전처리를 진행하는 것은 비효율적일 수 있다. 이런 경우에는 반복문을 사용하여 자동화된 전처리 과정을 구현하는 것이 좋다.

예를 들어, 여러 개의 파일이 특정한 폴더에 있다면, 다음과 같은 과정을 통해 전처리를 자동화할 수 있다.

1) 해당 폴더에 있는 모든 파일의 리스트를 가져온다.
2) 각 파일에 대해 전처리 과정을 수행한다.
3) 전처리가 완료된 데이터를 새로운 파일이나 데이터프레임에 추가하거나 저장한다.

이렇게 하면 파일이 늘어날 때마다 전처리를 일일이 수행하지 않아도 되므로 작업을 효율적으로 처리할 수 있다.

1. 절대경로와 상대경로

절대 경로는 파일의 전체 경로를 나타내며, 파일 시스템의 루트 디렉토리부터 파일까지의 경로를 포함한다.

반면에 상대 경로는 현재 작업 중인 위치(디렉토리)를 기준으로 한 파일의 위치를 나타낸다. 상대 경로는 현재 작업 중인 위치부터 파일까지의 경로를 나타내며, 따라서 파일이 위치한 폴더의 상대적인 위치를 기반으로 한다.

os 모듈을 사용하여 파이썬에서 파일 시스템을 다룰 수 있다.

import os

os.getcwd()		# 현재 작업 중인 디렉토리(폴터)의 경로 반환
os.listdir(path)	# 지정된 경로에 있는 파일 및 디렉토리의 목록 반환

이때 path에는 아래와 같이 상대 경로나 절대 경로를 입력할 수 있다.

os.listdir('./123/456/789')	# 상대 경로
os.listdir('Users/이름/Documnets/123/456/789')	# 절대 경로
os.mkdir(path)	# 지정된 경로에 새로운 디렉토리 생성

이를 통해 파이썬을 사용하여 폴더를 생성하거나 파일 시스템을 탐색할 수 있다.

# source
src = '/Users/이름/Downloads/Data'

# destination
dst = '/Users/이름/Downloads/Data_result'
file_ls = os.listdir('/Users/이름/Downloads/Data')
os.path.join(src, file_ls[0])

os.path.join 함수를 활용하여 전체 경로를 확인할 수 있다.

for f in file_ls:
    print(f)
    print(os.path.join(src, f))
    print(os.path.join(dst, f))
    
# 결과값:
# 3_상품군별거래액.csv
/Users/이름/Downloads/Data/3_상품군별거래액.csv
/Users/이름/Downloads/Data_result/3_상품군별거래액.csv

os.path.join을 이용해서 파일을 불러오고, 어디에 저장을 할 것인지 두 가지 경로를 만들 수 있다.

for f in file_ls:
    print(f)
    df = pd.read_csv(os.path.join(src, f), encoding='cp949')
    print(df.columns[:3])
    # print(os.path.join(src, f))
    # print(os.path.join(dst, f))
    
# 결과값:
# 3_온라인쇼핑몰 판매매체별 상품군별거래액.csv
# Index(['상품군별(1)', '상품군별(2)', '판매매체별(1)'], dtype='object')
# 1_온라인쇼핑몰 운영형태별 상품군별거래액.csv
# Index(['상품군별(1)', '상품군별(2)', '운영형태별(1)'], dtype='object')
# 2_온라인쇼핑몰 취급상품범위별 상품군별거래액.csv
# Index(['상품군별(1)', '상품군별(2)', '범위별(1)'], dtype='object')

폴더 내에 있는 csv 파일들을 순차적으로 꺼내올 수 있다.

for f in file_ls:
    print(f'{f}를 처리하고 있습니다.')
    df = pd.read_csv(os.path.join(src, f), encoding='cp949')
    
    result = df.melt(id_vars=df.columns[:3],
                     var_name='날짜',
                     value_name='거래액')

    result["거래액"] = result["거래액"].apply(strtoint)

    result = result[result[result.columns[0]] != "합계"]
    result = result[result[result.columns[2]] != "계"]
    result = result[result[result.columns[1]] == "소계"]
    result.drop(result.columns[1], axis='columns', inplace=True)
    
    result['날짜'] = result['날짜'].apply(lambda x : x.replace(" p)", ""))
    result['날짜'] = result['날짜'].apply(lambda x : x.replace(".", "/"))

    result.to_csv(os.path.join(dst, f), encoding='cp949', index=False)
    print(f'{f} 완료')

다음과 같이 코드를 작성하면 3개의 csv 폴더를 동일하게 데이터 전처리가 가능하다.

profile
거북선통통통통

0개의 댓글