[WIL] 멋쟁이사자처럼 AI SCHOOL : 5주차
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 이용하기