Must Learning With Statistics

R dpylr 주요 코드와 Python Pandas 코드 비교 본문

Python Code

R dpylr 주요 코드와 Python Pandas 코드 비교

Doublek Park 2020. 2. 5. 00:04

R dplyr 사용자의 입장에서 Python 이해하기 1편(Pandas DataFrame)

1. R dplyr 패키지와 Python Pandas 패키지

이번 포스팅은 R과 Python을 동시에 사용해야하거나, R을 사용하던 입장에서 Python을 배워야 하는 분들을 위한 포스팅을 하고자 합니다. 기본적으로 R 사용자분들은 데이터 핸들링을 하는데에 있어서, dpylrtidyverse패키지를 주로 사용하며 익숙합니다. 그리고 R은 기본적으로 데이터를 data.frame 혹은 tibble형태를 주로 다루기에, Python의 array, list, dict, DataFrame의 구조를 이해하기에 어려운 점이 있습니다. 이번 포스팅은 Python의 DataFrame을 다루는 Pandas패키지를 R dplyr패키지의 활용법과 비교하며 알아보도록 하겠습니다.

R dplyr 활용법 : https://mustlearning.tistory.com/10

2. 패키지 및 데이터 불러오기

import pandas as pd

STOCK = pd.read_csv("D:\\Dropbox\\DATA SET(Dropbox)\\Uniqlo.csv")

3. 판다스 데이터프레임 인덱싱

  • pandas에서 DataFrame의 인덱싱은 .loc, .iloc를 활용합니다.

R head()

  • R에서 head()명령어또한 .loc를 통해 활용할 수가 있습니다.
STOCK.iloc[1:5,]
  Date Open High Low Close Volume Stock Trading
1 2016-12-29 43000 43220 42540 42660 448400 19188227000
2 2016-12-28 43940 43970 43270 43270 339900 14780670000
3 2016-12-27 43140 43700 43140 43620 400100 17427993000
4 2016-12-26 43310 43660 43090 43340 358200 15547803000
STOCK.loc[1:5,]
  Date Open High Low Close Volume Stock Trading
1 2016-12-29 43000 43220 42540 42660 448400 19188227000
2 2016-12-28 43940 43970 43270 43270 339900 14780670000
3 2016-12-27 43140 43700 43140 43620 400100 17427993000
4 2016-12-26 43310 43660 43090 43340 358200 15547803000
5 2016-12-22 43660 43840 43190 43480 381600 16586491000
STOCK.loc[[6,10,15],:]
  Date Open High Low Close Volume Stock Trading
6 2016-12-21 43900 44370 43610 44000 658900 28994316000
10 2016-12-15 43440 43880 42550 43000 627400 27055034000
15 2016-12-08 41480 41560 40830 41100 639900 26310776000

만약 행에 대해서 특정 인덱스를 원하는 경우에는 위 코드와 같이 설정해주어야 애러가 뜨지 않습니다.

STOCK.iloc[[6,10,15],:]
  Date Open High Low Close Volume Stock Trading
6 2016-12-21 43900 44370 43610 44000 658900 28994316000
10 2016-12-15 43440 43880 42550 43000 627400 27055034000
15 2016-12-08 41480 41560 40830 41100 639900 26310776000
STOCK.loc[[6,10,15],['Date','High']]
  Date High
6 2016-12-21 44370
10 2016-12-15 43880
15 2016-12-08 41560

iloc, loc의 차이

  • iloc는 숫자형 인덱스만 받아주고, loc는 문자형 인덱스를 받아줄 수가 있습니다.

열에 대한 인덱스는 컬럼명을 지정해주면 됩니다.

R dim()

  • R에서 데이터프레임의 차원을 확인하는 명령어는 shape()를 활용합니다.
STOCK.shape
(1226, 7)
# 행의 수
STOCK.shape[0]
1226
# 열의 수
STOCK.shape[1]
7

4. 판다스 새로운 변수 추가하기

R dpylr mutate in Pandas

  • 새로운 변수를 추가하는 것은 R과 비슷하게 주면 됩니다.
  • Date변수를 날짜타입으로 변환하고, 요일변수를 추가해보도록 하겠습니다.
STOCK['Date']
0       2016-12-30
1       2016-12-29
2       2016-12-28
3       2016-12-27
4       2016-12-26
           ...    
1221    2012-01-11
1222    2012-01-10
1223    2012-01-06
1224    2012-01-05
1225    2012-01-04
Name: Date, Length: 1226, dtype: object
from datetime import datetime
STOCK['Date'] = STOCK['Date'].apply(lambda x: datetime.strptime(x, "%Y-%m-%d"))
STOCK['Day'] = STOCK['Date'].dt.dayofweek
import numpy as np
Conditions = [
    (STOCK['Day'] == 0),
    (STOCK['Day'] == 1),
    (STOCK['Day'] == 2),
    (STOCK['Day'] == 3),
    (STOCK['Day'] == 4),
    (STOCK['Day'] == 5),
    (STOCK['Day'] == 6)
]

Values = ['월','화','수','목','금','토','일']

STOCK['Day2'] = np.select(Conditions, Values, default = 'null')

