본문 바로가기
머신러닝 딥러닝

0820 Pandas4 DataFrame function

by 대금부는개발자 2021. 8. 20.
SMALL

 

간단한 복습

 

 

 

DataFrame의 indexing, slicing, boolean, fancy indexing

 

import numpy as np
import pandas as pd

data = {'이름': ['아이유','김연아','홍길동','강감찬','이순신'],
          '학과': ['철학과', '수학과', '물리학과', '경영학과','컴퓨터'],
          '평점': [1.5, 2.0, 3.4, 2.9, 4.9],
          '학년': [1, 3, 2, 1,4]}

df = pd.DataFrame(data,
                 columns=['학과','이름','학년','평점','등급'],
                 index=['one','two','three','four','five'])

# display(df)
#print(df.loc[1]) #loc는 숫자 index를 사용할 수 없어요!
#숫자 index를 사용하려면 iloc를 사용하면 돼요!


# print(df.iloc[1]) # 단일 행 선택 가능!

학과    수학과
이름    김연아
학년      3
평점    2.0
등급    NaN
Name: two, dtype: object


# df.iloc[1:3]                          # slicing도 가능해요!


display(df.iloc[1:4, :2])              #iloc는 다 숫자로 써야 해요!



 

 


display(df.iloc[[1,3],[1,3]]) #numpy에서는 안되지만 DataFrame에서는 행 과열에 대해서 fancy indexing이 가능합니다.

 

 

loc는 지정인덱스, iloc는 숫자로 사용하세요~!

 

 

 

DataFrame의 행에 대해서 알아보아요.

 

import numpy as np
import pandas as pd

data = {'이름': ['아이유','김연아','홍길동','강감찬','이순신'],
          '학과': ['철학과', '수학과', '물리학과', '경영학과','컴퓨터'],
          '평점': [1.5, 2.0, 3.4, 2.9, 4.9],
          '학년': [1, 3, 2, 1,4]}

df = pd.DataFrame(data,
                 columns=['학과','이름','학년','평점','등급'],
                 index=['one','two','three','four','five'])

display(df)

df.loc['six',:] =['미술','신사임당',2, 3.4,'A'] #없는 컬럼을 명시해서 사용하면 추가돼요!

display(df)

 

 

df.loc['six',['학과','이름']]=['미술','신사임당']
display(df)

 

 

 

new_df = df.drop('three',axis=0, inplace=False)         #low를  index를 이용해 삭제할 거예요
display(new_df)

 

 

 

#new_df = df.drop('three':'four',axis=0, inplace=False) # 슬라이싱이나 숫자 인덱스는 쓰지 못해요!!

 

new_df = df.drop(['three','four'],axis=0, inplace=False)
display(new_df) # fancy indexing으로는 삭제가 돼요!!

 

 

 

# 수학적인 함수들에 대해서 알아보아요!

 

import numpy as np


arr = np.array([4, 6, 1, 3, 8, 8])

#평균!! 데이터의 합을 요소의 수로 나눔, 특정 데이터의 대푯값 중 하나


print(arr.sum())    # 합
print(arr.mean())  # 평균

 

30

5.0

 

편차( deviation ) : 확률변수(주사위 던졌을 때 확률 같은 거로 생각하세요) x와 평균의 차이

#현재 평균이 5 니까 4, 6, 1, 3, 8, 8에서 5를 빼세요!  -1 1  -4  -2 3 3 

# 각각의 값에서 평균을 뺏을 때 숫자가 크면 데이터가 많이 분산(퍼져있다) 되어 있다를 알 수 있어요!

=> 얼마만큼 퍼져 있느냐에 대한 하나의 값

#  편차의 합 = 0  이기에 값으로 도출할 수 없어요! 그래서 각각을 제곱해서 평균을 낸 거예요.

편차의 제곱의 평균을 이용=> 분산 variance

#  -1 1  -4  -2 3 3    제곱 =>  1  1  16  4  9

 

tmp = np.array([1,1,16,4,9,9])
print(tmp.mean())

 

6.666666666666667 

 

 

print(arr.var())# var 함수를 이용하면 데이터의 분산을 바로 구할 수 있어요! variance의 약자

 

6.666666666666667

 

#제곱해서 값이 커지기에 실제로 잘 사용하지는 않아요!

=>   표준편차 이용

 

# 표준편차 ( standard deviation) : 분산의 제곱근 => 줄여서 std

 

print(arr.std())

 

2.581988897471611

 

#숫자가 크다는 이야기는 데이터가 퍼져있다로 봐야 해요.

 

국민 개개인의 소득에 대해서 표준편차를 구해보면 => 양극화가 어떻게 진행되고 있는지를 파악할 수 있어요!

 

 

공분산( covariance )=> 두 개의 확률변수의 관계를 보여주는 값. 줄여서 cov →co + variance   co는 같이 일한다는 의미

=> x가 변할 때 y가 변하는 정도를 나타내는 값

 

y = 10x + 3 # x(독립변수)가 변하면 y (종속변수)가 변해요!!

x 값과 y 값의 관계를 알 수 있어요! =>  x 증가 y 증가 , x 감소 y 감소

cov(x,y)  확률변수 각 각 편차의 곱에 대한 평균

공분산, 모공분산, 표준 공분산 개념을 이해해야 해요! 

 

arr1 = np.array([4, 6, 1, 3, 8, 8])
arr2 = np.array([-1, 2, 7, 9, 10, 10])
print(np.cov(arr1,arr2))

 

