본문 바로가기
LG 헬로비전 DX DATA SCHOOL/Python

Python 데이터 분석 Pandas 2

by 황밤 2023. 8. 9.
728x90
반응형

 

 

이전글 루트 입니다!

 

2023.08.07 - [LG 헬로비전 DX DATA SCHOOL/Python] - 데이터 분석 Python (with numpy & pandas)

 

데이터 분석 Python (with numpy & pandas)

2023/08/07 **numpy 1. numpy 고성능의 과학적 계산을 수행하기 위한 패키지(선형 대수를 위한 C 또는 Fortan 패키지 - CPython 에서만 가능) 파이썬 머신러닝 스택의 기초 pypi : python 으로 만든 python, 일반 응

dxdata.tistory.com

 

 

 

 

오늘의 실습 코드!

 

https://colab.research.google.com/drive/1iiFU9y16Yu4TmZjNqnQ7TOq9zK84JI21?usp=sharing 

 

Untitled0.ipynb

Colaboratory notebook

colab.research.google.com

Let's Go!

 

 

1. 데이터 읽기 및 쓰기

SMALL
  • 데이터 분석 과정에서 데이터 저장을 하는 이유
전처리를 수행한 데이터를 다음에 다시 사용하기 위해서

 

1.1) csv 파일 저장

  • Series 나 DataFrame 객체가 to_csv() 를 호출하면 되는데 호출할 때 매개변수로 파일의 경로를 설정
  • 저장 할 때 옵션
sep : 구분자 설정
np_rep : NaN 값을 원하는 형식으로 저장
index 나 header 에 False 를 대입하면 인덱스와 header 는 출력되지 않음
cols 에 필요한 컬럼의 list를 지정하면 list에 설정된 컬럼만 저장

 

items = {
    'code': [1,2,3,4,5,6],
    'name': ['apple','watermelon','oriental melon', 'banana', 'lemon', 'mango'],
    'manufacture': ['korea', 'korea', 'korea','philippines','korea', 'taiwan'],
    'price':[1500, 15000,1000,500,1500,700]
}
df = pd.DataFrame(items)
df

df.to_csv("0809pandas.csv")

 

 

 

1.2) 엑셀 파일 사용

  • 엑셀 파일 읽기
패키지 : xlrd 패키지를 이용하는 anaconda 배포판에는 설치가 되어있음
read_excel(path, 조건) 를 이용하는데 대부분의 옵션은 read_csv와 유사하고 sheet_name 옵션을 이용해서 읽어올 시트를 지정하는 것이 가능

 

  • 엑셀 파일 저장
패키지 : openpyxl 패키지를 이용하는데 anaconda 배포판에는 설치가 되어있음.
writer 변수 = pandas.ExcelWriter(저장할 파일 경로, engine='xlsxwriter')
데이터프레임.to_excel(writer 변수, sheet_name = "시트이름")

 

  • 읽기 및 저장 실습
#첫번째 열을 인덱스로 활용하도록 읽기
ex = pd.read_excel('/content/drive/MyDrive/lg dx data 스쿨 1기/data (1)/data/excel.xlsx', index_col = 0 ,sheet_name='Sheet1')
print(ex)

writer = pd.ExcelWriter('/content/drive/MyDrive/lg dx data 스쿨 1기/data (1)/data/excel.xlsx')
ex.to_excel(writer)
writer.save()

 

 

1.3) HTML 페이지에서 table 태그의 내용을 가져오기

  • read_html(URL)로 읽어 올 수 있는데 하나의 페이지에 table이 여러개 있을 수 있어서 list로 리턴함.
  • 옵션으로 천 단위 구분 기호나 인코딩 방식 그리고 na 데이터 설정 등이 있습니다.

 


 

2. 웹에서 데이터 가져오기

  • 웹에서 제공하는 Open API 데이터나 HTML 페이지를 읽어 내는 것

 

 

 

2.1) 파이썬에서 제공하는 API

  • urllib 와 urllib2 라는 패키지를 제공하는데 이 안에서 request 모듈이 웹에서 데이터를 읽어오는 모듈
  • request 모듈의 urlopen 이라는 함수가 존재하고 이 함수에 url을 문자열로 대입을 하면 response 객체가 리턴되고 그 객체의 getheaders()를 호출하면 서버의 정보를 읽을 수 있고 status를 이용하면 상태 코드를 확인 할 수 있고 read()를 호출하면 읽은 내용을 가져올 수 있습니다.
