나랑 now
[혼공분석] 2주차_데이터 수집하기 본문
# | 진도 | 기본 미션 | 선택 미션 |
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": "혼자 공부하는 데이터 분석"}
{"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
'혼공학습단 > 혼공분석' 카테고리의 다른 글
[혼공분석] 6주차_복잡한 데이터 표현하기 (1) | 2024.02.12 |
---|---|
[혼공분석] 5주차_데이터 시각화하기 (1) | 2024.02.03 |
[혼공분석] 4주차_데이터 요약하기 (1) | 2024.01.23 |
[혼공분석] 3주차_데이터 정제하기 (0) | 2024.01.20 |
[혼공분석] 1주차_데이터 분석을 시작하며 (1) | 2024.01.05 |