외부 파일 읽어오기
판다스는 다양한 형태의 외부 파일을 읽어와서 데이터프레임으로 변환하는 함수를 제공한다. 반대로 데이터프레임을 다양한 유형의 파일로 저장할 수도 있다.
File Format | Reader | Writer |
CSV | read_csv | to_csv |
JSON | read_json | to_json |
HTML | read_html | to_html |
Local clipboard | reaad_clipboard | to_clipboard |
MS Excel | read_excel | to_excel |
HDF5 Format | read_hdf | to_hdf |
SQL | read_sql | to_sql |
~ CSV 파일
데이터 값을 ‘,’로 구분하고 있다는 의미로 CSV라고 부르는 텍스트 파일이다. 줄바꿈으로 행을 구분한다.
•
CSV파일 → 데이터프레임 : pd.read_csv(”파일경로(이름)”)
header 옵션은 열 이름으로 사용할 행을 지정한다. default로 1번째 행을 열로 지정한다.
index_col 옵션은 데이터프레임의 행 인덱스가 되는 열을 지정한다.
index_col = False : 인덱스 지정 안함
index_col = ‘열 이름’ : 인덱스 지정
옵션 | 설명 |
path | 파일의 위치, 파일명 포함 |
sep | 텍스트 데이터를 필드별로 구분하는 문자 |
header | 열 이름으로 사용될 행의 번호(기본값은 0), header가 없고 첫 행부터 데이터가 있는 경우 None으로 지정 |
index_col | 행 인덱스로 사용할 열의 번호 또는 열 이름 |
names | 열 이름으로 사용할 문자열의 리스트 |
skiprows | 처음 몇 줄을 skip할 것인지 설정(숫자 입력), skip하려는 행의 번호를 담은 리스트로 설정도 가능(ex) [1,3,5] |
parse_dates | 날짜 형태의 텍스트를 datetime64로 불러올 수 있음 |
skip_footer | 마지막 몇 줄을 skip할 것인지 설정(숫자 입력) |
enocoding | 텍스트 인코딩 종류를 지정 |
# csv 파일 가져오자. 파일 이름은 df_sample.csv 다.
import pandas as pd
file_path = './read_csv_sample.csv'
df1 = pd.read_csv(file_path) # 기본: header=True
print(df1)
c0 c1 c2 c3
0 0 1 4 7
1 1 2 5 8
2 2 3 6 9
# read_csv() 함수로 데이터프레임 변환. 변수 df2에 저장. header=None 옵션
df2 = pd.read_csv(file_path, header=None) # 1행으로 열 지정 안함
print(df2)
0 1 2 3
0 c0 c1 c2 c3
1 0 1 4 7
2 1 2 5 8
3 2 3 6 9
# index_col = None 옵션
df3 = pd.read_csv(file_path, index_col = None) # 기본 : index_col = None
print(df3)
c0 c1 c2 c3
0 0 1 4 7
1 1 2 5 8
2 2 3 6 9
# index_col = 'c0' 옵션 -> 특정 열을 인덱스 칼럼으로 지정할 수 있다
df4 = pd.read_csv(file_path, index_col = 'c0')
print(df4)
c1 c2 c3
c0
0 1 4 7
1 2 5 8
2 3 6 9
Python
복사
parse_dates 로 날짜/시간 데이터 파싱하기
일반적으로 날짜/시간의 데이터를 pd.read_csv 로 읽으면 텍스트로 읽게된다. 아예 불러올 때부터 형태에 맞도록 변형해서 읽어오는 방법 → parse_dates
# 1. 일이 월보다 먼저 위치할 경우 설정
pd.read_csv('date_file.csv',
sep=',',
names=['date','id','val'],
parse_dates = ['date'], # 또는 해당 열 위치
dayfirst=True,
infer_datetime_format=True)
# 2. 일이 월보다 뒤에 위치하는 경우(default) : dayfirst=False
# 3. 수동으로 함수 형태 지정해주기 : date_parser = Parser
from datetime import datetime
dt_parser = lambda x : datetime.strptime(x, '%d/%m/%Y %H:%M:%S')
pd.read_csv('date_sample',
sep=',',
names=['date','id','val'],
parse_dates=['date'],
date_parser=dt_parser)
Python
복사
~ Excel 파일
엑셀 파일(확장자 .xlsx) 의 행과 열은 데이터프레임의 행, 열로 일대일 대응된다.
read_excel() 함수이고 read_csv()함수와 사용법은 비슷하다. header, index_col 등 대부분의 옵션을 그대로 사용할 수 있다.
•
excel 파일 → 데이터프레임 :pd.read_excel(”파일 경로(이름)”)
엑셀 파일에 sheet가 여러개라면 sheet_name 을 지정해줘야 오류가 발생하지 않는다. (sheet 는 0부터 센다)
import pandas as pd
##################### excel 파일 데이터프레임으로 가져오기 ########################
# read_excel() 함수로 데이터프레임 변환
df1 = pd.read_excel('./남북한발전전력량.xlsx',engine='openpyxl') # header=0 옵션
df2 = pd.read_excel('./남북한발전전력량.xlsx',engine = 'openpyxl',header=None) # header 옵션 미적용
# 데이터프레임 출력
print(df1)
전력량 (억㎾h) 발전 전력별 1990 1991 1992 1993 ... 2011 2012 2013 2014 2015 2016
0 남한 합계 1077 1186 1310 1444 ... 4969 5096 5171 5220 5281 5404
1 NaN 수력 64 51 49 60 ... 78 77 84 78 58 66
2 NaN 화력 484 573 696 803 ... 3343 3430 3581 3427 3402 3523
3 NaN 원자력 529 563 565 581 ... 1547 1503 1388 1564 1648 1620
4 NaN 신재생 - - - - ... - 86 118 151 173 195
5 북한 합계 277 263 247 221 ... 211 215 221 216 190 239
6 NaN 수력 156 150 142 133 ... 132 135 139 130 100 128
7 NaN 화력 121 113 105 88 ... 79 80 82 86 90 111
8 NaN 원자력 - - - - ... - - - - - -
[9 rows x 29 columns]
print('\n')
print(df2)
0 1 2 3 4 ... 24 25 26 27 28
0 전력량 (억㎾h) 발전 전력별 1990 1991 1992 ... 2012 2013 2014 2015 2016
1 남한 합계 1077 1186 1310 ... 5096 5171 5220 5281 5404
2 NaN 수력 64 51 49 ... 77 84 78 58 66
3 NaN 화력 484 573 696 ... 3430 3581 3427 3402 3523
4 NaN 원자력 529 563 565 ... 1503 1388 1564 1648 1620
5 NaN 신재생 - - - ... 86 118 151 173 195
6 북한 합계 277 263 247 ... 215 221 216 190 239
7 NaN 수력 156 150 142 ... 135 139 130 100 128
8 NaN 화력 121 113 105 ... 80 82 86 90 111
9 NaN 원자력 - - - ... - - - - -
[10 rows x 29 columns]
Python
복사
~ JSON 파일
JSON 파일( 확장자 .json) 은 데이터 공유를 목적으로 개발된 특수한 파일 형식이다. 파이썬 딕셔너리와 비슷하게 ‘key : value’ 구조를 갖는데, 구조가 중첩되는 방식에 따라 다르게 적용한다.
•
JSON파일 → 데이터프레임 : pd. read_json(”파일 경로(이름)”)
##################### JSON 파일 데이터프레임으로 가져오기 ########################
# read_json () 함수로 데이터프레임 변환
df = pd.read_json('./read_json_sample.json')
print(df)
print('\n')
print(df.index)
Python
복사
웹에서 가져오기
~ HTML 웹 페이지에서 표 속성 가져오기
판다스의 read_html() 함수는 HTML 웹 페이지에 있는 <table> 태그에서 표 형식의 데이터를 모두 찾아서 데이터프레임으로 변환한다.
표 데이터들은 각각 별도의 데이터프레임으로 변환되기 때문에 여러 개의 데이터프레임을 원소로 갖는 리스트가 반환된다.
HTML 웹페이지의 주소를 따옴표안에 입력한다. 예를들면 pd.read_html(’http://www.naver.com/’) 과 같이 입력한다.
•
HTML 표 속성 읽기 : pd.read_html(”웹 주소(URL) 또는 “HTML 파일 경로(이름)” )
#################### 웹에서 가져오기 ########################
# 웹 페이지 대신 html의 파일을 가져온다.
url = './sample.html'
# HTML 웹페이지의 표를 가져와서 데이터프레임으로 변환
tables = pd.read_html(url)
# 표의 개수 확인
print(len(tables))
print('\n')
2
tables
[ Unnamed: 0 c0 c1 c2 c3
0 0 0 1 4 7
1 1 1 2 5 8
2 2 2 3 6 9,
name year developer opensource
0 NumPy 2006 Travis Oliphant True
1 matplotlib 2003 John D. Hunter True
2 pandas 2008 Wes Mckinneye True]
# tables 리스트의 원소를 iteration하면서 각각 화면 출력
for i in range(len(tables)):
print("tables[%s]" %i) # %s 자리에 i값 집어넣기
print(tables[i])
print('\n')
tables[0]
Unnamed: 0 c0 c1 c2 c3
0 0 0 1 4 7
1 1 1 2 5 8
2 2 2 3 6 9
tables[1]
name year developer opensource
0 NumPy 2006 Travis Oliphant True
1 matplotlib 2003 John D. Hunter True
2 pandas 2008 Wes Mckinneye True
# 파이썬 패키지 정보가 들어 있는 두 번째 데이터프레임을 선택하여 df 변수에 저장
df = tables[1]
# 'name'열을 인덱스로 저장
df.set_index('name', inplace=True)
print(df)
Python
복사
~ 웹 스크래핑
BeautifulSoup 등 웹 스크래핑 도구로 수집한 데이터를 판다스 데이터프레임으로 정리하는 방법을 설명한다. 먼저 스크래핑한 내용을 리스트, 딕셔너리 등으로 정리한 뒤 DataFrame() 함수에 리스트나 딕셔너리 형태로 전달하여 데이터프레임으로 변환한다.
미국 ETF 리스트를 위키피디아에서 가져와보자.
#################### 웹 스크래핑 ########################
# 라이브러리 불러오기
from bs4 import BeautifulSoup
import requests
import re
# 위키피디아 미국 ETF 웹 페이지에서 필요한 정보를 스크래핑하여 딕셔너리 형태로 변수 etfs에 저장
url = "https://en.wikipedia.org/wiki/List_of_American_exchange-traded_funds"
resp = requests.get(url)
soup = BeautifulSoup(resp.text, 'lxml') # 파서 종류인데 기본인 html파서보다 빠름
rows = soup.select('div > ul > li')# 상위태그 > 하위태그 > 하위태그 > ...
etfs = {} # 빈 딕셔너리 생성
for row in rows:
try: # 오류가 잠재된 일반적인 코드를 넣는 부분
etf_name = re.findall('^(.*) \(NYSE', row.text)
etf_market = re.findall('\((.*)\|', row.text)
etf_ticker = re.findall('NYSE Arca\|(.*)\)', row.text)
if (len(etf_ticker)>0) & (len(etf_market)>0) & (len(etf_name)>0) :
etfs[etf_ticker[0]] = [etf_market[0], etf_name[0]] # 리스트를 원소로 갖는 딕셔너리를
# 정의하는 방법
except AttributeError as err : # 오류 발생시 실행되는 코드를 넣는 부분
pass
# etfs 딕셔너리 출력
print(etfs)
print('\n')
# etfs 딕셔너리를 데이터프레임으로 변환
df = pd.DataFrame(etfs)
print(df)
Python
복사
API를 활용하여 데이터 수집하기
인터넷 서비스 업체에서 제공하는 API를 통해서 수집한 데이터를 판다스 자료구조로 변환하는 방법을 살펴보자. 대부분의 API는 판다스에서 쉽게 읽어올 수 있는 파일 형식(csv, json, xml, ...)을 지원한다. 따라서 데이터프레임으로 쉽게 변환할 수 있다.
사용자의 API키는 외부에 유출되지 않게 관리에 유의해야한다.
파이썬 환경에서 구글 지오코딩을 사용하기 위해서는 아나콘다 배포판에 googlemaps 라이브러리를 설치해야 한다.
아나콘다 프롬프트를 실행시킨 후 conda install -c conda-forge googlemaps 를 입력한다.
구글 지오코딩에 들어가서 API를 발급 받는다. (https://cloud.google.com/maps-platform/places/?hl=ko 에 접속)
API키를 발급받았다면 이제 아래 코드를실행한다.
## google 지오코딩 API를 통해 위도, 경도 데이터 가져오기
# 라이브러리 가져오기
import googlemaps
import pandas as pd
my_key = "AIzaSyDrCsyu3dHUCuY2Ik8MQni2M01w8rbb4m8" # 발급받은 api키
lat = [] # 위도
lng = [] # 경도
# 장소(또는 주소) 리스트
places = ["서울시청","국립국악원","해운대해수욕장"]
i=0
for place in places:
i = i+1
try:#오류가 잠재된 일반적인 코드를 프로그래밍
print(i, place)
# 지오코딩 API 결과값 호출하여 geo_location 변수에 저장
geo_location = maps.geocode(place)[0].get('geometry')
lat.append(geo_location['location']['lat'])
lng.append(geo_location['location']['lng'])
except: # 오류가 발생시 실행될 코드
lat.append('')
lng.append('')
print(i)
# 데이터프레임으로 변환하기
df = pd.DataFrame({'위도':lat, '경도':lng}, index=places)
print('\n')
print(df)
Python
복사
1.
사이킷런, 시본 등 파이썬 라이브러리 제공 데이터셋
2.
캐글
3.
UCI 머신러닝 저장소
4.
공공 데이터
데이터 저장하기
~CSV 파일로 저장
데이터프레임은 2차원 배열로 구조화되어있기때문에 CSV파일로 변환할 수 있다. 데이터프레임을 CSV파일로 저장하려면 to_csv() 메소드를 적용한다.
저장할 파일 경로와 파일명을 따옴표안에 입력한다.
•
csv 파일로 저장 : df.to_csv(”파일 이름(경로)”)
# 판다스의 DataFrame()함수로 데이터프레임 변환. 변수 df에 저장
data = {'name': ['Jerry','Riah','Paul'],
'algol':["A", "A+", "B"],
'basic':["C", "B", "B+"],
'c++':["B+", "C", "C+"],
}
df = pd.DataFrame(data)
df.set_index('name', inplace=True)
print(df)
algol basic c++
name
Jerry A C B+
Riah A+ B C
Paul B B+ C+
# to_csv()메소드를 사용해서 csv파일로 내보내기. 파일명은 df_sample.csv로 저장
df.to_csv("./df_sample.csv")
Python
복사
~JSON 파일로 저장
to_json()메소드를 이용한다.
•
JSON 파일로 저장 : df.to_json(”파일 이름(경로)”)
# to_json()메소드를 사용해서 JSON파일로 내보내기. 파일명은 df_sample.json 로 저장
df.to_json("./df_sample.json")
Python
복사
~ Excel파일로 저장
to_excel()메소드를 이용한다. 단, 사용하려면 openpyxl 라이브러리를 사전에 설치해야 한다. 아나콘다 배포판에는 기본 제공되므로 설치하지 않아도 된다.
# to_excel()메소드를 사용해서 Excel파일로 내보내기. 파일명은 df_sample.xlsx로 저장
df.to_excel("./df_sample.xlsx")
Python
복사
~여러 개의 데이터프레임을 하나의 Excel파일로 저장
판다스의 ExcelWriter() 함수는 Excel워크북 객체를 생성한다. 워크북 객체는 말 그대로 Excel파일이라고 생각하면 된다.
sheet_name 옵션에 엑셀 파일의 시트 이름을 입력하여 삽입되는 시트 위치를 지정할 수 있다. 즉 같은 엑셀파일의 서로 다른 시트에 여러 데이터프레임을 구분하여 저장할 수있다.
•
데이터프레임 여러 개를 엑셀 파일로 저장 : pd.ExcelWriter(”파일 이름(경로)”)
data1 = {'name': ['Jerry','Riah','Paul'],
'algol':["A", "A+", "B"],
'basic':["C", "B", "B+"],
'c++':["B+", "C", "C+"],
}
data2 = ('c0':[1,2,3],
'c1':[4,5,6],
'c2':[7,8,9],
'c3':[10,11,12],
'c4':[13,14,15]}
df1 = pd.DataFrame (data1)
df1.set_index('name', inplace=True)
print(df1)
algol basic c++
name
Jerry A C B+
Riah A+ B C
Paul B B+ C+
df2 = pd.DataFrame(data2)
df2.set_index('c0', inplace=True)
print(df2)
c1 c2 c3 c4
c0
1 4 7 10 13
2 5 8 11 14
3 6 9 12 15
# df1을 'sheet1'으로, df2를 'sheet2'로 저장(Excel 파일명은 "df_excelwriter.xlsx")
writer = pd.ExcelWriter("./df_excelwriter.xlsx") # 파일먼저 생성
df1.to_excel(writer, sheet_name="sheet1")
df2.to_excel(writer, sheet_name="sheet2")
writer.save() # 저장
Python
복사