인코딩 문제로 텍스트가 깨지는 경우, read().decode(인코딩 방식) 을 호출하면 됩니다.
import urllib.request

#데이터 읽어오기
response = urllib.request.urlopen("https://www.kakao.com")
#읽은 정보 저장
data = response.read()

print(data) # 인코딩 문제 발생

#데이터의 인코딩을 확인해서 인코딩 설정해서 읽기
encoding = response.info().get_content_charset()
html = data.decode(encoding)
print(html)

 

  • url의 파라미터에 한글이나 특수문자가 있는 경우 url을 인코딩 해야합니다.
get 방식의 경우 애플리케이션 서버가 파라미터 인코딩을 하지 않고 web server 가 파라미터 인코딩을 하기 때문에 보낼 때 인코딩을 해서 보내야 한다.

애플리케이션 서버는 데이터 인코딩을 변경할 수 있지만, web server는 데이터의 인코딩을 변경할 수 없다.

파라미터 인코딩 -> urllib.parse 모듈의 quote_plus 함수와 quote 함수를 이용 

 

 

 

  • 파라미터를 인코딩 해서 읽기(url 에 한글이 있을 경우 에러 발생)
import urllib.request
from urllib.parse import quote

#데이터 읽어오기
keyword = quote("초전도체")
response = urllib.request.urlopen("https://search.hani.co.kr/search?command=query&media=common&searchword="+ keyword + "&x=0&y=0&_ga=2.244763014.228895808.1691544329-2049580977.1691544329")
#읽은 정보 저장
data = response.read()

print(data) # 인코딩 문제 발생

#데이터의 인코딩을 확인해서 인코딩 설정해서 읽기
encoding = response.info().get_content_charset()
html = data.decode(encoding)
print(html)
사실 크롬에서 복붙 했더니, 알아서 인코딩이 되긴했지만,, 굳이 keyword 자리를 찾아 집어넣어 보았다.

 

 

2.2) requests

  • 파이썬의 기본 패키지가 아님
  • 데이터의 인코딩이 편리하고 전송 방식(GET, POST, DELETE에 따른 요청을 수행하는 것이 편리하기 때문에 사용
#전송할 파라미터 만들기
dic = {"id":"itstudy", "name":"원빈","alias":"adam"}

#파라미터 전송하고 response 받기
response = requests.post("http://httpbin.org/post", data = dic)

print(response.text)

 

 

2.3) HTML Parsing

  • Parsing : HTML 문자열에서 원하는 데이터만 추출하는 것
  • beautifulsoup4 라는 패키지 이용 (anaconda 에는 설치 되어 있음)
모듈이름 : bs4
  • html 을 DOM 형태로 펼치기
import bs4
변수명 = bs4.BeautifulSoup(html, 'html.parser')

 

  • 태그를 이용해서 찾는 방법
변수명.태그이름 .,.,., 나열.get_text()
try :
  # url이 잘못되었거나 네트워크 연결이 안되면 예외
  response = requests.get("http://finance.daum.net")

  #파싱 가능한지 확인 - 파싱이 불가능하면 예외
  bs = bs4.BeautifulSoup(response.text, 'html.parser')

except Exception as e:
  print("예외 발생:", e)
  
else : 
  print(bs.body.strong.get_text())

 

  • 파싱 함수
find(태그) : 태그에 해당하는 것 1개만 리턴
find_all(리턴) : 태그에 해당하는 것 모두 리턴
함수로 찾아온 객체를 가지고 attrs 속성을 호출하면 태그 안의 모든 속성과 값을 dict로 리턴
a 태그의 href 속성(링크)를 많이가져옴
a 태그의 href 속성은 링크를 소유함
소셜 네트워크 분석을 할 때는 대부분의 경우 한 번에 검색된 내용만 가지고 하는게 아니고 검색 한 후 나온 결과의 링크를 타고 가서 데이터를 수집하는 경우가 많습니다.
select(선택자) : 선택자에 해당하는 것을 찾아옵니다. 여러개가 리턴됩니다. 
#네이버 팟 캐스트에서 원하는 데이터 가져오기
try :
  response = requests.get("http://tv.naver.com/r/category/drama")
  html = response.text
  #print(html)

  #html 파싱 객체 생성
  bs = bs4.BeautifulSoup(html, 'html.parser')
  #print(bs)
  #선택자에 해당하는 부분만 가져오기
  tags = bs.select("a > strong > span")

  for tag in tags :
    print(tag.getText())
    
