데이터 변형¶
데이터셋 대체하기¶
kospi.head()
Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2020-12-28 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | 1006200 |
2020-12-29 | 2810.550049 | 2823.439941 | 2792.060059 | 2820.510010 | 2820.510010 | 1046800 |
2020-12-30 | 2820.360107 | 2878.209961 | 2809.350098 | 2873.469971 | 2873.469971 | 1074000 |
2021-01-04 | 2874.500000 | 2946.540039 | 2869.110107 | 2944.449951 | 2944.449951 | 1026500 |
2021-01-05 | 2943.669922 | 2990.570068 | 2921.840088 | 2990.570068 | 2990.570068 | 1519900 |
예를 들어 위의 kospi 데이터프레임을 작성 시 Open 컬럼에 실수로 10101,20101,30101 라는 값이 일부 위치에 들어갔다고 가정해보겠습니다. 아래와 같이 .at()을 이용하여 'Open'과 'High' 컬럼에 10101값을 넣어서 데이터 프레임이 변경되었습니다.
kospi.at['2020-12-28', 'Open'] = 10101
kospi.at['2021-01-04', 'Low'] = 20101
kospi.at['2020-12-30', 'High'] = 30101
kospi.at['2020-12-30', 'Adj Close'] = 30101
kospi.head()
Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2020-12-28 | 10101.000000 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | 1006200 |
2020-12-29 | 2810.550049 | 2823.439941 | 2792.060059 | 2820.510010 | 2820.510010 | 1046800 |
2020-12-30 | 2820.360107 | 30101.000000 | 2809.350098 | 2873.469971 | 30101.000000 | 1074000 |
2021-01-04 | 2874.500000 | 2946.540039 | 20101.000000 | 2944.449951 | 2944.449951 | 1026500 |
2021-01-05 | 2943.669922 | 2990.570068 | 2921.840088 | 2990.570068 | 2990.570068 | 1519900 |
데이터프레임에 .replace()를 사용하면 데이터프레임에 있는 모든 값을 확인하여 변경합니다. Dict 형식으로 전달된 입력에는 변경을 위해 검색할 값을 key, 변경할 값을 value로 전달합니다. 아래와 같이 10101과 20101이 .replace()함수를 통해서 2820.949951와 2869.110107로 변경되었습니다.
result = kospi.replace({10101: 2820.949951, 20101:2869.110107})
result
Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2020-12-28 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | 1006200 |
2020-12-29 | 2810.550049 | 2823.439941 | 2792.060059 | 2820.510010 | 2820.510010 | 1046800 |
2020-12-30 | 2820.360107 | 30101.000000 | 2809.350098 | 2873.469971 | 30101.000000 | 1074000 |
2021-01-04 | 2874.500000 | 2946.540039 | 2869.110107 | 2944.449951 | 2944.449951 | 1026500 |
2021-01-05 | 2943.669922 | 2990.570068 | 2921.840088 | 2990.570068 | 2990.570068 | 1519900 |
... | ... | ... | ... | ... | ... | ... |
2021-12-20 | 3001.330078 | 3001.330078 | 2962.070068 | 2963.000000 | 2963.000000 | 377100 |
2021-12-21 | 2981.669922 | 2984.560059 | 2955.899902 | 2975.030029 | 2975.030029 | 410500 |
2021-12-22 | 2993.500000 | 3000.790039 | 2976.649902 | 2984.479980 | 2984.479980 | 461400 |
2021-12-23 | 2998.020020 | 3000.699951 | 2980.909912 | 2998.169922 | 2998.169922 | 483300 |
2021-12-24 | 3009.479980 | 3025.770020 | 3009.479980 | 3012.429932 | 3012.429932 | 537500 |
247 rows × 6 columns
데이터프레임에 .replace()를 사용하는 다른 방식은 변경할 값을 찾을 컬럼을 지정하는 방식입니다. 'High' 컬럼에 존재하는 30101값을 찾아서 2878.209961로 변경하였습니다. 컬럼을 지정했기 때문에 '2020-12-30' 인덱스의 'Adj Close'컬럼의 30101값은 변경되지 않았습니다.
result = result.replace({'High': 30101}, 2878.209961)
result.head()
Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2020-12-28 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | 1006200 |
2020-12-29 | 2810.550049 | 2823.439941 | 2792.060059 | 2820.510010 | 2820.510010 | 1046800 |
2020-12-30 | 2820.360107 | 2878.209961 | 2809.350098 | 2873.469971 | 30101.000000 | 1074000 |
2021-01-04 | 2874.500000 | 2946.540039 | 2869.110107 | 2944.449951 | 2944.449951 | 1026500 |
2021-01-05 | 2943.669922 | 2990.570068 | 2921.840088 | 2990.570068 | 2990.570068 | 1519900 |
데이터 변형을 위한 함수 적용¶
데이터프레임에 함수를 적용하는 경우 기본적으로 각 칼럼에 함수가 적용됩니다. 테스트를 위한 데이터프레임을 생성합니다.
df = pd.DataFrame(np.arange(15).reshape(5,3), columns = ['a','b','c'])
df
a | b | c | |
---|---|---|---|
0 | 0 | 1 | 2 |
1 | 3 | 4 | 5 |
2 | 6 | 7 | 8 |
3 | 9 | 10 | 11 |
4 | 12 | 13 | 14 |
판다스는 모든 컬럼을 돌면 각각을 series로 함수에 전달합니다. 각 컬럼에 적용할 함수는 람다함수를 사용합니다. 전달되는 컬럼에 합을 구하기 위해서 .sum()을 사용합니다.
df.apply(lambda col : col.sum())
a 30
b 35
c 40
dtype: int64
함수를 로우에 적용하기 위해서는 axis를 1로 설정합니다. 로우에 대한 sum()결과가 출력됨을 확인할 수 있습니다.
df.apply(lambda col : col.sum(), axis = 1)
0 3
1 12
2 21
3 30
4 39
dtype: int64
kospi 데이터프레임의 'High'와 'Low' 컬럼의 값의 차이를 구해서 하루 동안의 주가 변동폭을 새로운 컬럼에 추가합니다.
kospi = pd.read_csv("./^KS11.csv", index_col ='Date')
kospi
Open | High | Low | Close | Adj Close | Volume | |
---|---|---|---|---|---|---|
Date | ||||||
2020-12-28 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | 1006200 |
2020-12-29 | 2810.550049 | 2823.439941 | 2792.060059 | 2820.510010 | 2820.510010 | 1046800 |
2020-12-30 | 2820.360107 | 2878.209961 | 2809.350098 | 2873.469971 | 2873.469971 | 1074000 |
2021-01-04 | 2874.500000 | 2946.540039 | 2869.110107 | 2944.449951 | 2944.449951 | 1026500 |
2021-01-05 | 2943.669922 | 2990.570068 | 2921.840088 | 2990.570068 | 2990.570068 | 1519900 |
... | ... | ... | ... | ... | ... | ... |
2021-12-20 | 3001.330078 | 3001.330078 | 2962.070068 | 2963.000000 | 2963.000000 | 377100 |
2021-12-21 | 2981.669922 | 2984.560059 | 2955.899902 | 2975.030029 | 2975.030029 | 410500 |
2021-12-22 | 2993.500000 | 3000.790039 | 2976.649902 | 2984.479980 | 2984.479980 | 461400 |
2021-12-23 | 2998.020020 | 3000.699951 | 2980.909912 | 2998.169922 | 2998.169922 | 483300 |
2021-12-24 | 3009.479980 | 3025.770020 | 3009.479980 | 3012.429932 | 3012.429932 | 537500 |
247 rows × 6 columns
MDD는 특정 기간동안 발생한 최대 낙폭을 의미하는 하방 리스크 지표 입니다. 기간동안의 최소값에서 최대값의 차이를 최대값으로 나누어서 확인합니다.
$MDD = \frac{MIN - MAX}{MAX}$
.apply()와 lambda함수를 이용하여 MDD 컬럼을 아래와 같이 생성합니다. 이때 입력으로 컬럼 정보를 사용하기 때문에 axis = 1로 설정했습니다.
kospi['MDD']= kospi.apply(lambda col: ((col.Low - col.High)/col.High)*100, axis = 1)
kospi.head()
Open | High | Low | Close | Adj Close | Volume | MDD | |
---|---|---|---|---|---|---|---|
Date | |||||||
2020-12-28 | 2820.949951 | 2834.590088 | 2799.560059 | 2808.600098 | 2808.600098 | 1006200 | -1.235806 |
2020-12-29 | 2810.550049 | 2823.439941 | 2792.060059 | 2820.510010 | 2820.510010 | 1046800 | -1.111406 |
2020-12-30 | 2820.360107 | 2878.209961 | 2809.350098 | 2873.469971 | 2873.469971 | 1074000 | -2.392454 |
2021-01-04 | 2874.500000 | 2946.540039 | 2869.110107 | 2944.449951 | 2944.449951 | 1026500 | -2.627826 |
2021-01-05 | 2943.669922 | 2990.570068 | 2921.840088 | 2990.570068 | 2990.570068 | 1519900 | -2.298223 |
'Programming > Pandas' 카테고리의 다른 글
[Pandas] 데이터접합 방향설정 및 이름설정 (0) | 2022.01.07 |
---|---|
[Pandas] 데이터 연결 (concat), 인덱스 연결 (0) | 2022.01.07 |
[Pandas] 중복 데이터 제거하기 (0) | 2022.01.04 |
[Pandas] 모든 컬럼이 NaN일 때만 삭제하기 (0) | 2022.01.03 |
[Pandas] 데이터프레임 로우, 컬럼 정보 확인하기 (0) | 2022.01.02 |