본문 바로가기
DataFrame

판다스 데이터프레임 (고급기능1)

by 자동매매 2022. 4. 7.

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

 

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

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

wikidocs.net

ch05정리.ipynb
0.22MB

from pandas import DataFrame

data = [
    {"cd": "A060310", "nm": "3S", "open": 2920, "close": 2800},
    {"cd": "A095570", "nm": "AJ네트웍스", "open": 1920, "close": 1900},
    {"cd": "A006840", "nm": "AK홀딩스", "open": 2020, "close": 2010},
    {"cd": "A054620", "nm": "APS홀딩스", "open": 3120, "close": 3200}
]
df = DataFrame(data=data)
df.set_index('cd', inplace=True)

print(df)
                       nm  open  close
cd                          
A060310             3S  2920   2800
A095570  AJ네트웍스  1920   1900
A006840   AK홀딩스  2020   2010
A054620  APS홀딩스  3120   3200

Query : 컬럼단위 값을 기준으로 필터링

df_result = DataFrame객체.query("컬럼조건")

df_result = df.query("open>=3000")
print(df_result)
             nm  open  close
cd                          
A054620  APS홀딩스  3120   3200
df_result = df.query("nm == '3S'")
print(df_result)
         nm  open  close
cd                      
A060310  3S  2920   2800
df_result = df.query("open > close")
print(df_result)
             nm  open  close
cd                          
A060310      3S  2920   2800
A095570  AJ네트웍스  1920   1900
A006840   AK홀딩스  2020   2010
df_result = df.query("['3S', 'AK홀딩스'] in nm") 
# df.query("nm=='3S' | nm=='AK홀딩스'")
print(df_result)
            nm  open  close
cd                         
A060310     3S  2920   2800
A006840  AK홀딩스  2020   2010
# 파이선 변수 참조
name
 = "AJ네트웍스"
df_result = df.query('nm == @name') 
print(df_result)
             nm  open  close
cd                          
A095570  AJ네트웍스  1920   1900

Filter : 인덱스나 컬럼 이름에 대해서 특정 조건으로 필터링

df_result = DataFrame객체.filter(items = [ 항목 ] ,axis =단위 )     # axis = 1(행단위)   기본값

# DataFrame.filter(regex = 정규표현식,axis=단위)

from pandas import DataFrame

data = [
    [1416, 1416, 2994, 1755],
    [6.42, 17.63, 21.09, 13.93],
    [1.10, 1.49, 2.06, 1.88]
]

columns = ["2018/12", "2019/12", "2020/12", "2021/12(E)"]
index = ["DPS", "PER", "PBR"]

df = DataFrame(data=data, index=index, columns=columns)
print(df)
     2018/12  2019/12  2020/12  2021/12(E)
DPS  1416.00  1416.00  2994.00     1755.00
PER     6.42    17.63    21.09       13.93
PBR     1.10     1.49     2.06        1.88
# DataFrame.filter(items = [항목],axis=단위)
df_result = df.filter(items=["2018/12"])
print(df_result)
print(type(df_result))
     2018/12
DPS  1416.00
PER     6.42
PBR     1.10
<class 'pandas.core.frame.DataFrame'>
df_result = df.filter(items=["PER"], axis=0)
print(df_result)
     2018/12  2019/12  2020/12  2021/12(E)
PER     6.42    17.63    21.09       13.93

# DataFrame.filter(regex = 정규표현식,axis=단위)
# 메타문자 
  ^ - 시작문자      ^2020 - 2020으로 시작
  $ - 끝나는 문자   R$ - R로 꿑남
  \d - 숫자          \d{4} - 숫자4개 연속

df_result = df.filter(regex="2020")
print(df_result)
     2020/12
DPS  2994.00
PER    21.09
PBR     2.06
df_result = df.filter(regex="R$", axis=0)
print(df_result)
     2018/12  2019/12  2020/12  2021/12(E)
PER     6.42    17.63    21.09       13.93
PBR     1.10     1.49     2.06        1.88
df_result = df.filter(regex="\d{4}")
print(df_result)
     2018/12  2019/12  2020/12  2021/12(E)
