나랑 now

[혼공분석] 2주차_데이터 수집하기 본문

혼공학습단/혼공분석

[혼공분석] 2주차_데이터 수집하기

nowj8n 2024. 1. 11. 23:28
반응형
# 진도 기본 미션 선택 미션
1주차
(1/2 ~ 1/7)
Chapter 01 p. 81의 확인 문제 4번 풀고 인증하기 p. 71 ~ 73 남산 도서관 데이터를 코랩에서 데이터프레임으로 출력하고 화면 캡처하기
2주차
(1/8 ~ 1/14)
Chapter 02 p. 150의 확인 문제 1번 풀고 인증하기 p. 137 ~ 138 손코딩 실습으로 원하는 도서의 페이지 수를 추출하고 화면 캡처하기
3주차
(1/15 ~ 1/21)
Chapter 03 p. 182의 확인 문제 2번 풀고 인증하기 p. 219의 확인 문제 5번 풀고 인증하기
4주차
(1/22 ~ 1/28)
Chapter 04 p. 279의 확인 문제 5번 풀고 인증하기 Ch.04(04-1)에서 배운 8가지 기술통계량(평균, 중앙값, 최솟값, 최댓값, 분위수, 분산, 표준편차, 최빈값)의 개념을 정리하기
5주차
(1/29 ~ 2/4)
Chapter 05 p. 314의 손코딩(맷플롯립에서 bar()함수로 막대 그래프 그리기)을 코랩에서 그래프 출력하고 화면 캡처하기  p. 316의 손코딩(텍스트 정렬, 막대 조절 및 색상 바꾸기)을 코랩에서 출력하고 화면 캡처하기
6주차
(2/5 ~ 2/12)
Chapter 06 p. 344의 손코딩(맷플롯립의 컬러맵으로 산점도 그리기)을 코랩에서 그래프 출력하고 화면 캡처하기 p. 356 ~ 359의 스택 영역 그래프를 그리는 과정을 정리하기

 

  • API(Application Programming Interface):
    • 두 프로그램이 서로 대화하기 위한 방법
    • 애플리케이션 간의 통신을 위해서는 주로 웹 기반 API가 사용됨
    • HTTP(HyperText Transfer Protocol):
      • 웹 페이지를 전송하기 위한 통신 규약
      • 웹사이트는 웹 페이지를 서비스하기 위해 엔진엑스NGINX, 아파치Apache 등 웹 서버 소프트웨어를 사용하는데, 웹 서버 프로그램은 웹 브라우저와 통신할 때 HTTP란 프로토콜을 사용함
    • HTML(Hypertext Markup Language):
      • 웹 브라우저가 화면에 표시할 수 있는 문서의 한 종류이자 웹 페이지를 위한 표준 언어
    • 웹 기반 API는 HTTP 프로토콜을 사용하지만 HTML을 주고받는 것이 아니라 일반적으로 CSV, JSON, XML 같은 파일을 사용
      • HTML 소스의 구조가 비교적 복잡하며, 주고받는 데이터가 복잡한 구조를 가지면 프로그램에 버그가 생길 가능성이 높음
      • 디버깅시 HTML은 너무 장황해서 쉽게 이해하기가 어려움
  • 파이썬에서 JSON 데이터 다루기
    • JSON(JavaScript Object Notation)
    • json.dumps() : 파이썬 객체를 JSON 문자열로 변환
import json

d = {"name": "혼자 공부하는 데이터 분석"}		#JSON 형식은 키와 값에 큰따옴표를 사용
d_str = json.dumps(d, ensure_ascii=False)	#기본적으로 json.dumps() 함수는 아스키 문자 외의 다른 문자를 16진수로 출력하기 때문에 한글이 제대로 보이지 않음
 
{"name": "혼자 공부하는 데이터 분석"}
d_str = json.dumps(d, ensure_ascii=True)
{"name": "\ud63c\uc790 \uacf5\ubd80\ud558\ub294 \ub370\uc774\ud130 \ubd84\uc11d"}

 

    • json.loads(): JSON 문자열을 파이썬 객체로 변환
    • 웹 기반 API가 사용하는 HTTP 프로토콜이 텍스트 기반이기 때문에, HTTP 프로토콜로 데이터를 전송하려면 파이썬 객체를 텍스트로 변환하여 전송해야 함.
    • 직렬화(serialization): 프로그램 상의 객체를 저장하거나 읽을 수 있는 형태로 변환하는 것
    • 역직렬화(deserialization): 직렬화된 정보를 다시 프로그램에서 실행 가능한 객체로 변환하는 것

    • read_json(), DataFrame(): JSON 문자열을 데이터프레임으로 변환
      • JSON 문자열을 데이터프레임으로 변환하는 판다스에서 제공하는 두 가지 방법
      • read_json()과 DataFrame()의 차이: (체크할 것)
  • 파이썬에서 XML 데이터 다루기
    • XML: eXtensible Markup Language
    • 파이썬 기본 xml 패키지: XML 문서를 읽고 쓸 수 있는 API 제공
    • fromstring(): XML 문자열을 파이썬 객체로 변환
