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]로 동일하다.
위 코드에서는
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
-> 연습 문제
댓글