TIL & WIL/Python

5주차 수요일. <데이터 분석> TIL

니츄 2023. 1. 18. 19:56

벌써 5주차라니...

게으름 피우지 말자;

TIL 다시 시작한다.

 

 

 ※ 학습 TIP 

-다른 사람들이 짜둔 소스코드를 많이 보고 응용해 볼수록 실력이 늘음.

 

 

 

 ※ progress_map과 progress_apply의 차이 

  • map과 apply는 pandas의 메서드임.
  • 반복문 대신에 사용할 수 있고, 반복문을 사용했을 때보다 속도가 빠름.
  • 그러나, 많은 작업을 할 때에는 어디까지 진행되었는지 확인이 어려움.
  • 그래서, tqdm의 도움을 받음.
  • progress_map()과 progress_apply()는 tqdm에서 판다스를 지원하는 기능으로, 진행상태를 표시해줌.

 

 

 

 ※ list(view_detail)과 view_detail.tolist()의 차이 

  • list(view_detail) : 파이썬 표준 라이브러리 사용
  • view_detail.tolist() : 판다스 사용
  • 공통점 : list 형태로 변경해줌.

 

 

 

 ※ 데이터를 찾아볼 때 최댓값/최솟값 순서대로 정렬하여 n개 보는 방법 

  • df.nlargest(n, 'value')
  • df.nsmallest(n, 'value')

 

 

 

 ※ API란 

  • Application Programmin Interface의 약어
  • 서로 다른 사양의 컴퓨터나 컴퓨터 프로그램이 데이터를 주고 받을 수 있도록 하는 도구.

ex) 사용자가 서버에서 데이터를 요청할 수 있도록 함.

 

 

 

 ※ Open API란 

  • 개발자라면 누구나 사용할 수 있도록 공개된 API를 의미.

 

 

 

 ※ API를 사용하는 이유 

  • 허락된 사람에게만 정보를 제공하고 누가 수집해갔는지 알기 위해
  • 유로로 데이터를 판매하고 있는 사이트는 데이터 용량 등에 따라 과금하기도
  • 공공데이터 중, 실시간성으로 제공하고자 하는 데이터의 경우
  • 특정 사이트에 무리하게 네트워크 요청을 보내면 서버에 무리가 갈 수 있어 API를 따로 제공
  • API를 제공할 때 제공할 수 있는 데이터에 한해서 제공

 

 

 

 ※ Web Scrapping 과 API의 차이 

  • 공통점 : 웹데이터를 수집하는 방법은 웹스크래핑과 API를 이용한 요청방식 등이 있음.
  • 웹스크래핑 : 브라우저에 보여지는 정보를 사용자가 자동화된 툴로 수집
  • API : 서로 다른 소프트웨어끼리 서비스를 제공하기 위한 사양.
  Web Scrapping API
정보처리 웹 브라우저에 보여지는 정보 중
원하는 데이터를 수집하고 저장
서비스 제공자가 제공하는 방식대로
정보를 요청하여 받아옴
표준화 표준화 불가
(이용하는 서비스마다 출력내용이 다름.)
표준화 가능
( : API 요청방식과 요청에 따른 응답데이터 형식)
보안 -정보에 접근하려면 중요정보 필요 (ID / PW)
-이용자의 개인정보 등 위험하고 불필요한 정보가
  스크래핑 범위에 포함될 수 있음.
-중요정보 대신 요청을 위한 token이나 key 사용
-서비스 제공자가 정한 범위 안에서만 정보이용 가능
-제공자 입장에서는 정보접근 통제가 용이

 

 

 

 ※ 그 외 

  • select와 find의 속도를 측정해보면 find가 더 빠름.
  • shift + tab : 셀 안에서 도움말을 보는 jupyternotebook 단축키.

 

 

 


 

 

 

 * 시간 함수

%time: 단일 명령문의 실행 시간
%timeit: 정확도 향상을 위해 단일 명령문을 반복적으로 실행하는 시간
%prun: 프로파일러로 코드 실행
%lprun: 라인별 프로파일러로 코드 실행
%memit: 단일 문장의 메모리 사용량 측정
%mprun: 라인별 메모리 프로파일러로 코드 실행

 

 

 *내용 parsing 함수 만들기 

import time
def get_view_page(view_no):
    """ 
    내용과 분류를 수집하는 함수 만들기
    1) url을 만들어 줍니다.
    2) requests 로 요청을 보냅니다.
    3) 분류를 수집하는 함수에 response 값을 넘겨 분류와 제공부서 등이 들어있는 데이터프레임을 반환 받습니다.
    4) 내용을 bs 으로 텍스트만 추출합니다.
    5) 3)번 내용에 내용, 내용번호를 함께 데이터프레임에 추가합니다.
    6) 반복문 대신 map이나 apply를 사용할 것이기 때문에 time.sleep으로 쉬도록 합니다.
    7) 5번까지 수집한 내용을 반환하도록 합니다.
    """
    try:
        url =  f'https://opengov.seoul.go.kr/civilappeal/{view_no}'
        response = requests.get(url)
        desc = get_desc(response)        # get_desc는 무엇일까? 데이터 프레임 형식으로 떨어짐.
        html = bs(response.text)
        content = html.select('div > div.line-all')[0].text.strip()
#       content = html.find('div'{'class' : 'line-all'}).text.strip()
        desc['내용'] = content
        desc['내용번호'] = view_no
        time.sleep(0.001)
        return desc
    except Exception as e:
    	print(f'{view_no}는 없는 페이지입니다. {e}')
# 출력방법

# 1.
get_view_page(view_no=16610517)

# 2.
get_view_page(df["내용번호"][0])

-map, apply로 데이터를 수집할텐데, 중간에 예외처리를 안 해서 오류가 났다면  오류를 수정하고 처음부터 다시 수집해야 함.

-그러나 오류가 난 것을 제외하고 수집한다면 오류를 수정해서 나중에 수집되지 않은 데이터만 따로 수집해주면 됨.

 

 

 


 

 

 

 

뒤늦게 알게된 코드들

 

 1. .strip() : 문자열 및 공백 제거

html = bs(response.text)
html.select('div > div.line-all')[0].text

html = bs(response.text)
html.select('div > div.line-all')[0].text.strip()

 

2. get_desc 

 

 

 3. marge 

  • concat과 같은 기능
  • how 의 디폴트 값은 inner (그 외 left, right 등이 있음)
  • merge는 컬럼 혹은 인덱스를 기준으로 병합함.
  • join은 인덱스 기준으로 병합함.

 

 

4. read_json

 

 

 5. T : 데이터프레임의 행과 열의 위치를 바꿔줌.

# 'T'를 쓰지 않은 데이터프레임

df.describe()

# 'T'를 써서 행과 열의 위치를 바꾼 데이터프레임

df.describe().T

 

 

 

 6. read_xml 

*xml( eXtensible Markup Language)

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

   xml은 주로 다른 종류의 시스템, 특히 인터넷에 연결된 시스템끼리 데이터를 쉽게 주고 받을 수 있게 하여

   html의 한계를 극복할 목적으로 만듦.

 

 

 

 7. datetime 

  • datetime.today() : 오늘 날짜를 구할 수 있음.
  • strftime() : 날짜형식 지정 (대문자/소문자에 따라 다르게 출력됨)

 

 


 

**오늘의 후기

-스터디가 생기고 있지만, 나는 무엇을 집중적으로 개발해야할지, 어느 분야로 갈지 정하지 못했기 때문에 선뜻 참여할 수 없었다. 따라서. 오늘은 여러 채용공고를 보며 내가 원하는 분야와 필요 역량에 대해 조사해봐야겠다.