except Exception as e :
  print("예외 발생 :", e)

 

 

3.4) selenium

  • 웹 앱을 테스트하는 프레임워크
  • request 나 requests 라이브러리는 정적인 HTML을 가져오는 라이브러리
현재 보여지는 HTML만 가져올 수 있음.
ajax 형태의 데이터는 가져올 수 없습니다.
  • 동적으로 변경되는 데이터는 브라우저를 실행시켜서 동적으로 데이터를 읽어와야 합니다.
  • 브라우저를 실행시켜서 html을 읽어올 수 있는 프레임워크가 selenium
자바스크립트를 실행하는 것도 가능
  • 실행 환경 구성
패키지 설치 : pip install selenium
브라우저 버전에 맞는 드라이버를 다운로드 : 크롬의 경우는 https://chromedirver.exe

 

 

  • 함수
implicity_wait(시간) : 시간 동안 대기
get(url) : url로 접속
page_source 속성 : html 코드
DOM에 접근 :
find_element_by_name
find_element_by_id
find_element_by_xpath
-> 1개씩

-> 여러 개
find_element_by_css_selector
find_element_by_class_name
find_element_by_tag_name

quit()

execute_script(스크립트 코드)
DOM의 메서드
send_keys("값") : DOM에 값이 설정
click() 이나 submit()을 하면 클릭한 효과

 

  • html 가져오기
request : 파이썬의 기본 패키지
requests : 설치를 해야 하는데 get, post, put, delete 등의 요청 방식을 쉽게 처리
selenium : html을 동적으로 읽어와야 하거나 로그인 처럼 동작을 취해야만 읽을 수 있는 데이터를 가져오고자 할 때 사용.

 

  • html에서 원하는 데이터를 추출
beautisoup : html 과 xml 을 파싱하는 패키지

 

 

3.5) Open API 데이터 가져오기

  • 데이터 타입
XML
JSON
YML : 이메일 표현 형식으로 데이터를 표현하는 방식 -> kubernetes, Public Cloud 에서의 환경 구축에 이

 

3.6) XML 데이터를 이용해서 DataFrame 생성

  • XML은 pandas에서 파싱하는 API를 제공하지 않음
  • XML은 직접 다운로드 받아서 파싱한 후 DataFrame을 생성

 

 

 

http://www.hani.co.kr/rss/sports/
# http://www.hani.co.kr/rss/sports/ 에서 title과 link 태그의 내용을 읽어서 DataFrame 생성
import xml.etree.ElementTree as et #XML 파싱을 위한 import
import urllib.request
url='http://www.hani.co.kr/rss/sports/'
request = urllib.request.Request(url)
response = urllib.request.urlopen(request)
​
p
#루트를 찾기
tree = et.parse(response)
xroot = tree.getroot()
print(xroot)
<Element 'rss' at 0x0000025591C6A6B0>
channel
#찾고자 하는 변수명
​
channel = xroot.findall("channel")
print(channel)
[<Element 'channel' at 0x0000025591EE1D50>]
items = channel[0].findall('item')
print(items)
[<Element 'item' at 0x00000255923D1D50>, <Element 'item' at 0x00000255923D3E70>, <Element 'item' at 0x00000255923D3060>, <Element 'item' at 0x00000255923D36F0>, <Element 'item' at 0x00000255923D3EC0>, <Element 'item' at 0x00000255923D3A60>, <Element 'item' at 0x00000255923D2700>, <Element 'item' at 0x00000255923D2D90>, <Element 'item' at 0x00000255923D3290>, <Element 'item' at 0x00000255923D23E0>, <Element 'item' at 0x00000255923D2980>, <Element 'item' at 0x00000255923DC9A0>, <Element 'item' at 0x00000255923DD800>, <Element 'item' at 0x00000255923DC180>, <Element 'item' at 0x00000255923DC360>, <Element 'item' at 0x00000255923DC7C0>, <Element 'item' at 0x00000255923DE1B0>, <Element 'item' at 0x00000255923DD350>, <Element 'item' at 0x00000255923DDE40>, <Element 'item' at 0x00000255923DDC10>, <Element 'item' at 0x00000255923DD6C0>, <Element 'item' at 0x00000255923DC450>, <Element 'item' at 0x00000255923DCBD0>, <Element 'item' at 0x00000255923DDF30>, <Element 'item' at 0x00000255923DE480>, <Element 'item' at 0x00000255923DE7A0>, <Element 'item' at 0x00000255923DEA20>, <Element 'item' at 0x00000255923DECA0>, <Element 'item' at 0x00000255923DEF20>, <Element 'item' at 0x00000255923DF150>]
import pandas as pd
​
rows = []
for node in items :
    s_title = node.find('title').text
    s_link = node.find('link').text
    rows.append({"title":s_title,"link": s_link})
    
