반응형
실습2: SQL쿼리를 이용하여 직접 데이터 조회해보기
이번 실습에서는 BigQuery내의 'openaq'라는 데이터 셋을 이용해볼 것이고, 해당 데이터셋은 공기질과 관련된 데이터를 가지고 있다. 먼저, 지난번 실습과 동일하게 BigQuery 패키지로부터 데이터셋을 불러오는 것부터 시작해보도록 하자.
(참고) 데이터셋을 불러오는 과정이 처음에는 생소할 수 있지만 bigquery 패키지 실습을 하다보면 익숙해질 것이니 걱정하지 않아도 된다. 그리고 실제 본인이 하는 작업에 따라서 내부 데이터셋을 이용할 수도 있고, excel이나 csv와 같은 문서의 데이터를 이용할 수 있기 때문에 데이터셋을 불러오는 과정보다 데이터를 활용하는 부분을 신경써서 보는 것을 추천한다!
from google.cloud import bigquery
#Client 객체를 통해 BigQuery 사용
client = bigquery.Client()
#'bigquery-public-data'명칭의 프로젝트에 있는 'openaq'데이터셋 불러오기
dataset_ref = client.dataset("openaq", project="bigquery-public-data")
dataset = client.get_dataset(dataset_ref)
#'openaq'데이터셋에 있는 테이블들을 리스트 형태로 불러오기
tables = list(client.list_tables(dataset))
#'openaq'데이터셋에 존재하는 테이블 명칭 조회하기
for table in tables:
print(table.table_id)
(시작하기 전) 테이블 구조 확인
아래 코드를 통해 데이터를 확인해봤을 때 'global_air_quality' 테이블은 12개의 컬럼으로 구성되어 있음을 확인할 수 있다. 그리고 .schema 기능을 통해서 (컬럼명/컬럼데이터타입/NULL가능여부/컬럼설명 등)에 대한 정보를 확인할 수 있다. 대략적으로 데이터를 확인해보면 위치(city)별로 공기 오염정도를 나타낸 것임을 짐작할 수 있을 것이다. 이제 이 테이블의 데이터를 활용하여 실제 SQL쿼리를 작성해보도록 하자.
#'openaq'데이터셋내의 'global_air_quality'테이블을 실습에 사용하기 위해 불러오는 과정
table_ref = dataset_ref.table('global_air_quality')
table = client.get_table(table_ref)
#해당 테이블을 dataframe 형태로 변환하여 처음 5개 행만 미리보기(=> 어떤 데이터가 존재하는지 확인)
client.list_rows(table, max_results=5).to_dataframe()
#'global_air_quality'테이블을 구성하는 컬럼 정보 확인
table.schema
#'global_air_quality'테이블의 행 개수 확인
table.num_rows
실습과정
'global_air_quality' 데이터셋에서 'US' country 값을 가진 경우에 대해 조사해보자. 데이터의 양이 많기 때문에 'SELECT *'로 조회할 경우 속도가 현저히 느려질 것인데, 실습을 위해서 이를 감안한 것임을 알아두자! 원래는 원하는 컬럼값만 SELECT문으로 조회하는 것이 더 좋다.
(ex) SELECT city, location FROM bigquery-public-data.openaq.global_air_quality WHERE country = 'US'
#데이터를 조회할 SQL 쿼리
#데이터의 양이 많으므로 WHERE 조건을 활용해서 데이터를 조회하는 것이 성능면에서도 좋다.(WHERE 조건없이 전체 데이터를 조회하면 속도가 현저히 낮아짐을 느낄 수 있을 것임)
query = """
SELECT *
FROM bigquery-public-data.openaq.global_air_quality
WHERE country = 'US'
"""
#Client 객체를 생성하고 실행할 쿼리 전달
client = bigquery.Client()
query_job = client.query(query)
#client를 통해 받은 쿼리 결과를 dataframe으로 변환
us_cities = query_job.to_dataframe()
country가 'US'인 경우의 데이터의 일부를 먼저 살펴보자.
#head(): 데이터프레임의 가장 위의 5개 행만 미리보여주는 기능
us_cities.head()
데이터프레임의 요약정보를 확인해보면 country = 'US'인 경우 데이터는 1,421,351행이 존재함을 알 수 있고, 데이터프레임의 용량은 약130MB 정도됨을 확인할 수 있다.
#info(): 데이터프레임의 요약정보 확인
us_cities.info()
그럼, country = 'US'인 경우의 city는 몇개가 존재하는지 알아보도록 하자. 아래 쿼리를 통해 city 데이터 값이 중복되어 있음을 알 수 있는데 중복 없이 몇개가 존재하는지 확인해보자.(다음 코드 참고)
#us_cities['city']로 조회하면 'Series' 형태로 결과 반환
#us_cities[['city']]로 조회하면 'DataFrame' 형태로 결과 반환
us_cities[['city']]
우리는 아래 결과를 통해서 country가 'US'에 해당하는 city가 826개임을 확인할 수 있다. 본 실습에서는 BigQuery에서의 'global_air_quality' 테이블에서 country='US'인 경우를 DataFrame으로 반환하여 사용했다. 그리고 해당 데이터프레임 내용을 조회하고 원하는 값을 확인해보는 시간을 가졌다. 만약 본인이 궁금한 정보가 있다면 query(client에게 전달한 SELECT문)을 수정하여 결과를 확인해보도록 하자.
#drop_duplicates(): dataframe의 중복행을 제거해주는 기능
#ignore_index은 기존 데이터프레임의 인덱스를 설정할지, 혹은 원하는 정보를 반환하면서 새롭게 인덱스를 설정할지 지정할 수 있다.(모르겠다면 ignore_index값을 True, False로 바꿔보면서 값을 출력해보길)
us_cities[['city']].drop_duplicates(ignore_index=True)
Google BigQuery 내에는 다양한 데이터셋을 제공해주기 때문에 해당 데이터를 이용하여 SQL문을 공부해볼 수도 있고, 해당 데이터를 불러와서 Python의 여러 기능을 공부해볼 수도 있다. 본 내용을 참고해서 원하는 결과를 얻기 위한 코딩 시간을 가져보길!
반응형
'[기술공부] > Python' 카테고리의 다른 글
[Kaggle] Google BigQuery를 활용한 Python 프로그래밍 (0) | 2023.07.30 |
---|