python/개념 공부

[Python] datatable package

연정양 2023. 1. 17.

python에도 data.table과 같은 역할을 하는 패키지가 있다. 이름은 datatable !

pandas보다도 훨씬 빠르지만 아직 기능적으로 부족한 부분이 있다고 한다.

계속 개발중이라고 하니 추후에는 속도와 기능을 겸비한 패키지가 되지 않을까 싶다.

 

 

사용해보기

1) import packages

pip install datatable
import datatable as dt
import numpy as np
import pandas as pd
import time
print(dt.__version__) #1.0.0

pip으로 설치 후, pandas와의 비교를 위해 다른 패키지들도 같이 불러온다.

dataset은 아래 링크의 loan.csv를 다운받아 사용했다.

 

Getting started with Python datatable

Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources

www.kaggle.com

 

2) Reading Data (fread, read_csv, pandas)

#Reading Data(fread)
start = time.time()
input_file_name = "loan.csv"
dt_df = dt.fread(input_file_name)
end = time.time()
print(end - start) #2.93

#Reading Data(read_csv)
start = time.time()
pd_df = pd.read_csv(input_file_name)
end = time.time()
print(end - start) #37.49

#Reading Data(pandas)
start = time.time()
dt_df.to_pandas()
end = time.time()
print(end - start) #31.95

####세 가지 방법 중 fread가 가장 빠르다.

 fread를 사용했을 때 가장 속도가 빠르다. 

 

3) head, shape, names

dt_df.head()
dt_df.shape #(2260668, 145)
dt_df.names[:10] #to get the column names

데이터의 형태를 살피는 함수도 사용 가능하다. 

dt_df.head()
Out[36]: 
   |   id  member_id  loan_amnt  funded_amnt  funded_amnt_inv  …  settlement_am…  settlement_percentage  settlement_term
   | void       void      int32        int32          float64            float64                float64            int32
-- + ----  ---------  ---------  -----------  ---------------     --------------  ---------------------  ---------------
 0 |   NA         NA       2500         2500             2500  …              NA                     NA               NA
 1 |   NA         NA      30000        30000            30000  …              NA                     NA               NA
 2 |   NA         NA       5000         5000             5000  …              NA                     NA               NA
 3 |   NA         NA       4000         4000             4000  …              NA                     NA               NA
 4 |   NA         NA      30000        30000            30000  …              NA                     NA               NA
 5 |   NA         NA       5550         5550             5550  …              NA                     NA               NA
 6 |   NA         NA       2000         2000             2000  …              NA                     NA               NA
 7 |   NA         NA       6000         6000             6000  …              NA                     NA               NA
 8 |   NA         NA       5000         5000             5000  …              NA                     NA               NA
 9 |   NA         NA       6000         6000             6000  …              NA                     NA               NA
[10 rows x 145 columns]
dt_df.names[:10] #to get the column names
Out[38]: 
('id',
 'member_id',
 'loan_amnt',
 'funded_amnt',
 'funded_amnt_inv',
 'term',
 'int_rate',
 'installment',
 'grade',
 'sub_grade')

 

4) summary statistics

#sum, mean, max, min, sd, mode, nmodal, nunique are available

위의 목록과 같이, 통계 요약치를 나타내는 함수도 사용 가능하다.

dt_df.mean() # mean by col
Out[39]: 
   |      id  member_id  loan_amnt  funded_amnt  funded_amnt_inv  …  settlement…  settlement_percentage  settlement_term
   | float64    float64    float64      float64          float64         float64                float64          float64
-- + -------  ---------  ---------  -----------  ---------------     -----------  ---------------------  ---------------
 0 |      NA         NA    15046.9      15041.7          15023.4  …      5030.61                47.7756          13.1486
[1 row x 145 columns]
dt_df.sum()
Out[40]: 
   |      id  member_id    loan_amnt  funded_amnt  funded_amnt_inv  …    settleme…  settlement_percentage  settlement_term
   | float64    float64      float64      float64          float64         float64                float64          float64
-- + -------  ---------  -----------  -----------  ---------------     -----------  ---------------------  ---------------
 0 |       0          0  3.40161e+10  3.40042e+10       3.3963e+10  …  1.66292e+08            1.57927e+06           434640
[1 row x 145 columns]

 

5) sorting the frame (datatable, pandas)

#sorting the frame (datatable)
start = time.time()
dt_df.sort("loan_amnt")
end = time.time()
print(end - start) #0.06

#sorting the frame (pandas)
start = time.time()
pd_df.sort_values(by = "loan_amnt")
end = time.time()
print(end - start) #9.38

정렬 역시 datatable가 훨씬 빠르다.

 