5. R dplyr group by와 Pandas의 group_by

Pandas에서 groupby를 주는 방법은 다음과 같습니다.

  • DF.loc[['변수1','변수2']].groupby(DF['그룹기준변수']).적용함수()
# 평균
GR_MEAN = STOCK.loc[:,['Open','High','Low']].groupby(STOCK['Day2']).mean()
GR_MEAN
  Open High Low
Day2      
33808.750000 34294.345238 33380.138889
33881.434263 34289.701195 33434.860558
33532.000000 33968.360000 33120.400000
33834.044444 34214.600000 33454.933333
33722.620968 34128.729839 33359.375000
# 최소값
GR_MIN = STOCK.loc[:,['Open','High','Low']].groupby(STOCK['Day2']).min()
GR_MIN
  Open High Low
Day2      
13990 14030 13790
13720 13840 13600
14050 14050 13700
14610 14670 14530
13890 14390 13860
# 갯수
GR_MIN = STOCK.loc[:,['Open','High','Low']].groupby(STOCK['Day2']).count()
GR_MIN
  Open High Low
Day2      
252 252 252
251 251 251
250 250 250
225 225 225
248 248 248

Group변수를 2개이상 주기 위해서는 다음과 같이 명령어를 주어야합니다. 구조가 조금은 다르게 진행이 됩니다.

# 멀티 Group by
GR_COUNT2 = STOCK.groupby(['Day2','Date'])['Open'].count()
pd.DataFrame(GR_COUNT2)
    Open
Day2 Date  
2012-01-06 1
2012-01-13 1
2012-01-20 1
2012-01-27 1
2012-02-03 1
... ... ...
2016-11-29 1
2016-12-06 1
2016-12-13 1
2016-12-20 1
2016-12-27 1

1226 rows × 1 columns

6. R dplyr filter와 Pandas의 filter

dplyr에서 filter는 원하는 조건을 충족하는 행들을 뽑기 위한 명령어입니다. Pandas에서는 어떻게 진행되는지 알아보도록 하겠습니다. 주로 인덱스 기법을 활용하며 방법은 한가지가 아닙니다.

# 조건이 하나인 경우
STOCK[STOCK['Day2'] == "월"]
  Date Open High Low Close Volume Stock Trading Day Day2
4 2016-12-26 43310 43660 43090 43340 358200 15547803000 0
8 2016-12-19 42790 43150 42740 43130 358700 15428531000 0
13 2016-12-12 43950 44000 42880 43130 775300 33633233000 0
18 2016-12-05 40060 40350 39690 39760 620500 24756974000 0
23 2016-11-28 41260 41440 40830 41260 384800 15844055000 0
... ... ... ... ... ... ... ... ... ...
1198 2012-02-13 15500 15650 15320 15630 453200 7040798000 0
1203 2012-02-06 15600 15830 15540 15810 527600 8298393000 0
1208 2012-01-30 15070 15200 14910 15000 472200 7091748000 0
1213 2012-01-23 14630 14790 14590 14720 541800 7968019000 0
1218 2012-01-16 14610 14670 14530 14610 360100 5255652000 0

225 rows × 9 columns

STOCK[STOCK.Day2 == "월"]
  Date Open High Low Close Volume Stock Trading Day Day2
4 2016-12-26 43310 43660 43090 43340 358200 15547803000 0
8 2016-12-19 42790 43150 42740 43130 358700 15428531000 0
13 2016-12-12 43950 44000 42880 43130 775300 33633233000 0
18 2016-12-05 40060 40350 39690 39760 620500 24756974000 0
23 2016-11-28 41260 41440 40830 41260 384800 15844055000 0
... ... ... ... ... ... ... ... ... ...
1198 2012-02-13 15500 15650 15320 15630 453200 7040798000 0
1203 2012-02-06 15600 15830 15540 15810 527600 8298393000 0
1208 2012-01-30 15070 15200 14910 15000 472200 7091748000 0
1213 2012-01-23 14630 14790 14590 14720 541800 7968019000 0
1218 2012-01-16 14610 14670 14530 14610 360100 5255652000 0

225 rows × 9 columns

# 조건이 2개 이상인 경우

STOCK[(STOCK['Day2'] == "월") & (STOCK['Open'] > 40000)]
  Date Open High Low Close Volume Stock Trading Day Day2
4 2016-12-26 43310 43660 43090 43340 358200 15547803000 0
8 2016-12-19 42790 43150 42740 43130 358700 15428531000 0
13 2016-12-12 43950 44000 42880 43130 775300 33633233000 0
18 2016-12-05 40060 40350 39690 39760 620500 24756974000 0
23 2016-11-28 41260 41440 40830 41260 384800 15844055000 0
... ... ... ... ... ... ... ... ... ...
509 2014-12-01 42715 43540 42715 43425 352600 15268576000 0
518 2014-11-17 43800 43910 42215 42615 1059700 45559565000 0
523 2014-11-10 41800 41900 41240 41430 530600 22022803500 0
732 2014-01-06 42500 42600 40900 40900 1562000 65006385000 0
733 2013-12-30 43400 43800 42600 43400 841000 36362330000 0

