본문 바로가기
DataFrame

판다스 데이터프레임

by 자동매매 2022. 4. 7.

출처 : 금융 데이터 분석을 위한 파이썬 판다스

 

 

금융 데이터 분석을 위한 파이썬 판다스

최근 인공지능 AI(Artificial Intelligence)이 보급화되면서 방대한 양의 데이터를 처리하는 방식이 중요해지기 시작했습니다. 판다스(Pandas)는 오픈 소 ...

wikidocs.net

df = DataFrame ( data, [ index, columns, dtype ] )

1) DataFrame( [ L1,L2,L3 ] ) : 리스트로 데이터프레임 생성

     #### L1,L2,L3 행단위 인식

data = [ ["037730", "3R", 1510], ["036360", "3SOFT", 1790], ["005760", "ACTS", 1185] ]

df = DataFrame(data=data)

        0      1     2
0  037730     3R  1510
1  036360  3SOFT  1790
2  005760   ACTS  1185

2) DataFrame(Dictionary) : 딕셔너리로 데이터프레임 생성

     ### keys -> columns

data = { '종목코드': ['037730', '036360', '005760'], '종목명': ['3R', '3SOFT', 'ACTS'], '현재가': [1510, 1790, 1185] }

df = DataFrame(data)

     종목코드    종목명   현재가
0  037730     3R  1510
1  036360  3SOFT  1790
2  005760   ACTS  1185

3) DataFrame( [ D1,D2,D3 ] ) : 리스트와 딕셔너리로 데이터프레임 생성

     ### keys -> columns

data = [ {"종목코드": "037730", "종목명": "3R", "현재가": 1510}, {"종목코드": "036360", "종목명": "3SOFT", "현재가": 1790}, {"종목코드": "005760", "종목명": "ACTS", "현재가": 1185} ]

df = DataFrame(data)

     종목코드    종목명   현재가
0  037730     3R  1510
1  036360  3SOFT  1790
2  005760   ACTS  1185

4) DataFrame( ndarray ) : ndarray로 데이터프레임 생성

df = DataFrame(ndarray)

 

from pandas import DataFrame


data = [
    ["037730", "3R", 1510, 7.36],
    ["036360", "3SOFT", 1790, 1.65],
    ["005670", "ACTS", 1185, 1.28]
]

columns = ["종목코드", "종목명", "현재가", "등락률"]
df = DataFrame(data=data, columns=columns)
print(df)
     종목코드    종목명   현재가   등락률
0  037730     3R  1510  7.36
1  036360  3SOFT  1790  1.65
2  005670   ACTS  1185  1.28
df1 = df.set_index("종목코드")   # 원본 df는 변경이 안됨
print(df1)
          종목명   현재가   등락률
종목코드                     
037730     3R  1510  7.36
036360  3SOFT  1790  1.65
005670   ACTS  1185  1.28
#inplace=True : 원본 데이터프레임 변경 저장
df.set_index("종목코드", inplace=True) 
print(df.index.name)    # 종목코드
print(df)
위와 동일
from pandas import DataFrame

data = [
    ["3R", 1510, 7.36],
    ["3SOFT", 1790, 1.65],
    ["ACTS", 1185, 1.28]
]

index = ["037730", "036360", "005760"]
columns = ["종목명", "현재가", "등락률"]
df = DataFrame(data=data, index=index, columns=columns)
df.index.name = "code"
df.columns.name = '구분'
print(df)
구분        종목명   현재가   등락률
code                     
037730     3R  1510  7.36
036360  3SOFT  1790  1.65
005760   ACTS  1185  1.28
print(df.index)       #   Index(['037730', '036360', '005760'], dtype='object', name='code')
print(df.columns)   # Index(['종목명', '현재가', '등락률']dtype='object'name='구분')

데이터프레임 인덱싱/슬라이싱

컬럼 인덱싱/슬라이싱

from pandas import DataFrame

data = [
    ["3R", 1510, 7.36],
    ["3SOFT", 1790, 1.65],
    ["ACTS", 1185, 1.28]
]

index = ["037730", "036360", "005760"]
columns = ["종목명", "현재가", "등락률"]
df = DataFrame(data=data, index=index, columns=columns)
print(df)
          종목명   현재가   등락률
037730     3R  1510  7.36
036360  3SOFT  1790  1.65
005760   ACTS  1185  1.28
s = df['현재가']
print(s.index)    # Index(['037730', '036360', '005760'], dtype='object')
print(s.values)   # [1510 1790 1185]
print(type(s))    # <class 'pandas.core.series.series'="">
 
리스트 = ["현재가", "등락률"]
d = df[리스트]
print(type(d))    # <class 'pandas.core.frame.dataframe'>
print(d)
         현재가   등락률
037730  1510  7.36
036360  1790  1.65
005760  1185  1.28

