파이썬 머신러닝 판다스 데이터 분석 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된 값 돌려줌

 

 

복사했습니다!