[혼공분석] 2주차 - 1

LeeHsss·2025년 1월 19일
0

데이터 분석

목록 보기
2/9
post-thumbnail

Chapter 02. 데이터 수집하기

02-1. API 사용하기

API란 (Application Programming Interface)

  • 프로그램이 서로 대화하기 위한 방법을 정의한 것
  • 웹기반 API는 웹 서버와 웹 브라우저가 대화하는 방식과 비슷하다.
  • HTTP 프로토콜을 사용하지만 HTML을 주고받는 것이 아니라 일반적으로 CSV, JSON, XML 같은 파일을 사용한다.
  • 보통 웹기반 API에서는 CSV보다 JSNO, XML을 많이 사용한다.
    • CSV는 각 행마다 항목의 개수가 정확하게 맞지 않으면 읽을 수가 없기 떄문이다.

파이썬에서 JSON 데이터 다루기

  • JSON (Javascript Object Notiation): 자바스크립트 언어를 위해 만들어졌지만 현재는 여러 프로그래밍 언어에서 범용적으로 사용하는 데이터 포맷
    • 파이썬의 딕셔너리와 리스트를 중첩해 놓은 것과 형태가 비슷하다.
    • 키와 값을 콜론(:)으로 연결한다.
    • Json 포맷은 파이썬 딕셔너리와 호환성이 좋다.
json_obj = {"name" : "혼자 공부하는 데이터 분석"} # Json에서는 key, value 값을 큰따옴표로 감싸줘야 한다. 
print(json_obj['name']) # 파이썬에서는 문자열을 쓸 때 작은 따옴표, 큰 따옴표 모두 사용이 가능하지만 주로 작은 따옴표를 사용한다. 

파이썬 객체를 Json 문자열로 변환하기 : json.dumps() 함수

  • json 패키지에서 파이썬 객체를 Json 형식에 맞는 문자열로 변환할 때는 json.dumps() 함수를 사용한다.
import json 
json_str = json.dumps(json_obj, ensure_ascii=False)
print(json_str)
출력: {"name": "혼자 공부하는 데이터 분석"}
  • json.dumps() 함수를 사용할 때, ensure_ascii 매개변수를 False로 지정한 이유는 딕셔너리 객체에 한글이 포함되어 있기 때문이다.
  • json.dumps() 함수는 기본적으로 ascii 외의 문자를 16진수로 출력하기 때문에 한글이 제대로 표시되지 않는다.
출력: {"name": "\ud63c\uc790 \uacf5\ubd80\ud558\ub294 \ub370\uc774\ud130 \ubd84\uc11d"}

Json 문자열을 파이썬 객체로 변환하기 : json.loads()함수

  • json 패키지에서 Json 문자열을 파이썬 객체로 변환할 떄는 json.loads() 함수를 사용한다.

💡 파이썬 객체를 바로 전송하지 않고 문자열로 바꾸어 전송하는 이유

  • 웹 기반 API가 사용하는 HTTP 프로토콜이 텍스트 기반이기 떄문.
  • 직렬화(serialization): 프로그램 상의 객체를 저장하거나 읽을 수 있는 형태로 변환하는 것 (json.dumps())
  • 역직렬화(deserialization): 직렬화된 정보를 다시 프로그램에서 실행 가능한 객체로 변환하는 것 (json.loads())
import json 
json_obj2 = json.loads(json_str)
print(json_obj2['name'])
print(type(json_obj2))
출력: 혼자 공부하는 데이터 분석
출력: <class 'dict'>

여러개의 항목을 가진 Json 문자열 변환

  • author, year 항목 추가
{
    "name" : "혼자 공부하는 데이터 분석",
    "autor" : "박해선",
    "year" : 2022
}
  • author 키에 여러 항목 추가 (배열 형태로 추가)
    • Json 데이터에 접근할 때는 키와, 인덱스를 통해 데이터에 접근
    • e.g.) author 키에 홍길동 데이터에 접근하는 경우 author[1] 방식으로 접근
{
    "name" : "혼자 공부하는 데이터 분석",
    "autor" : ["박해선", "홍길동"],
    "year" : 2022
}
  • 여러개의 Json 객체를 포함
    • Json 배열을 표시할 때는 [] 사용
    • Json 객체를 표시할 떄는 {} 사용
    • Json 문자열이 배열 형태를 가지면 index를 통해서 해당하는 Json 객체에 접근할 수 있다.
      • 객체의 키, index를 조합하면서 원하는 데이터에 접근할 수 있다.
      • e.g.) dict[0]['name'] 형태로 첫 번째 객체의 name 키 값에 해당하는 값에 접근할 수 있음 => "혼자 공부하는 데이터 분석"