DPS  1416.00  1416.00  2994.00     1755.00
PER     6.42    17.63    21.09       13.93
PBR     1.10     1.49     2.06        1.88
df_result = df.filter(regex="\d{4}/\d{2}$")
print(df_result)
     2018/12  2019/12  2020/12
DPS  1416.00  1416.00  2994.00
PER     6.42    17.63    21.09
PBR     1.10     1.49     2.06

정렬 및 순위

from pandas import DataFrame

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

columns = ["종목코드", "종목명", "현재가"]
df = DataFrame(data=data, columns=columns)
df.set_index("종목코드", inplace=True)
print(df)
          종목명   현재가
종목코드               
037730     3R  1510
036360  3SOFT  1790
005670   ACTS  1185
# df_result = df.sort_values(colum)
# df_result = df.sort_values(by=colum)
# df_result = df.sort_values(by=colum, ascending=True/False)
# df_result = df.sort_values(by=colum, ascending=True/False, inplace=True/False)

df_result = df.sort_values("현재가") # df.sort_values(by="현재가")
print(df_result)
          종목명   현재가
종목코드               
005670   ACTS  1185
037730     3R  1510
036360  3SOFT  1790
df_result = df.sort_values(by="현재가", ascending=False)
print(df_result)
          종목명   현재가
종목코드               
036360  3SOFT  1790
037730     3R  1510
005670   ACTS  1185
df_result = df['현재가'].rank()
print(df_result)
종목코드
037730    2.0
036360    3.0
005670    1.0
Name: 현재가, dtype: float64
df['현재가_순위'] = df['현재가'].rank()
print(df)
          종목명   현재가  현재가_순위
종목코드                       
037730     3R  1510     2.0
036360  3SOFT  1790     3.0
005670   ACTS  1185     1.0

인덱스 연산

# index1.연산함수(index2)  

import pandas as pd

idx1 = pd.Index([1, 2, 3])
idx2 = pd.Index([2, 3, 4])

print(type(idx1))
<class 'pandas.core.indexes.numeric.Int64Index'>
result = idx1.union(idx2)
print(result)
Int64Index([1, 2, 3, 4], dtype='int64')
result = idx1.intersection(idx2)
print(result)
Int64Index([2, 3], dtype='int64')
result = idx1.difference(idx2)
print(result)
Int64Index([1], dtype='int64')

GroupBy

# df.groupby('기준column')                      => group객체 반환
# df.groupby('기준column')[항목].함수

# df.groupby('기준column').get_group(추출항목)

# df.groupby('기준column').agg({항목1:[함수1,함수2],항목2:함수3})

from pandas import DataFrame

data = [
    ["2차전지(생산)", "SK이노베이션", 10.19, 1.29],
    ["해운", "팬오션", 21.23, 0.95],
    ["시스템반도체", "티엘아이", 35.97, 1.12],
    ["해운", "HMM", 21.52, 3.20],
    ["시스템반도체", "아이에이", 37.32, 3.55],
    ["2차전지(생산)", "LG화학", 83.06, 3.75]
]

columns = ["테마", "종목명", "PER", "PBR"]
df = DataFrame(data=data, columns=columns)
print(df)
         테마      종목명    PER   PBR
0  2차전지(생산)  SK이노베이션  10.19  1.29
1        해운      팬오션  21.23  0.95
2    시스템반도체     티엘아이  35.97  1.12
3        해운      HMM  21.52  3.20
4    시스템반도체     아이에이  37.32  3.55
5  2차전지(생산)     LG화학  83.06  3.75
df_result = df.groupby('테마')['PER'].mean()
print(df_result)



print(type(df_result))
테마
2차전지(생산)    46.625
시스템반도체      36.645
해운          21.375
Name: PER, dtype: float64

<class 'pandas.core.series.Series'>
# df.groupby("기준항목").get_group(항목)
df_result = df.groupby("테마").get_group("2차전지(생산)")
print(df_result)
         테마      종목명    PER   PBR
0  2차전지(생산)  SK이노베이션  10.19  1.29
5  2차전지(생산)     LG화학  83.06  3.75
df_result = df[["테마", "PER", "PBR"]].groupby("테마").get_group("2차전지(생산)")
print(df_result)
         테마    PER   PBR