로우 인덱싱/슬라이싱

d = df.loc["037730"]
print(type(d))           # <class 'pandas.core.series.Series'>
dd =df.iloc[[0, 1]]
종목명      3R
현재가    1510
등락률    7.36
Name: 037730, dtype: object
dd =df.iloc[[0, 1]]
print(type(dd))     # <class 'pandas.core.frame.DataFrame'>
print(dd)
          종목명   현재가   등락률
037730     3R  1510  7.36
036360  3SOFT  1790  1.65
print(df.iloc[0])





print(df.iloc[-1])
종목명      3R
현재가    1510
등락률    7.36
Name: 037730, dtype: object

종목명    ACTS
현재가    1185
등락률    1.28
Name: 005760, dtype: object

특정 값 가져오기       :  1510 ( 0행1열 값 )

print(df.iloc[0].iloc[1])              
print(df.iloc[0].loc["현재가"])        

print(df.loc["037730"].iloc[1])        
print(df.loc["037730"].loc["현재가"])  

print(df.iloc[0,1])  
print(df.loc["037730", "현재가"])

print(df.iloc[0][1])                   
print(df.iloc[0]["현재가"])  
print(df.loc["037730"][1]) 
print(df.loc["037730"]["현재가"]) 
print(df['현재가'].iloc[0])
print(df['현재가'].loc["037730"])
print(df['현재가']["037730"])
print(df['현재가'][0])

특정 범위 가져오기

print(df.loc[["037730", "036360"]])
print(df.iloc[[0, 1]])
          종목명   현재가   등락률
037730     3R  1510  7.36
036360  3SOFT  1790  1.65
df11 = df.loc[["037730", "036360"], ["종목명", "현재가"]]
print(df11)
          종목명   현재가
037730     3R  1510
036360  3SOFT  1790
df12 = df.iloc[ [0, 1], [0, 1] ]
print(df12)
          종목명   현재가
037730     3R  1510
036360  3SOFT  1790

데이터프레임 필터링

cond = df['현재가'] >= 1400
print(cond)
037730     True
036360     True
005760    False
Name: 현재가, dtype: bool
df22=df.loc[cond]     # df22 = df[cond]  가능
print(df22)
          종목명   현재가   등락률
037730     3R  1510  7.36
036360  3SOFT  1790  1.65
df23 = df.loc[cond]["현재가"]   
# df23 = df.loc[cond, "현재가"]
# df23 = df[cond]["현재가"]
print(df23)
037730    1510
036360    1790
Name: 현재가, dtype: int64
cond = (df['현재가'] >= 1400) & (df['현재가'] < 1700)
df24 = df.loc[cond]
print(df24)
       종목명   현재가   등락률
037730  3R  1510  7.36

Columns, Row 추가 / 변경 / 삭제

컬럼 추가하기 : Series를 추가   # 주의 : index

from pandas import Series

s = Series(data=[1600, 1600, 1600], index=df.index)
df['목표가'] = s

print(df)
          종목명   현재가   등락률   목표가
037730     3R  1510  7.36  1600
036360  3SOFT  1790  1.65  1600
005760   ACTS  1185  1.28  1600
df["괴리율"] = (df["목표가"] - df["현재가"]) / df['현재가']
print(df)
          종목명   현재가   등락률   목표가       괴리율
037730     3R  1510  7.36  1600  0.059603
036360  3SOFT  1790  1.65  1600 -0.106145
005760   ACTS  1185  1.28  1600  0.350211

로우 추가하기 : Series를 추가   # 주의 : index

data=["LG전자", 60000, 3.84,70000,0.166667]
idx=df.columns
s = Series(data=data, index=idx)
df.loc["066570"] = s       # df.iloc[2] = s   도 가능
print(df)
          종목명    현재가   등락률    목표가       괴리율
037730     3R   1510  7.36   1600  0.059603
036360  3SOFT   1790  1.65   1600 -0.106145
005760   ACTS   1185  1.28   1600  0.350211
066570   LG전자  60000  3.84  70000  0.166667

컬럼/로우 삭제하기 ( 원Frame은 미변경됨 )

DataFrame객체.drop(항목, axis=방향)      # axis = 0 기본값 (row 삭제)

from pandas import DataFrame

data = [
    ["3R", 1510, 7.36],
    ["3SOFT", 1790, 1.65],
    ["ACTS", 1185, 1.28]
]

index = ["037730", "036360", "005760"]
columns = ["종목명", "현재가", "등락률"]
df = DataFrame(data=data, index=index, columns=columns)

new_df = df.drop("현재가", axis=1)   # 방향에 주의
print(df)
print(new_df)
          종목명   현재가   등락률
037730     3R  1510  7.36
036360  3SOFT  1790  1.65
005760   ACTS  1185  1.28



          종목명   등락률
