일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 데이터핸들링
- 주식데이터시각화
- Bias-Variance Tradeoff
- R 연습문제
- 데이터 핸들링
- R문법
- R 결측치
- 미국 선거데이터
- R mutate
- R filter
- 확률실험
- CrossValidation
- R ggplot2
- 이산형 확률분포
- dplyr
- 강화학습 #추천서적 #강화학습인액션
- ggplot()
- ggplot2
- 의사결정나무
- 생존그래프
- R select
- 교차타당성
- ggsurvplot
- ISLR
- geom_errorbar
- 생존분석
- R dplyr
- 카플란마이어
- 콕스비례모형
- R
- Today
- Total
Must Learning With Statistics
R dpylr 주요 코드와 Python Pandas 코드 비교 본문
R dplyr 사용자의 입장에서 Python 이해하기 1편(Pandas DataFrame)
1. R dplyr 패키지와 Python Pandas 패키지
이번 포스팅은 R과 Python을 동시에 사용해야하거나, R을 사용하던 입장에서 Python을 배워야 하는 분들을 위한 포스팅을 하고자 합니다. 기본적으로 R 사용자분들은 데이터 핸들링을 하는데에 있어서, dpylr 및 tidyverse패키지를 주로 사용하며 익숙합니다. 그리고 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을 진행해주어야 분석을 원할하게 진행할 수가 있습니다. frac 및 replace옵션을 통해 샘플링 비율과 비복원추출을 정해주는 것은 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 |
---|