티스토리 뷰

python

[python] sklearn, pandas(2)

코딩계란 2024. 2. 13. 01:38
728x90

sklearn

CMD창에 입력

pip install scikit-learn

 

 

scikit-learn: machine learning in Python — scikit-learn 1.4.0 documentation

Model selection Comparing, validating and choosing parameters and models. Applications: Improved accuracy via parameter tuning Algorithms: grid search, cross validation, metrics, and more...

scikit-learn.org

 

 

데이터 셋 불러오기

UCI 머신러닝 데이터 저장소: https://archive.ics.uci.edu/ml/index.php
kaggle: https://www.kaggle.com
데이콘: https://dacon.io/

 

scikit-learn에서 제공하는 데이터 셋

  •  https://scikit-learn.org/stable/datasets/toy_dataset.html
  • load_digits(): 숫자 데이터 셋 - 분류에 사용
  • load_iris(): 붓꽃 데이터 - 분류에 사용
  • load_diabetes(): 당뇨병 데이터 - 회귀에 사용
  • load_linnerud(): 체력 검사 데이터 - 회귀에 사용
  • load_wine(): 와인 품질 데이터 - 분류에 사용
  • load_breast_cancer(): 유방암 데이터 - 분류에 사용
 

7.1. Toy datasets

scikit-learn comes with a few small standard datasets that do not require to download any file from some external website. They can be loaded using the following functions: These datasets are usefu...

scikit-learn.org

 

실습

사이킷런에서 제공하는 데이터 사용

from sklearn import datasets

iris 데이터 읽어오기

iris = data

 

 

데이터 확인 

 

텍스트 파일 읽기

  • 텍스트 파일을 읽을 때 파일의 포맷과 인코딩 방식을 확인
  • 인코딩 방식: utf-8, euc-kr, cp949(ms949 - 윈도우의 한글 기본 포맷)가 한글에 사용 

fwf 파일 읽기

일정한 간격을 가지고 컬럼을 구분하는 텍스트 파일

 

읽기 위한 API

pandas.read_fwf('파일 경로', widths = (글자 사이의 간격), names = (컬럼 이름 나열), encoding=인코딩 방식)

 

실습

윈도우에서 파일의 경로를 설정할 때 역슬래시(\\)는  두번씩 입력해야 한다. 

프로그래밍언어에서 역슬래시 다음에 하나의 문자가 오면 제어문자로 인식하기 때문 

df = pd.read_fwf('C:\\Users\\USER\\Downloads\\data\\data\\data_fwf.txt',
                 width = (10, 2 , 5),
                 names=('날짜','이름','가격'),
                 encoding = 'utf-8')
print(df)
# 결과
           날짜  이름     가격
0  2017-04-10  다음  32000
1  2017-04-11  다음  34000
2  2017-04-12  다음  33000

사용 파일


CSV 파일 읽기

csv: 구분 기호로 분리된 텍스트 파일 

# 기본 구분자가 , 
pandas.read_csv
#기본 구분자가 탭
pandas.read_table

실습

item = pd.read_csv('C:\\Users\\USER\\Downloads\\data\\data\\item.csv')
print(item)
print(item.info())
#결과
   code  manufacture            name  price
0     1        korea           apple   1500
1     2        korea      watermelon  15000
2     3        korea  oriental melon   1000
3     4  philippines          banana    500
4     5        korea           lemon   1500
5     6        korea           mango    700
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 6 entries, 0 to 5
Data columns (total 4 columns):
 #   Column       Non-Null Count  Dtype 
---  ------       --------------  ----- 
 0   code         6 non-null      int64 
 1   manufacture  6 non-null      object
 2   name         6 non-null      object
 3   price        6 non-null      int64 
dtypes: int64(2), object(2)
memory usage: 324.0+ bytes
None

사용 파일