037730     3R  7.36
036360  3SOFT  1.65
005760   ACTS  1.28

컬럼 레이블 변경

df.columns = ['name', 'close', 'fluctuation']
df.index = ['aa','bb','cc']
df.index.name = 'code'
df.columns.name = 'gubun'
print(df)
gubun   name  close  fluctuation
code                            
aa        3R   1510         7.36
bb     3SOFT   1790         1.65
cc      ACTS   1185         1.28
# inplace 미지정시 원본Frame 미변경됨
col={'name':'종목명', 'close':'현재가', 'fluctuation':'등락률'}
df.rename(columns=col, inplace=True)
df.index = ["037730", "036360", "005760"]
df.index.name = '종목코드'
df.columns.name = '구분'
print(df)
구분        종목명   현재가   등락률
종목코드                     
037730     3R  1510  7.36
036360  3SOFT  1790  1.65
005760   ACTS  1185  1.28
## index 목록도 변경 가능
L1 = {"037730":0, "036360":1,"005760":2}
df.rename(index=L1,inplace=True)
print(df)
     종목명   현재가   등락률
0     3R  1510  7.36
1  3SOFT  1790  1.65
2   ACTS  1185  1.28

로우 순서 변경

from pandas import DataFrame

data = [
    ["3R", 1510, 7.36],
    ["3SOFT", 1790, 1.65],
    ["ACTS", 1185, 1.28]
]

index = ["037730", "036360", "005760"]
columns = ["종목명", "현재가", "등락률"]
df = DataFrame(data=data, index=index, columns=columns)
          종목명   현재가   등락률
037730     3R  1510  7.36
036360  3SOFT  1790  1.65
005760   ACTS  1185  1.28
# 원Frame 미변경됨
L=["037730", "005760","036360","001100"]
df1 = df.reindex(L, fill_value=0)
print(df1)
          종목명   현재가   등락률
037730     3R  1510  7.36
005760   ACTS  1185  1.28
036360  3SOFT  1790  1.65
001100      0     0  0.00
# index기준 정렬
df2 = df.sort_index()    # 문자index도 정렬 가능
print(df2)
          종목명   현재가   등락률
005760   ACTS  1185  1.28
036360  3SOFT  1790  1.65
037730     3R  1510  7.36

데이터 타입 변경

df.applymap(연결함수)

from pandas import DataFrame

data = [
    ["1,000", "1,100", '1,510'],
    ["1,410", "1,420", '1,790'],
    ["850", "900", '1,185'],
]
columns = ["03/02", "03/03", "03/04"]
df = DataFrame(data=data, columns=columns)
print(df)
   03/02  03/03  03/04
0  1,000  1,100  1,510
1  1,410  1,420  1,790
2    850    900  1,185
def remove_comma(x):
    return int(x.replace(',', ''))
 
for i in range(len(df.index)):
    df.iloc[i] = df.iloc[i].map(remove_comma)
print(df)
  03/02 03/03 03/04
0  1000  1100  1510
1  1410  1420  1790
2   850   900  1185
df = df.applymap(remove_comma)
print(df)
위와 동일
df["03/03"] = df["03/03"].map(remove_comma)
print(df)
   03/02  03/03  03/04
0  1,000   1100  1,510
1  1,410   1420  1,790
2    850    900  1,185

컬럼 문자열 다루기

from pandas import DataFrame

data = [
    {"cd":"A060310", "nm":"3S", "close":"2,920"},
    {"cd":"A095570", "nm":"AJ네트웍스", "close":"6,250"},
    {"cd":"A006840", "nm":"AK홀딩스", "close":"29,700"},
    {"cd":"A054620", "nm":"APS홀딩스", "close":"19,400"}
]
df = DataFrame(data=data)
print(df)
        cd               nm    close
0  A060310             3S   2,920
1  A095570  AJ네트웍스   6,250
2  A006840   AK홀딩스  29,700
3  A054620  APS홀딩스  19,400
df['cd'] = df['cd'].str[1:]
print(df)
       cd               nm   close
0  060310             3S   2,920
1  095570  AJ네트웍스   6,250
2  006840   AK홀딩스  29,700
3  054620  APS홀딩스  19,400
df['close'] = df['close'].str.replace(',', '')
print(df)
       cd               nm  close
0  060310             3S   2920
1  095570  AJ네트웍스   6250
2  006840   AK홀딩스  29700
3  054620  APS홀딩스  19400

ch04정리.ipynb
0.06MB

'DataFrame' 카테고리의 다른 글

판다스 데이터프레임 (데이터 읽기/ 저장하기)  (0) 2022.04.07
판다스 데이터프레임 (고급기능2)  (0) 2022.04.07
판다스 데이터프레임 (고급기능1)  (0) 2022.04.07
Series  (0) 2022.04.07
ndarry  (0) 2022.04.07

댓글