62 rows × 9 columns

STOCK[(STOCK.Day2 == "월") & (STOCK.Open > 40000)]
  Date Open High Low Close Volume Stock Trading Day Day2
4 2016-12-26 43310 43660 43090 43340 358200 15547803000 0
8 2016-12-19 42790 43150 42740 43130 358700 15428531000 0
13 2016-12-12 43950 44000 42880 43130 775300 33633233000 0
18 2016-12-05 40060 40350 39690 39760 620500 24756974000 0
23 2016-11-28 41260 41440 40830 41260 384800 15844055000 0
... ... ... ... ... ... ... ... ... ...
509 2014-12-01 42715 43540 42715 43425 352600 15268576000 0
518 2014-11-17 43800 43910 42215 42615 1059700 45559565000 0
523 2014-11-10 41800 41900 41240 41430 530600 22022803500 0
732 2014-01-06 42500 42600 40900 40900 1562000 65006385000 0
733 2013-12-30 43400 43800 42600 43400 841000 36362330000 0

62 rows × 9 columns

7. R sample_frac과 pandas Sampling

데이터의 크기가 너무 큰 경우에는 적당히 Sampling을 진행해주어야 분석을 원할하게 진행할 수가 있습니다. fracreplace옵션을 통해 샘플링 비율과 비복원추출을 정해주는 것은 R과 동일합니다.

STOCK_01 = STOCK.sample(frac = 0.1, replace = False)
STOCK_01
  Date Open High Low Close Volume Stock Trading Day Day2
360 2015-07-10 56000 56020 53740 54010 1901200 103741664000 4
224 2016-02-02 37370 37570 37030 37240 600100 22382940000 1
189 2016-03-24 36690 36900 36210 36240 620800 22649742000 3
248 2015-12-25 43000 43540 42850 43140 348500 15056076000 4
128 2016-06-23 28500 29425 28375 29340 684400 19886987500 3
... ... ... ... ... ... ... ... ... ...
271 2015-11-20 48400 48500 47890 48210 420200 20239173000 4
543 2014-10-09 36875 37845 36860 37255 966300 36121605500 3
557 2014-09-18 34640 35065 34450 35005 734900 25621721000 3
728 2014-01-10 40250 41600 40200 41100 2206300 89903100000 4
967 2013-01-21 23490 23500 22590 22590 686200 15682371000 0

123 rows × 9 columns

random_state는 R에서의 get.seed와 같은 역할을 수행합니다. 랜덤 추출의 명령어의 재현성을 지켜주는 옵션입니다.

STOCK_01_2 = STOCK.sample(frac = 0.1, replace = False, random_state = 1)
STOCK_01_2
  Date Open High Low Close Volume Stock Trading Day Day2
126 2016-06-27 26795 27470 26325 27385 823500 22244382000 0
108 2016-07-22 33160 33240 32530 32640 492500 16162182000 4
1037 2012-10-03 17760 18300 17730 18180 828400 14998569000 2
463 2015-02-10 43615 43690 43235 43435 456700 19817334500 1
301 2015-10-07 49750 50190 48910 49800 667900 33162462000 2
... ... ... ... ... ... ... ... ... ...
1055 2012-09-06 17900 18080 17750 18010 376300 6754864000 3
1105 2012-06-27 15550 15790 15450 15790 551100 8644911000 2
664 2014-04-15 33205 33250 32505 32660 743700 24377326000 1
587 2014-08-06 33480 33810 33205 33320 507200 16955394500 2
390 2015-05-29 50700 51640 50550 51300 588000 30160665000 4

123 rows × 9 columns

STOCK_01_3 = STOCK.sample(frac = 0.1, replace = False, random_state = 1)
STOCK_01_3
  Date Open High Low Close Volume Stock Trading Day Day2
126 2016-06-27 26795 27470 26325 27385 823500 22244382000 0
108 2016-07-22 33160 33240 32530 32640 492500 16162182000 4
1037 2012-10-03 17760 18300 17730 18180 828400 14998569000 2
463 2015-02-10 43615 43690 43235 43435 456700 19817334500 1
301 2015-10-07 49750 50190 48910 49800 667900 33162462000 2
... ... ... ... ... ... ... ... ... ...
1055 2012-09-06 17900 18080 17750 18010 376300 6754864000 3
1105 2012-06-27 15550 15790 15450 15790 551100 8644911000 2
664 2014-04-15 33205 33250 32505 32660 743700 24377326000 1
587 2014-08-06 33480 33810 33205 33320 507200 16955394500 2
390 2015-05-29 50700 51640 50550 51300 588000 30160665000 4

123 rows × 9 columns

결과를 확인하시면 random_state = 1의 옵션을 통해 위 두 결과의 샘플링 결과가 동일하다는 것을 확인할 수가 있습니다.

여기까지 R에서 가장 많이 쓰이는 dplyr명령어들이 Python에서는 어떤 명령어인지 알아보았습니다.

'Python Code' 카테고리의 다른 글

python 시간 데이터 다루기  (0) 2020.02.22
Comments