<class 'xml.etree.ElementTree.Element'>
 
 
  • Element.findtext(): 자식 엘리먼트 확인
    • XML은 자식 엘리먼트 순서가 항상 일정하다는 것을 보장하지 않음
    • xml.etree.ElementTree.Element 객체의 findtext() 메서드를 사용하면 자식 엘리먼트를 탐색하여 자동으로 텍스트 반환 가능
  • findall(): 여러 개의 자식 엘리먼트 확인
  • 파이썬으로 API 호출하기: requests 패키지
    • HTTP 요청 보내는 패키지
    • get(): HTTP GET 방식으로 URL을 호출하고 requests.Reponse 객체를 반환
    • Response.json(): 응답받은 JSON 문자열을 파이썬 객체로 변환하여 반환

 

  • DataFrame.loc 메서드
    • 데이터프레임 행과 열 선택
    • 인덱스와 열 이름 사용
    • 첫 번째 매개변수로 원하는 행 인덱스를 리스트로 전달하고, 두 번째 매개변수로 열 이름을 리스트로 전달
 
 
1 1 우리가 빛의 속도로 갈 수 없다면 :김초엽 소설 지은이: 김초엽 허블 2019 9791190090018
2 2 달러구트 꿈 백화점.이미예 장편소설 지은이: 이미예 팩토리나인 2020 9791165341909
3 3 지구에서 한아뿐 :정세랑 장편소설 지은이: 정세랑 난다 2019 9791188862290
4 4 시선으로부터, :정세랑 장편소설 지은이: 정세랑 문학동네 2020 9788954672214
5 5 아몬드 :손원평 장편소설 지은이: 손원평 창비 2017 9788936434267
 
 
우리가 빛의 속도로 갈 수 없다면 :김초엽 소설 지은이: 김초엽
달러구트 꿈 백화점.이미예 장편소설 지은이: 이미예
 
 
우리가 빛의 속도로 갈 수 없다면 :김초엽 소설 지은이: 김초엽
지구에서 한아뿐 :정세랑 장편소설 지은이: 정세랑

 

  • DataFrame.iloc:
    • 인덱스의 위치 사용
    • 데이터프레임의 첫 번째 행부터 0에서 시작하여 1씩 증가
 
우리가 빛의 속도로 갈 수 없다면 :김초엽 소설 지은이: 김초엽
달러구트 꿈 백화점.이미예 장편소설 지은이: 이미예

 

  • HTML에서 데이터 추출하기: 뷰티플수프
    • requests 패키지 : 웹 페이지나 웹 기반 API 호출
    • beautifulSoup 패키지 : HTML 내부 내용 접근
from bs4 import BeautifulSoup

soup = BeautifulSoup(r.text, 'html.parser')	# 첫 번째 매개변수는 파싱할 HTML 문서, 두 번째는 파싱에 사용할 파서​

파서parser: 입력 데이터를 받아 데이터 구조를 만드는 소프트웨어 라이브러리

 

  • find(): 지정된 이름의 첫번째 태그 찾기
prd_link = soup.find('a', attrs={'class':'gd_game'})	#첫 번째 매개변수: 찾을 태그명, 두 번째 매개변수: 태그의 속성을 딕셔너리로 지정

 

  • find_all(): 지정된 이름의 모든 태그를 리스트로 가져오기
prd_tr_list = prd_detail.find_all('tr')
  • apply(): 데이터프레임 행 혹은 열에 함수 적용
  • merge(): 데이터프레임과 시리즈 합치기

 


기본미션: p. 150의 확인 문제 1번 풀고 인증하기

1. 다음과 같은 데이터프레임 df가 있을 때 loc 메서드의 결과가 다른 하나는 무엇인가요?
(1)df.loc[[0,1,2],['col1', 'col2']]
(2)df.loc[0:2, 'col1:col2']
(3)df.loc[:2, [Ture, True]]
(4)df.loc[::2, 'col1':'col2']

 

정답: (4) loc 메서드에서는 파이썬의 슬라이싱처럼 유사하게 사용할 수 있는데, 차이점은 마지막 항목도 포함한다는 것. 또한 스텝 설정도 가능한데, 4번의 경우 스텝이 2로 설정되어, 행인덱스 1에 위치한 "col1": "b", "col2": "2"에 해당하는 데이터를 건너뛴다.

 

선택미션: p. 137 ~ 138 손코딩 실습으로 원하는 도서의 페이지 수를 추출하고 화면 캡처하기


그동안 쓰던 BeautifulSoup 방식이랑 좀 달라서 시간이 걸렸다.

사실 그동안은 selenium에 대한 의존도가 너무 높았어서 처음으로 requests로 처리하느라 이것저것 찾아볼 게 좀 있었다.

pandas 패키지에 익숙해지는 게 사실 혼공분석을 시작한 이유였는데 점점 나아지는 것도 같아서 기분이 좋군~

 

참고:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_json.html

https://bio-info.tistory.com/113

https://lemontia.tistory.com/904

https://www.codeit.kr/community/questions/UXVlc3Rpb246NjRiNTFhOWQ0ZDY5Mjc1ZThiNDJlMTVi

https://stackoverflow.com/questions/26495408/pandas-pandas-dataframe-from-csv-vs-pandas-read-csv

반응형