옵션

  • path: 데이터의 경로
  • sep(delimiter): 구분자 설정. 기본 설정은 ,
  • header: 컬럼 이름의 행 번호를 설정. 기본은 0이고 없을 때는 None으로 설정
  • index_col: 인덱스로 사용할 컬럼 번호나 컬럼 이름을 설정 
  • names: 컬럼 이름으로 사용할 수 있는 list 설정. header = None일 때만 사용 가능
  • skiprows: 읽지 않을 행의 개수
  • nrows: 읽어올 행의 개수 
  • skip_footer: 무시할 마지막 행의 개수
  • encoding: 인코딩 설정. 기본 설정은 utf-8. 
  • thounsands: 천 단위로 구분 기호 설정하지 않으면 ,를 문자로 인식
  • na_values: NA값으로 처리할 문자 list
  • parse_dates: 날짜를 문자열이 아니라 날짜로 인식하기 위한 설정. 기본은 False

 csv파일을 읽을 때 파일의 용량이 크지 않을 경우 먼저 파일을 열고 첫번째 행이 컬럼의 이름인지 여부, 한글 포함 여부, 구분 기호 등을 확인한다. 

읽을려는 데이터가 많은 경우

  • 데이터의 양이 아주 많은 경우에는 한 번에 읽으려고 하면 실패하는 경우 발생.
  • nrows 속성을 이용해서 시작위치에서부터 일부분의 데이터만 읽어오고 skiprows를 이용해서 읽을 수 있다. 
#예시
i = 0
while True:
    try:
        parser = pd.read_csv('C:\\Users\\USER\\Downloads\\data\\data\\good.csv',
                  header = None, nrows = 2, skiprows = i*2) 
        print(parser)
        i = i+1
    except:
        break
#결과
        0   1      2
0   apple  10   1500
1  banana   5  15000
       0   1     2
0  melon   7  1000
1   kiwi  20   500
        0   1     2
0   mango  30  1500
1  orange   4   700
  • chunksize를 설정해서 한 번에 읽을 수 있는 데이터의 개수를 설정하고 이 때 리턴되는 TextParser 객체를 순회한다.
parser = pd.read_csv('C:\\Users\\USER\\Downloads\\data\\data\\good.csv',
                  header = None, chunksize = 2) 
for piece in parser:
    print(piece)
#결과
        0   1      2
0   apple  10   1500
1  banana   5  15000
       0   1     2
2  melon   7  1000
3   kiwi  20   500
        0   1     2
4   mango  30  1500
5  orange   4   700

엑셀 파일 읽기 

pandas.read_exel("파일 경로")
pandas.io.excel.read_excel("파일경로")
  • 옵션은 read_csv와 거의 유사하지만 sep 옵션이 없다.
  • sheet_name 속성을 이용하여 읽어올 시트의 이름을 설정할 수 있다.
  • xlrd 패키지를 설치할 필요가 있다. 
pip install xlrd

 

엑셀 파일로 저장

엑셀파일경로를 갖는 라이터 변수 = pandas.ExcelWriter("엑셀파일 경로", engine="xlsxwriter")
데이터프레임.to_excel(라이터 변수, sheet_name='시트이름')
라이터변수.save()

 


Web의 데이터 읽기 

HTML에 있는 table 태그의 모든 정보 가져오기 

pandas.read_html("파일의 경로나 url")

table 태그의 내용을 DataFrame으로 만들어서 DataFrame의 list를 리턴 

url에는 한글을 직접 사용하면 안되고 인코딩된 url을 사용해야 한다.

 

옵션

  • 천단위구분기호설정
  • 인코딩 방식
  • na 데이터 설정

실습

li = pd.read_html("https://ko.wikipedia.org/wiki/%EC%9D%B8%EA%B5%AC%EC%88%9C_%EB%82%98%EB%9D%BC_%EB%AA%A9%EB%A1%9D")
print(li)
# 결과
[      순위       나라          인구   갱신 년도  \
0      1       인도  1428627663  2024.0   
1      2  중화인민공화국  1409670000  2024.0   
2      3       미국   334914895  2023.0   
3      4    인도네시아   279476346  2023.0   
4      5     파키스탄   247653551  2023.0   
..   ...      ...         ...     ...   
236  237     토켈라우        1893  2023.0   
237  238      니우에        1681  2022.0   
238  239   바티칸 시국         764  2023.0   
239  240   코코스 제도         593  2021.0   
240  241   핏케언 제도          47  2021.0   

                                               기타  
0    공식 인구시계 UN 프로젝션[1][2][3] UN 예상치 인구가 가장 많은 국가  
1                                         공식 인구시계  
2                                         공식 인구시계  
3                                         공식 인구시계  
4                                         공식 인구시계  
..                                            ...  
236                                        UN 예상치  
237                                        공식 추계치  
238                  바티칸 시국 인구통계 인구가 가장 적은 UN 가입국  
239                                        공식 추계치  
240                                  인구가 가장 적은 속령  

[241 rows x 5 columns],   vte나라 목록                                         vte나라 목록.1
0       지리  면적 해안선 최고 고도 최저 고도 밀집도 해안 면적 비율 위도 최북단 최남단 경도 ...
1    인구 통계  인구 (그래프 인구 밀도) 평균 수명 영아 사망률 출생률 출산율 과거 출산율 사망률...
2       경제  국내 총생산: 명목 GDP (일인당) PPP (일인당) (노동 시간 일인당) 과거 ...
3   정치와 사회  정치자유 언론 자유 교육제도 대통령제/의원내각제 선거제도 사형제 동성결혼 낙태 국가...
4       군사        군비지출 병력 모병제/징병제 전시 작전통제권 핵무기 보유 UN 평화유지군 파병
5       환경  석유 생산 가채 석유 매장량 생산량 소비량 수출 수입 이산화탄소 배출량 (일인당) ...]

 

