본문 바로가기
자습

Three Pandas Functions Every Data Engineer Who Uses Python Should Know

by litaro 2020. 9. 1.

https://medium.com/swlh/five-pandas-functions-every-data-engineer-who-uses-python-should-know-c27cbbda927b

 

Five Pandas Functions Every Data Engineer Who Uses Python Should Know

Using Pandas to wrangle data? Keep these functions in mind.

medium.com

요즘 하도 Data Engineering 얘기가 많아서 관련한 내용들을 보던 중에 본 블로그 내용. 데이터를 다루는 python 개발자라면 알아야하는 세 개의 pandas function 이다.

pandas 를 별로 써보지 않아서 한번 간단하게 맛보고 싶어서 찾아보니 kaggle에서 무료로 pandas 설명도 해주고 실습 공간도 제공해주니 도움이 된다. 

https://www.kaggle.com/learn/pandas

 

Learn Pandas Tutorials

Solve short hands-on challenges to perfect your data manipulation skills.

www.kaggle.com

보통 Data Engineering 하면 ETL (Extract, Transform, Load) 이 바로 나온다. Data를 잘 모아서 다루는게 기본이니 말이다. 이 때 저자를 비롯해 많은 사람들이 Pandas로 script를 작성한다고 한다. 

저자가 예제로 사용한 데이터는 kaggle 에서 무료로 다운 받을 수 있다.

https://www.kaggle.com/schirmerchad/bostonhoustingmlnd

 

Boston Housing

Concerns housing values in suburbs of Boston

www.kaggle.com

3. Query

Data를 다루다 보면 역시 SQL을 주로 사용하고 query는 원하는 Data를 빠르게 선택할 수 있는 함수다. 물론 pandas의 loc, iloc도 동일한 동작을 할 수 있지만.. 해당 column names나, memory의 objects에 넣어야한다.

>>> data.loc[data.MEDV > 500000]
>>> data.query('MEDV > 500000')

        RM  LSTAT  PTRATIO      MEDV
0    6.575   4.98     15.3  504000.0
2    7.185   4.03     17.8  728700.0
3    6.998   2.94     18.7  701400.0
4    7.147   5.33     18.7  760200.0
5    6.430   5.21     18.7  602700.0
..     ...    ...      ...       ...
392  6.852  19.78     20.2  577500.0
456  6.980  11.66     20.2  625800.0
465  7.061   7.01     20.2  525000.0
477  5.926  13.59     19.2  514500.0
486  6.976   5.64     21.0  501900.0
[146 rows x 4 columns]

query를 사용하면 '@'를 이용해서 원하는 data를 list, dictionary, set 형태의 key로 검색할 수 있다. 

>>> acceptable_home_prices = [525000, 500000, 501900]
>>> data.loc[data.MEDV.isin(acceptable_home_prices)]
>>> data.query('MEDV in @acceptable_home_prices')

        RM  LSTAT  PTRATIO      MEDV
52   6.511   5.28     16.8  525000.0
63   6.762   9.50     19.7  525000.0
81   6.619   7.22     19.0  501900.0
84   6.389   9.62     18.5  501900.0
93   6.211   6.21     18.2  525000.0
162  6.101   9.81     14.7  525000.0
208  6.182   9.47     18.6  525000.0
282  6.127   8.58     16.0  501900.0
313  6.415   6.12     19.6  525000.0
332  6.696   7.18     17.6  501900.0
349  6.398   7.79     20.2  525000.0
465  7.061   7.01     20.2  525000.0
486  6.976   5.64     21.0  501900.0

 

2. df.memory_usage

프로그램 runtime을 최소화하려면 결국 data를 다루기위해 생성하는 objects의 memory 사용을 확인해야하는데 pandas에서는 built-in 함수로 제공한다. 예제 data야 적지만 실제 big data를 다루려면 한번에 가져와 처리하기보다는 나눠서 처리하는게 프로그램시간을 단축 시킬수 있다.

>>> data.memory_usage()
Index       128
RM         3912
LSTAT      3912
PTRATIO    3912
MEDV       3912
dtype: int64

 

3. pd.read_sql / df.to_sql

위에서도 얘기했듯이 data를 주로 SQL database 형태로 관리하기때문에 database에 주기적으로 쌓이는 data를 필요할때 가져와서 처리하고 다시 database를 업데이트하는 작업을 빈번하게 할것이다. 이때 사용할 함수가 이 두개 ~

일단 저자의 예제는 postgreSQL을 사용해서 data를 table로 저장하고 이 database에 연결해서 data를 가져오는 것이다.

따라하려면... 내 pc에 postgreSQL을 설치해서 localhost에 하나 database를 만들어야하는군...

간단하게 postgreSQL database 만드는법

postgreSQL - 다운해서 설치하기 (mac의 경우)

Dbeaver - postgreSQL을 GUI로 관리하는 툴이 많은데 난 Dbeaver 로 설치

test 할 table 만들기 - 일일히 database만들기 귀챦으니... 위에서 다운 받은 csv 파일을 import하기

이제 준비가 되었으니 pandas로 db의 data를 가져오자

>>> import pandas as pd
>>> from sqlalchemy import create_engine

>>> engine = create_engine('postgresql://postgres:postgres@localhost:5434/postgres')
>>> connection = engine.connect()
>>> pd.read_sql(''' SELECT * FROM public.housing_csv''', connection)

        rm lstat ptratio      medv
0    6.575  4.98    15.3  504000.0
1    6.421  9.14    17.8  453600.0
2    7.185  4.03    17.8  728700.0
3    6.998  2.94    18.7  701400.0
4    7.147  5.33    18.7  760200.0
..     ...   ...     ...       ...
484  6.593  9.67    21.0  470400.0
485   6.12  9.08    21.0  432600.0
486  6.976  5.64    21.0  501900.0
487  6.794  6.48    21.0  462000.0
488   6.03  7.88    21.0  249900.0

 

그리고 처리한 data를 다시 to_sql을 이용해서 db에 넣자

>>> data = pd.read_sql(''' SELECT * FROM public.housing_csv''', connection)
>>> data.to_sql('housing_table', con=connection, schema='public', if_exists='replace')

 

대용량의 .csv 파일을 받아서 할 필요 없이 직접 cloud에 있는 database에 접근해서 data를 읽고 쓰기에 편리하다. 참고로, 저자는 cloud 기반 Oracle, Snowflake, postgreSQL 을 사용했다고 한다. 

그래도 한번 따라해보니 데.알.못인 나에게 기본적인 pandas 에서 data 가져오는 방법에 대해서는 알수 있었다. ^_________^