AI School : 파이썬, 데이터분석/정리노트

[WIL] 멋쟁이사자처럼 AI SCHOOL : 5주차

ant-103 2023. 1. 19. 17:44

Jupyter Notebook : 주피터 노트북 환경

Jupyter, Jupyter Notebook, ipy.nb

- 지원하는 주요 언어인 Julia, Python, R에서 유래한 이름

- ipy.nb 확장자 (ipynb는 주피터노트북의 원래 이름이었던 ipython notebook을 의미함)

- 마크다운(Markdown) 환경 제공 (ipython으로 작성된 책 : https://jakevdp.github.io/PythonDataScienceHandbook/ )

 

ipython 환경 

- interactive python 대화형 인터페이스를 제공

- 매직 명령어를 제공 ( %lsmagic 실행하면 사용할 수 있는 리스트 보여줌)

 

Jupyter Notebook 단축키

모드 단축키 기능
실행모드 (ESC) A 셀 생성 (위)
B 셀 생성 (아래)
DD 셀 삭제
M 마크다운 셀로 변경
Y 코드 셀로 변경
편집모드 (Enter) Shift + Enter 셀 실행 > 다음 셀로 이동
Ctrl + Enter 셀 실행
기타 tab 자동완성 (ex. pd.read_ 까지 쓰고 누르면 가능한 함수 이름 보여줌)

 

Jupyter Notebook 매직 명령어

명령어 기능
%pwd 현재 노트북의 디렉토리 정보 출력
%ls 현재 리덱토리 목록 출력
%time 라인 단위 코드실행 시간 출력
%%time 셀 단위 코드실행 시간 출력
%autosave 노트북 자동 저장 시간 설정 (seconds 단위)

 

 

* .py 파일의 편집

- 파이썬 내장 IDE, 메모장, Jupyter Lab, Visual Studio Code, PyCharm, 서브라임텍스트, VI 등 이용가능

 

 

2. 실습 : 서울정보소통광장 120 주요질문 데이터 수집하기

https://opengov.seoul.go.kr/civilappeal/list

 

0107. 주요질문 목록 수집하기 

# 1) 페이지번호(page_no)마다 변경되도록 url 생성 : f-string

# 2) 페이지마다 보이는 테이블(목록) 받아오기 : requests, pd.read_html

# 3) 게시물로 이동하는 링크 찾아서 내용번호 찾기 : BeautifulSoup, select, find_all, split

# 4) 없는 페이지가 들어왔을 경우 오류 대처 : try, except

 

0108. 주요질문 문서 내용+문서정보 수집하기

이전에 진행한 실습(대통령기록관 연설문 수집하기)은 게시물 내의 내용(text)만 가져왔음.

0107-0108 에서는 서울120 문서 내에 포함된 내용과 표(문서정보)를 함께 수집.

전체 내용에 반복문을 사용하지 않고 map (progress_map)을 사용해서 적용.

# 1) 문서정보를 수집하는 함수 get_desc( ) 만들기 

  - 문서정보의 컬럼이 원하는 위치에 있지 않음 -> 분리해서 가져와서 전치행렬로 만들고 병합 :

  - df.T, .reset_index, concat

# 2) 문서번호를 받으면 문서내용 + 문서정보를 수집하는 함수 만들기

  - 없는 데이터를 불러왔을 때를 대비, 어떤 오류인지 출력 : Try, except, Exception as e

  - BeautifulSoup, select, strip, time.sleep

# 3) 0107에서 만든 문서번호 목록으로 위의 함수 적용 : map, tqdm, progress_map, time.sleep

# 4) 데이터프레임 합치기 : concat

map 을 이용해서 "내용번호"컬럼을 받으면 내용과 문서정보

 

time.sleep( )

- 웹스크래핑 과정 자체가 서버에 부담이 될 수 있음.

- 순회하면서 여러 페이지에 요청을 보내는 경우에는 time.sleep() 필수

- 부담을 줄이면서 오류가 났을 때를 대비해서 일부 데이터로 먼저 진행 후 최종작업 하는 것을 추천

(ex. df = df.head(10) 으로 10개 데이터만으로 우선 진행 후 전체에 적용)

 

map, apply, progress_map, progress_apply

- 반복문을 사용하지 않고 시리즈, 데이터프레임 단위로 함수 실행

- tqdm의 progress_map, progress_apply를 이용하면 진행률을 확인 가능

 

.T

- 행열 바꿔줌

 

.reset_index(drop=True)

- 두 데이터프레임을 합쳐줄 때, 인덱스 번호가 맞지 않으면 어긋나게 됨

- reset_index 로 index번호를 없애주기

 

pd.concat([tb01, tb02[, axis=1)

- 지금까지 사용한 concat은 행을 기준으로 합쳐줬음. (세로로 길어지는 형태) : axis = 0 이 default 값

- axis = 1 적용하면 열을 기준으로 합쳐줌.

 

 

3. 실습 : API, JSON 데이터 수집하기

Web Scrapping vs API 

API : 서비스 운영서버와 데이터 제공 서버를 분리하여 트래픽 분산 -> 트래픽이 많이 발생해도 운영서버에는 영향을 주지 않도록

  웹 스크래핑 API
정보 처리 웹 브라우저에 보여지는 정보 중 원하는 데이터만 수집하고 저장 서비스 제공자가 제공하는 방식대로 정보를 요청하여 받아옴
표준화 이용하는 서비스, 페이지마다 출력 내용이 달라 표준화할 수 없음 API 요청 방식과 요청에 따른 응답 데이터 형식을 표준화할 수 있음
보안 브라우저를 통한 접근할 때 필요한 ID, PW -> 개인정보 유출 위험 토큰, 키값 필요함 -> 서비스 제공자가 부여

 

XML

- Extensible Markup Language

- 인터넷 상에서 구조화된 데이터를 전송하기 위해 만들어진 형식

- 주로 (인터넷에 연결된) 다른 종류의 시스템끼리 데이터를 쉽게 주고 받을 수 있게 하여 HTML의 한계를 극복할 목적으로 만들어짐.

- pandas 에서는 pd.read_html( ) 처럼 pd.read_xml( ) 로 쉽게 읽어올 수 있음. -> python과 bs4만으로는 번거로운 작업 해결

 

date time

- datetime.today(): 오늘 날짜를 구할 수 있음.

- strftime() : 날짜 형식 지정 (%Y-%m-%d. 대소문자 주의!)

 

최대값 n개 출력하기

- 정렬하고 위게 값 뽑아오기 : df.sort_values(by='threeMonthEarnRate', ascending=False).head(n)

- nlargest, nsmallest 이용하기