웹 데이터 읽기

웹의 데이터 활용 

  • 웹에서 데이터를 가져오기
  • 데이터를 파싱(데이터를 해석해서 원하는 데이터를 추출)

웹에서 제공되는 텍스트 데이터 종류 

  • XML: 데이터를 태그 형식으로 표현. 해석은 사용자가 진행.(HTML은 브라우저가 해석) 예전에는 많이 사용했으나 현재는 
  • JSON: 자바스크립트 객체 표현법으로 데이터를 표현하는 방식. 최근의 API는 대부분 JSON만 지원
  • YAML: 가장 최근에 등장한 포맷으로 이메일 형식으로 데이터를 표현하는 방식. 클라우드 환경에서 설정 파일의 대부분은 YAML
  • HTML: 웨 브라우저가 해석해서 화면에 랜더링하기 위한 포맷. 구조적이지 않아서 데이터를 표현하기 위해 사용하기 어려움.

웹에서 데이터 가져오기 

  • urllib와 urllib라는 파이썬 내장 모듈을 이용해서 웹의 데이터를 가져올 수 있다. 
  • 내장 모듈의 request 객체의 urlopen이라는 메서드에 url을 문자열로 대입하면 url에 해당하는 데이터를 response 타입의 객체로 리턴
  • response 댁체의 getheaders()를 이용하면 제공하는 데이터의 정보를 읽을 수 있고 read를 호출하면 내용을 읽을 수 있다. 
  • 읽어온 내용에 한글이 포함되어 있다면 인코딩 설정을 해야 한다. 이때 read.decode("인코딩 정보")를 이용해야 한다. 
import urllib.request

result = urllib.request.urlopen(url 경로)
print(result.read())

 

문자열을 인코딩하고자 하면 urllib.parse 모듈의 quote_plus와 

 

request 패키지

GET., POST, PUT, DELETE 요청을 사용할 수 있고 데이터 인코딩이 편한 패키지

파라미터로 넘겨줄 데이터를 dict로 만들어서 GET이나 POST 등에서 사용하면 인코딩을 자동으로 수행 

#웹 페이지의 결과를 Response 객체에 리턴
import requests
requests.get(url) 

#파라미터 만들기
param = {속성:값, ...}

#파라미터와 함께 post 요청
resp = requests.post(url, data=param)
print(resp.text)

json 데이터 파싱

방법

  • requests를 이용해서 다운로드 받은 후 직접 파싱하는 방법
  • pandas.read_json을 이용해서 자동으로 파싱하는 방법

 

옵션이 많으면 requests를 이용해서 사용하는 것이 낫고 데이터 구조가 단순하다면 pandas를 이용하는 것이 편리하다. 

 

파이썬의 기본 모듈을 이용해서 json 파싱 

json.loads(문자열)

json 문자열을 파싱해서 파이썬 dict나 list를 만들어 준다. 

 

 

728x90

'python' 카테고리의 다른 글

[python] numpy(2)  (1) 2024.02.13
[python] numpy(1)  (0) 2024.02.13
[python]pandas  (0) 2024.02.07
[python] 예외 처리  (1) 2024.01.23
[python] 가상 환경 만들기(windows)  (0) 2024.01.18