출처 : 금융 데이터 분석을 위한 파이썬 판다스
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 |
댓글