[[ 8.          3.4       ]
 [ 3.4        21.36666667]]

 

#의미를 따져보자면 양수가 나오면 독립변수가 증가하면 종속변수가 증가함을 의미

                           음수가 나오면 독립변수가 증가하면 종속변수는 감소함을 의미

=> 경향 파악 가능, 단 수치의 값이 크게 의미를 부여하기 힘들어서 사용하기에 제약이 있어요!

 

 

 

공분산을 구해서 진짜 데이터가 서로 경향이 같은지를 알아보아요!

 

데이터가 있어야 해요! 

KOSPI, 삼성전자 데이터를 이용해서 공분산을 계산해 보아요!

데이터가 있어야 하니 pandas의 datareader를 이용해서 주가 데이터를 가져올 꺼예요!

 

pandas_datareader module을 설치해보아요!

가상환경 전환 → pip install pandas_datareader

 

 

import numpy as np
import pandas as pd
import pandas_datareader.data as pdr
from datetime import datetime
# pandas_datareader 안의 data라는 서브 패키지를 이용해요! pdr 이라는 aliasing 은 아무 의미 없어요.
#날짜는 datetime 패키지 안에 datetime 모듈을 이용할 거예요.

start = datetime(2018,1,1) #연월일로 인자가 들어가요! 
end = datetime(2018,12,31)

# pdr.DataReader('종목코드','yahoo',start, end)       #DataReader 라는 함수를 이용하면 데이터를 읽어올 수 있어요! →DataFrame으로 만들어줘요!


df_kospi = pdr.DataReader('^KS11','yahoo',start, end)          #^KS11 : KOSPI에 대한 종목코드
display(df_kospi)

 

 

 

데이터를 JSON 으로 저장할 거예요

 

import numpy as np
import pandas as pd
import pandas_datareader.data as pdr
from datetime import datetime

start = datetime(2018,1,1) #연월일로 인자가 들어가요! 
end = datetime(2018,12,31)

df_kospi = pdr.DataReader('^KS11','yahoo',start, end)      # ^KS11 : KOSPI에 대한 종목코드
df_se = pdr.DataReader('005930.KS','yahoo',start, end)     # '005930.KS : 삼성전자에 대한 종목코드

display(df_se)
df_kospi.to_json('./data/KOSPI.json')    # 파일로도 저장해 놓았어요!
df_se.to_json('./data/SE.json')             # 파일로도 저장해 놓았어요!

series_close_kospi = df_kospi['Close']
series_close_se = df_se['Close']
print(series_close_kospi)

 

 

Date
2018-01-03    2486.350098
2018-01-04    2466.459961
2018-01-05    2497.520020
2018-01-08    2513.280029
2018-01-09    2510.229980
                 ...     
2018-12-21    2061.489990
2018-12-24    2055.010010
2018-12-26    2028.010010
2018-12-27    2028.439941
2018-12-28    2041.040039
Name: Close, Length: 242, dtype: float64

 

#공분산을 구해보아요

 

import numpy as np
import pandas as pd
import pandas_datareader.data as pdr
from datetime import datetime

start = datetime(2018,1,1) 
end = datetime(2018,12,31)

df_kospi = pdr.DataReader('^KS11','yahoo',start, end) 
df_se = pdr.DataReader('005930.KS','yahoo',start, end)


series_close_kospi = df_kospi['Close']
series_close_se = df_se['Close']


print(np.cov(series_close_kospi.values, series_close_se.values))

[[   24045.56247333   489067.36939603]
 [  489067.36939603 11918322.34148349]]  #결과가 양수라는 이야기는 경향이(추세가) 같다를 뜻해요


0,0 : KOSPI의 공분산 (자기와 자기자신에대한 공분산)
0,1 : KOSPI와 SE의 공분산
1,0 : SE와 KOSOPI의 공분산
1,1 : SE의 공분산 (삼성전자와 삼성전자의 공분산)

# 순서는 코드에 적은 순서대로 연산돼요!

 

 

import numpy as np
import pandas as pd
import pandas_datareader.data as pdr
from datetime import datetime


start = datetime(2018,1,1) #연월일로 인자가 들어가요! 
end = datetime(2018,12,31)

df_lig = pdr.DataReader('079550.KS','yahoo',start, end) # LIG넥스원 : 방산주
df_pusan = pdr.DataReader('011390.KS','yahoo',start, end) # 부산산업 : 경협주
display(df_kospi)


series_close_lig = df_lig['Close']
series_close_pusan = df_pusan['Close']


print(np.cov(series_close_lig.values, series_close_pusan.values))

[[ 6.24988174e+07 -3.81494283e+08]
 [-3.81494283e+08  4.64412566e+09]]

 

공분산의 특징 중의 하나는 양수냐 음수냐를 가지고 방향성을 따질 수 있지만 값을 크기를 가지고 방향성을 찾기 힘들어요! 숫자의 크기는 의미없습니다. 양수인지 음수인지만을 보게됩니다. 

그래서 공분산보다는 상관계수를 이용하게 됩니다.

LIST

'머신러닝 딥러닝' 카테고리의 다른 글

0823 Pandas6 DataFeame의 merge  (0) 2021.08.23
0820 Pandas5 DataFrame function  (0) 2021.08.20
0819 Pandas 3 DataFrame row  (0) 2021.08.19
0819 Pandas 2 DataFrame column  (0) 2021.08.19
0818 Pandas 1  (0) 2021.08.18

댓글