df = pd.DataFrame(rows, columns=["title", "link"])
print(df)
                                    title  \
0           홈런 1위 노시환, 한화 선수 5년 만의 월간 MVP   
1     장현석, 다저스와 90만달러 입단 계약…“명문 구단 입단 영광”   
2    리빌딩 나선 PSG, 메시·음바페 이어 네이마르도 ‘헤어질 결심’   
3            강습 타구 맞은 류현진 “무릎에 멍들었지만 괜찮다”   
4            김하성 15경기 연속 멀티 출루…이치로와 타이 기록   
5        클리블랜드전 무피안타 류현진, 강습 타구에 무릎 맞고 교체   
6       수원FC 공격수 라스 음주운전 적발…“징계·후속 조치할 것”   
7            류현진, 시즌 첫 승 노린다…8일 클리블랜드전 등판   
8     조규성, 덴마크 데뷔 뒤 3경기 연속골…팀 열세 속 빛난 만회포   
9        ‘부상 투혼’ 김효주, LPGA 스코틀랜드 여자오픈 준우승   
10      ‘최강’ 미국 여자축구, 16강 승부차기 끝에 스웨덴에 패배   
11               ‘제주의 딸’ 임진희, 삼다수 마스터스 우승   
12            궤도 오른 프로당구…‘심야 편성’에 팬 반발 커져   
13           결승전서 21점 뽑아낸 강소휘…MVP도 3번째 수상   
14            공격 돌파구 날린 천가람 “더 강한 선수 되겠다”   
15       GS칼텍스, 기업은행에 3-1 설욕…6번째 KOVO컵 정상   
16      승패 가른 김가영 샷…“초클루와 연습한 공 나와 짜릿했어요”   
17         KBO리그 500만 관중 돌파…평균 관중 1만1033명   
18      기업은행, 3-1로 인삼공사 꺾고 결승행…GS칼텍스와 맞대결   
19      김연경·박인비 등 6명, IOC 선수위원 ‘국내 후보’ 등록   
20   GS칼텍스, 3-1로 현대건설 꺾고 결승행…KOVO컵 2연패 도전   
21       기적도 치욕도 반복된다…여자월드컵 강타한 ‘언더도그 돌풍’   
22       오타니, 시즌 40호 홈런…오른손 경련으로 투구는 4이닝만   
23   KBO리그 500만 관중 오늘 돌파…10개 구단 관중수입 762억   
24     에스와이 여성 삼총사 “산체스 정말 ‘진국’…팀 분위기 최고”   
25     ‘오기상’이 그리는 안산의 새로운 배구…웃으면서 해도 “OK”   
26        여자축구 조소현, 한국 첫·마지막 골 쐈다…독일 탈락시켜   
27    네이마르 2골1도움·이강인 24분…PSG, 부산을 파리로 만들다   
28            조기성, 세계장애인선수권 개인혼영 150m 은메달   
29  여자축구 1년 수입 ‘톱’ 15명 합쳐도…호날두 3분의 1도 안 돼   

                                                 link  