[
    {
    "name" : "혼자 공부하는 데이터 분석",
    "author" : ["박해선", "홍길동"],
    "year" : 2022
    },
    {
    "name" : "혼자 공부하는 머신러닝 + 딥러닝",
    "author" : "박해선",
    "year" : 2022
    }
]

Json 문자열을 데이터프레임으로 변환하기 : read_json() 함수

  • 파이썬의 pandas 패키지는 json 문자열을 읽어서 데이터프레임으로 변환하는 read_json() 함수를 제공한다.
import pandas as pd

json_str = '''[
    {
        "name" : "혼자 공부하는 데이터 분석",
        "author" : ["박해선", "홍길동"],
        "year" : 2022
    },
    {
        "name" : "혼자 공부하는 머신러닝 + 딥러닝",
        "author" : "박해선",
        "year" : 2022
    }
]'''

pd.read_json(json_str) # json_str은 json 문자열
  • DataFrame 객체를 사용해서 Json 문자열을 파이썬 객체로 만든 후 데이터프레임으로 변환할 수도 있다.
import pandas as pd 
import json 

json_str = '''[
    {
        "name" : "혼자 공부하는 데이터 분석",
        "author" : ["박해선", "홍길동"],
        "year" : 2022
    },
    {
        "name" : "혼자 공부하는 머신러닝 + 딥러닝",
        "author" : "박해선",
        "year" : 2022
    }
]'''

dict = json.loads(json_str)

pd.DataFrame(dict) # dict는 Json 문자열을 파이썬 객체로 변환한 객체

💡 FutureWarning: Passing literal json to 'read_json' is deprecated and will be removed in a future version. To read from a literal string, wrap it in a 'StringIO' object.

  • read_json() 함수를 호출할 때 다음과 같은 오류가 발생한다.
  • 위 오류는 FutureWarning으로 앞으로 코드가 변경될 가능성을 알려주는 오류이다.
  • read_json() 함수에 json 문자열을 그대로 넘기는 방식이 더 이상 지원되지 않을 예정이기 떄문에 StringIO 객체로 감싸서 Json 문자열을 읽어야 한다.

💡 StringIO

  • 문자열을 파일 객체처럼 다룰 수 있도록 하는 클래스
  • 데이터가 디스크에 기록되는 것이 아니라 메모리의 버퍼에 기록된다.
  • 파일을 처리하는 대부분의 함수들은 보통 파일 객체를 요구하는데, 메모리에 저장된 문자열을 파일처럼 사용하고 싶을 때 사용한다.
  • io 패키지 안에 포함되어 있다. (io.StringIO)

파이썬에서 XML 데이터 다루기

  • XML(eXtensible Markup Language)
    • XML은 컴퓨터와 사람이 모두 읽고 쓰기 편한 문서 포맷을 위해 고안되었다.
    • XML은 엘리먼트들이 계층 구조를 이루면서 정보를 표현한다. 엘리먼트는 시작 태그와 종료 태그로 감싼다.
      • 태그는 '<' 기호로 시작해서, '>' 기호로 끝이나며, 시작 태그와 종료 태그의 이름은 같아야 한다.
      • 태그 이름은 영문자와 숫자를 사용한다.

XML 문자열을 파이썬 객체로 변환하기 : fromstring() 함수

  • 파이썬에서 기본으로 제공되는 xml 패키지는 XML 문서를 읽고 쓸 수 있는 간편한 API를 제공한다.
 <book>
     <name>혼자 공부하는 데이터 분석</name>
     <author>박해선</author>
     <year>2022</year>
 </book>
import xml.eTree.ElementTree as et 

x_str =  '''
    <book>
         <name>혼자 공부하는 데이터 분석</name>
         <author>박해선</author>
         <year>2022</year>
     </book>
'''

book = et.fromstring(x_str) # 가장 먼저 등장하는 부모 엘리먼트 <book>을 가져온다. 
print(book.tag) # 현재 객체의 엘리먼트 이름을 확인할 수 있다. 