0  2차전지(생산)  10.19  1.29
5  2차전지(생산)  83.06  3.75
# 통계함수 - mean, max, min, sum, np.var(분산), np.std(표준편차)
df_result = df.groupby("테마").agg({"PER": max, "PBR": min})
print(df_result)
            PER   PBR
테마                   
2차전지(생산)  83.06  1.29
시스템반도체    37.32  1.12
해운        21.52  0.95
import numpy as np

df_result = df.groupby("테마").agg({"PER": [min, max], "PBR": [np.std, np.var]})
print(df_result)
            PER              PBR         
            min    max       std      var
테마                                       
2차전지(생산)  10.19  83.06  1.739483  3.02580
시스템반도체    35.97  37.32  1.718269  2.95245
해운        21.23  21.52  1.590990  2.53125
# 날짜문자열을 -> datetime으로 읽기
df = pd.read_excel(r"C:\Users\neo21\PycharmProjects\MyModule\DB\data_5402_20220403.xlsx" , parse_dates=['일자']) # datetimeindex로 읽기

df = df.sort_values('일자')

df = df[['일자','시가','저가','고가','종가']]

how = {'시가':'first','저가':min,'고가':max,'종가':'last'}

#항목 '일자'를 월단위로 그룹화
df1 = df.groupby( pd.Grouper(key='일자' , freq="m") ).agg(how)
print(df1)

붙이기

# pd.concat([df1, df2], axis=0, join=outer)  : 기본값 - 아래방향으로 합치기

옆으로 붙이기 : pd.concat ( [ df1 , df2 ] , axis=1 )

from pandas import DataFrame
import pandas as pd

data = {
    '종가': [113000, 111500],
    '거래량': [555850, 282163]
}

index = ["2019-06-21", "2019-06-20"]
df1 = DataFrame(data=data, index=index)
print(df1)
                종가     거래량
2019-06-21  113000  555850
2019-06-20  111500  282163
data = {
    '시가': [112500, 110000],
    '고가': [115000, 112000],
    '저가': [111500, 109000]
}
df2 = DataFrame(data=data, index=index)
print(df2)
                시가      고가      저가
2019-06-21  112500  115000  111500
2019-06-20  110000  112000  109000
# join파라미터 기본값 : outer  - 합집합 개념
df = pd.concat([df1, df2], axis=1)    
print(df)
                종가     거래량      시가      고가      저가
2019-06-21  113000  555850  112500  115000  111500
2019-06-20  111500  282163  110000  112000  109000
정렬순서 = ['시가', '고가', '저가', '종가', '거래량']
df = df[정렬순서]
print(df)
                시가      고가      저가      종가     거래량
2019-06-21  112500  115000  111500  113000  555850
2019-06-20  110000  112000  109000  111500  282163
data = {
    '종가': [113000, 111500],
    '거래량': [555850, 282163]
}

index = ["2019-06-21", "2019-06-20"]
df1 = DataFrame(data=data, index=index)

data = {
    '시가': [112500, 110000],
    '고가': [115000, 112000],
    '저가': [111500, 109000]
}

index = ["2019-06-20", "2019-06-19"]
df2 = DataFrame(data=data, index=index)

df = pd.concat([df1, df2], axis=1)
print(df)
                  종가       거래량        시가        고가        저가
2019-06-21  113000.0  555850.0       NaN       NaN       NaN
2019-06-20  111500.0  282163.0  112500.0  115000.0  111500.0
2019-06-19       NaN       NaN  110000.0  112000.0  109000.0
#DataFrame
samsung = krx.ohlcv("005930","20200101")
kospi = krx.kospi지수("2020")
#Series
수익률_kospi  = kospi['종가']/kospi['종가'][0]
수익률_samsung  = samsung['종가']/samsung['종가'][0]
#두개의 Series 붙이기
df = pd.concat([수익률_kospi,수익률_samsung],axis=1,keys=['kospi','samsung'])
   

 

'DataFrame' 카테고리의 다른 글

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

댓글