0   http://www.hani.co.kr/arti/sports/baseball/110...  
1   http://www.hani.co.kr/arti/sports/baseball/110...  
2   http://www.hani.co.kr/arti/sports/soccer/11034...  
3   http://www.hani.co.kr/arti/sports/baseball/110...  
4   http://www.hani.co.kr/arti/sports/baseball/110...  
5   http://www.hani.co.kr/arti/sports/baseball/110...  
6   http://www.hani.co.kr/arti/sports/soccer/11033...  
7   http://www.hani.co.kr/arti/sports/baseball/110...  
8   http://www.hani.co.kr/arti/sports/soccer/11032...  
9   http://www.hani.co.kr/arti/sports/golf/1103254...  
10  http://www.hani.co.kr/arti/sports/soccer/11032...  
11  http://www.hani.co.kr/arti/sports/golf/1103202...  
12  http://www.hani.co.kr/arti/sports/sports_gener...  
13    http://www.hani.co.kr/arti/sports//1103188.html  
14  http://www.hani.co.kr/arti/sports/soccer/11031...  
15    http://www.hani.co.kr/arti/sports//1103131.html  
16  http://www.hani.co.kr/arti/sports/sports_gener...  
17  http://www.hani.co.kr/arti/sports/baseball/110...  
18    http://www.hani.co.kr/arti/sports//1103093.html  
19  http://www.hani.co.kr/arti/sports/sports_gener...  
20    http://www.hani.co.kr/arti/sports//1103079.html  
21  http://www.hani.co.kr/arti/sports/soccer/11030...  
22  http://www.hani.co.kr/arti/sports/baseball/110...  
23  http://www.hani.co.kr/arti/sports/baseball/110...  
24  http://www.hani.co.kr/arti/sports/sports_gener...  
25    http://www.hani.co.kr/arti/sports//1102999.html  
26  http://www.hani.co.kr/arti/sports/soccer/11029...  
27  http://www.hani.co.kr/arti/sports/soccer/11029...  
28  http://www.hani.co.kr/arti/sports/sports_gener...  
29  http://www.hani.co.kr/arti/sports/soccer/11028...

 

 

3.7) JSON 데이터를 이용해서 DataFrame 만들기

  • pandas 의 read_json 함수를 이용하면 바로 데이터 프레임으로 생성
옵션으로는 encoding 과 orient 를 주로 이용합니다.

 

  • kakao open api 데이터 가져오기
developers.kakao.com 에 접속해서 애플리케이션을 생성하고 rest_api 키를 받기

헤더 인증 모양 - Authorization: KakaoAK rest api 인증키

url - https://dapi.kakao.com/v2/local/search/category.json?category_group_code=PM9&rect=위도경도

 

url = 'https://dapi.kakao.com/v2/local/search/category.json?category_group_code=PM9&rect=126.95,37.55,127.0,37.60'
import requests
import json

#전송할 헤더 만들기

headers = {'Authorization': 'KakaoAK 개인별 인증키'}

data = requests.post(url, headers=headers)
#print(data.text)
result = json.loads(data.text)
for data in result['documents']:
    print(data['place_name'], end="\t")
    print(data['address_name'])
  • 출력 결과
남시약국	서울 중구 남대문로3가 30-15
평화약국	서울 중구 남대문로4가 18-11
수도약국	서울 종로구 관훈동 37
종로약국	서울 종로구 종로4가 8
서울중앙약국	서울 용산구 동자동 43-205
서울왕약국	서울 중구 남창동 2-3
왕솔약국	서울 중구 회현동1가 202-1
우정약국	서울 종로구 종로4가 176-1
삼원온누리약국	서울 종로구 신문로1가 1
새원약국	서울 중구 명동1가 33
종오약국	서울 종로구 종로4가 7
남대문약국	서울 중구 남대문로3가 30-7
종각호약국	서울 종로구 종로2가 75-6
푸른온누리약국	서울 종로구 평동 180
서대문권약국	서울 종로구 평동 169

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
LIST

'LG 헬로비전 DX DATA SCHOOL > Python' 카테고리의 다른 글

Pandas 의 연산  (0) 2023.08.16
Python 탐색적 시각화  (2) 2023.08.11
데이터 분석 Python (with numpy & pandas)  (0) 2023.08.07
Django REST API  (0) 2023.07.27
Django  (0) 2023.07.26