
파이썬 머신러닝 판다스 데이터 분석 2강 복습
# csv 파일 읽기
# 라이브러리 불러오기
import pandas as pd
# 파일 경로 찾고 변수 file_path에 저장
file_path = 'read_csv_sample.csv'
# read_csv() 함수로 데이터프레임 변환, 변수 df에 저장
df = pd.read_csv(file_path)
# read_csv() 함수로 데이터프레임 변환, 변수 df_noheader에 저장, header=None 옵션
df_noheader = pd.read_csv(file_path, header=None)
# read_csv() 함수로 데이터 프레임 변환, 변수 df_ind_col에 저장, index_col=None 옵션
df_ind_col= pd.read_csv(file_path, index_col = None)
# read_csv() 함수로 데이터 프레임 변환, 변수 df_index_col에 저장, index_col='c0' 옵션
df_index_col = pd.read_csv(file_path, index_col='c0')
df_noheader : headr = None >> csv 파일의 첫 행의 데이터가 열 이름
df_ind_col : index_col = None >> 행 인덱스는 정수 0,1,2가 자동으로 지정
df_index_col : index_col = 'c0' >> 'c0' 열이 행 인덱스가 됨
<csv 파일 옵션>
옵션 | 설명 |
path | 파일의 위치(파일명 포함), URL |
sep (또는 delimiter) | 텍스트 데이터를 필드별로 구분하는 문자 |
header | 열 이름으로 사용될 행의 번호 (기본값은 0) header가 없고 첫 행부터 데이터가 있는 경우 None으로 지정 |
index_col | 행 인덱스로 사용할 열의 번호 또는 열 이름 |
names | 열 이름으로 사용할 문자열 리스트 |
skiprows | 처음 몇 줄을 skip할 것인지 설정(숫자 입력) skip하려는 행의 번호를 담은 리스트로 설정 가능 (예 : [1,3,5]) |
parse_dates | 날짜 텍스트를 datetime64로 변환할 것인지 설정(기본값은 False) |
skip_footer | 마지막 몇 줄을 skip할 것인지 설정(숫자 입력) |
encoding | 텍스트 인코딩 종류를 지정(예 : 'utf-8') |
# JSON 파일
- 데이터 공유를 목적으로 개발된 특수한 파일 형식
- 파이썬 딕셔너리와 비슷하게 'key : value' 구조
import pandas as pd
# read_json() 함수로 데이터프레임 변환
pd.read_json('read_json_sample.json')
# 웹(web)에서 가져오기
## HTML 문서 가져오기
- read_html() 함수를 이용하여 웹 페이지의 표 정보를 파싱(parsing)
import pandas as pd
# HTML 파일 경로 or 웹 페이지 주소를 url 변수에 저장
url ='sample.html'
# HTML 웹페이지의 표(table)를 가져와서 데이터프레임으로 변환
tables = pd.read_html(url)
# 표(table)의 개수 확인
print(len(tables))
# 크롤링할 때 사용 (****)
# tables 리스트의 원소를 iteration하면서 각각 화면 출력
for i in range(len(tables)):
print(i)
print('\n')
print(tables[i])
# 파이썬 패키지 정보가 들어 있는 두 번째 데이터프레임을 선택하여 df 변수에 저장
df = tables[1]
# 'name' 열을 인덱스로 지정
df.set_index(['name'], inplace=True)
df
## 웹 스크래핑 (web scraping)
- BeautifulSoup 등 웹 스크래핑(scraping) 도구로 수집한 데이터를 판다스 데이터프레임으로 정리
- 스크래핑한 내용을 파이썬 리스트, 딕셔너리 등으로 정리한 뒤 DataFrame() 함수에 리스트, 딕셔너리 등으로
정리한 뒤 DataFrame() 함수에 리스트나 딕셔너리 형태로 전달하여 데이터프레임으로 변환
# 라이브러리 불러오기
from bs4 import BeautifulSoup
import requests
import re
import pandas as pd
- 위키피디아 미국 ETF 웹 페이지에서 필요한 정보를 스크래핑하여 딕셔너리 형태로 변수 etfs에 저장
# 위키피디아 미국 ETF 웹 페이지에서 필요한 정보를 스크래핑하여 딕셔너리 형태로 변수 etfs에 저장
url ='https://en.wikipedia.org/wiki/Exchange-traded_fund'
response = requests.get(url)
response
# <Response [200]> : 잘 나왔다는 뜻
# https://ooz.co.kr/260
response.text
# F12키 눌렀을 때 나오는 정보들
>> requests를 이용하여 url로 get 요청을 보내고 응답을 받는다. 상태 코드와 HTML 내용을 받을 수 있다.
# get 함수 : 반응이 없으면 error가 안뜸
>> Response [200] : 잘 나왔다는 뜻
>> 참고 https://ooz.co.kr/260
soup = BeautifulSoup(response.text, 'lxml')
soup.select('div > #mw-content-text')
rows = soup.select('div>p')
etf = {}
for row in rows:
try:
etf = re.findall('^(.*)', row.text) # .하고 구두점 제거
except AttributeError as err:
pass
etf
>> 응답받은 HTML 내용을 Beautifulsoup 클래스의 객체 형태로 생성/ 반환
BeautifulSoup 객체를 통해 lxml HTML 파싱하기 위한 여러 가지 기능을 사용할 수 있다.
# Parser
1. html.parser >> python 내장 파서
파이썬 코드로 되어있기 때문에 C 라이브러리를 활용할 수 없는 곳이나 심플하게 사용할 때 사용
2. lxml >> lxml's HTML parser
외부 C 라이브러리. lxml을 따로 설치해야하지만 html.parser보다 유연하고 빠른 처리가 가능하다
>> CSS 셀렉터를 이용해 원하는 정보를 찾음
>> div 태그 하위의 p태그를 rows라고 지정
>> rows의 '.'과 구두점을 제거하고 AttributeError는 무시, 처리한 값을 etf에 저장
<참고> 정규표현식
data = """
park 800905-1049118
kim 700905-1059119
"""
result = []
for line in data.split("\n"):
word_result = []
for word in line.split(" "):
if len(word) == 14 and word[:6].isdigit() and word[7:].isdigit(): # isdigit : 숫자로 되어있다면
word = word[:6] + "-" + "*******"
word_result.append(word)
result.append(" ".join(word_result)) # 각각의 나눠저 있는 것으 word_result에 넣고 전체를 result에 넣음
print("\n".join(result))
park 800905-*******
kim 700905-*******
data.split('\n')
# >> ['', 'park 800905-1049118', 'kim 700905-1059119', '']
# word[:6].isdigit()
'700905'.isdigit()
# word = word[:6] + "-" + "*******"
# >> 700905-*******
- [a-zA-Z] : 알파벳 모두
[0-9] : 숫자
Method | 목적 |
match() | 문자열의 처음부터 정규식과 매치되는지 조사한다. |
search() | 문자열 전체를 검색하여 정규식과 매치되는지 조사한다. |
findall() | 정규식과 매치되는 모든 문자열(substring)을 리스트로 돌려준다. |
finditer() | 정규식과 매치되는 모든 문자열(substring)을 반복 가능한 객체로 돌려준다. |
group() | 매치된 문자열을 돌려준다. |
start() | 매치된 문자열의 시작 위치를 돌려준다. |
end() | 매치된 문자열의 끝 위치를 돌려준다. |
span() | 매치된 문자열의 (시작, 끝)에 해당하는 튜플을 돌려준다. |
import re
p = re.compile('[a-z]+') # 정규식 : 문자열 있는거 다 뽑아와
m = p.match('python') # 0-6 훑었는데 match한 값 'python'
print(m)
# >> <re.Match object; span=(0, 6), match='python'>
m = p.match('3 python')
print(m)
# >> None
>> [a-z]+ 정규식 : 문자열 있는거 다 뽑기
문자열 다 훑어서 match 된 값 반환
p = re.compile('[a-z]+')
m = p.match( 'string goes here' )
if m:
print('Match found: ', m.group())
else:
print('No match')
Match found: string
>> m.group() : 문자열 훑어서 match된 값 돌려줌