자식 엘리먼트 확인하기 : list()

book_childs = list(book) # book 객체를 리스트로 변환하여 자식 엘리먼트를 구함.
name, author, year = book_childs # 리스트의 각 항목을 name, author, year 변수에 할당 

print(name.text) # name 엘리먼트의 text를 출력
print(author.text) # author 엘리먼트의 text를 출력
print(year.text) # year 엘리먼트의 text를 출력

자식 엘리먼트 확인하기 : findtext() 함수

  • 해당하는 자식 엘리먼트를 탐색하여 자동으로 텍스트를 반환.
name = book.findtext('name')
author = book.findtext('author')
year = book.findtext('year')

print(name)
print(author)
print(year)

여러개의 자식 엘리먼트 확인하기 : finadll() 함수와 for 문

  • 동일한 이름을 가진 여러 개의 자식 엘리먼트를 찾을 때는 findall() 함수와 for 문을 함께 사용하면 편리하다.
  • findall('<tag 이름>')
for book in  books.findall('book'):
    name = book.findtext('name')
    author = book.findtext('author')
    year = book.findtext('year')

    print(name)
    print(author)
    print(year)

    print()

XML 문자열을 데이터프레임으로 변환하기 : read_xml() 함수

  • 파이썬의 pandas 패키지는 xml 문자열을 읽어서 데이터프레임으로 변환하는 read_xml() 함수를 제공한다.
  • read_xml() 함수는 pandas 1.3.0 부터 지원한다.
import pandas as pd
import xml.eTree.ElementTree as et 

x_str =  '''
    <book>
         <name>혼자 공부하는 데이터 분석</name>
         <author>박해선</author>
         <year>2022</year>
     </book>
'''

pd.read_xml(x_str) # json_str은 json 문자열

API로 20대가 가장 좋아하는 도서 찾기

API를 호출하는 URL 작성하기

  • 호출 URL : http://data4library.kr/api/loanItemSrch
  • 파라미터
    • format: 기본 값은 XML (XML, JSON 같은 형태를 넘김)
    • startDt: 검색 시작 일자
    • endDt: 검색 종료 일자
    • age: 연령대
    • authKey: 인증 키
  • 조회할 값은 호출 URL 뒤에 파라미터를 연결하면 된다. (HTTP GET 방식)
    • 파라미터의 값은 '= 문자'로 연결
    • 파라미터 사이는 '& 문자'로 연결
    • 호출 URL과 파라미터는 '? 문자'로 연결

💡 HTTP GET 방식

  • 웹 브라우저가 웹 서버에 요청을 할 때 URL로 파라미터 값이나 데이터를 전달할 수 있다. (GET 방식)
  • ? 문자 뒤에 연결된 파라미터 값들은 쿼리 스트링(query string)이라고 한다.
  • 웹 브라우저와 웹 서버 모두 URL 길이에 제한을 두고 있는데 보통 2000자 이내면 안전한 길이다.
  • 만약 2,000자 이상의 데이터를 보내야 하는 경우에는 POST 방식을 사용한다.
    • POST 방식은 URL 뒤에 파라미터나 데이터를 붙이지 않기 때문에 길이 제약 없이 보낼 수 있다.
    • 하지만, POST 방식은 URL만 봐서는 어떤 데이터를 전달했는지 알 수 없다.

파이썬으로 API 호출하기 (requests 패키지)

  • 파이썬에서 URL을 호출하여 데이터를 받는 방법은 여러가지가 있지만 requests 패키지가 대표적이다.

  • HTTP GET

    • requests.get() 함수 사용 (매개변수로 url을 전달)
    • 반환 객체 (Response)의 json() 함수는 웹 서버로부터 받은 json 문자열을 파이썬 객체로 변환하여 반환한다.

    💡 Json이 아닌 원본 데이터를 받기 위해서는?

    • 반환 객체 Response의 text => 응답으로 받은 원본 텍스트를 담고 있다.
    • 반환 객체 Response의 content => 응답받은 데이터를 바이트 객체로 담고 있다.
  • 판다스 패키지의 to_json() 메서드를 통해 데이터 프레임을 JSON으로 변환하여 저장할 수 있다.

profile
조금씩 지식의 영역을 넓혀가는 중이에요...😌

0개의 댓글

관련 채용 정보