6) GroupBy

#GroupBy
#DT[i, j, ...] <- same as data.table in R
#i <- row, j <- col, ... <- additional modifiers
start = time.time()
for i in range(100):
    dt_df[:, dt.sum(dt.f.loan_amnt), dt.by(dt.f.grade)]
end = time.time()
print(end - start) #4.93

#pandas
start = time.time()
for i in range(100):
    pd_df.groupby("grade")["loan_amnt"].sum()
end = time.time()
print(end - start) #10.42

data.table과 datatable의 기본 문법은 DT[i, j, by]로 동일하다.

{"originWidth":700,"originHeight":549,"style":"alignCenter","caption":"출처 : Data Table: R vs Python. R or Python, which one is a better…

위 코드에서는

dt_df[:, dt.sum(dt.f.loan_amnt), dt.by(dt.f.grade)]

이 부분인데,

: -> i(rows),

dt.sum(dt.f.loan_amnt) -> j(col)

dt.by(dt.f.grad) -> by(기준) 이다.

 

7) Filtering rows

start = time.time()
for i in range(100):
    dt_df[dt.f.loan_amnt > dt.mean(dt.f.loan_amnt), "loan_amnt"]
end = time.time()
print(end - start)

filtering 역시 groupby와 동일하게 사용한다.

 

8) Model Building (linear regression model)

#Model Building (linear regression model)
#predict the "interest rate" from "loan amount" and "installment"

from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(dt_df[:, ["loan_amnt", "installment"]], dt_df[:, "int_rate"])
model.coef_ #array([[-9.50494440e-05,  5.33344794e-03]])

모델링에도 활용이 가능하며, 위는 선형회귀분석 모델링이다. 

interest rate(int_rate)를 종속 변수로 회귀 분석을 실시했다. 

마지막 array는 기울기(가중치) 계산 결과이다.

 

9) Selecting subsets of rows/ columns

dt_df[:, 'funded_amnt'] #all rows/specific col
dt_df[:6, :2] #~
dt_df[5, 4]
dt_df[:, 'funded_amnt'] #all rows/specific col
Out[41]: 
        | funded_amnt
        |       int32
------- + -----------
      0 |        2500
      1 |       30000
      2 |        5000
      3 |        4000
      4 |       30000
      5 |        5550
      6 |        2000
      7 |        6000
      8 |        5000
      9 |        6000
     10 |        5500
     11 |       28000
     12 |       11200
     13 |        6500
     14 |       22000
      … |           …
2260663 |       12000
2260664 |       12000
2260665 |       10000
2260666 |       12000
2260667 |       16550
[2260668 rows x 1 column]
dt_df[:6, :2] #~
Out[42]: 
   |   id  member_id
   | void       void
-- + ----  ---------
 0 |   NA         NA
 1 |   NA         NA
 2 |   NA         NA
 3 |   NA         NA
 4 |   NA         NA
 5 |   NA         NA
[6 rows x 2 columns]
dt_df[5, 4]
Out[43]: 5550.0

행과 열을 선택하는 법. 인덱스 값을 주면 된다!

[x, y] 에서 x는 행번호, y는 열번호이다.

:는 전체를 뜻하고, :n <- 은 n까지 를 의미한다.

 

10) Saving the Frame

gdf = dt_df[:, dt.sum(dt.f.loan_amnt), dt.by(dt.f.grade)]
gdf.to_csv("temp.csv")

fread로 csv파일을 읽을 수 있고, 위와 같이 csv파일을 쓰는 것(저장하는 것) 또한 가능하다.

groupby한 데이터를 temp.csv라는 파일명으로 저장했고, 아래처럼 저장됐다.

grade loan_amnt
A 6323641900
B 9404817775
C 9775551175
D 5097344375
E 2367318100
F 799410225
G 248032375

 

참고 링크

 

Getting started with Python datatable

Explore and run machine learning code with Kaggle Notebooks | Using data from multiple data sources

www.kaggle.com

 

 

 

Home — datatable documentation

Datatable is a python library for manipulating tabular data. It supports out-of-memory datasets, multi-threaded data processing, and flexible API.

datatable.readthedocs.io

-> 기본 가이드

 

 

Data Table: R vs Python

R or Python, which one is a better performer on wrangling big data.

medium.com

-> data.table과 datatable의 차이 

 

 

101 Python datatable Exercises (pydatatable) - Machine Learning Plus

Python datatable is the newest package for data manipulation and analysis in Python. It carries the spirit of R's `data.table` with similar syntax. It is super fast, much faster than pandas and has the ability to work with out-of-memory data.

www.machinelearningplus.com

-> 연습 문제

댓글