"Pandas"의 두 판 사이의 차이

(새 문서: ==개요== Series라는 1차원 자료구조와 DataFrame이라는 2차원 자료구조를 이용해 데이터를 다룬다. 금융데이터 분석을 목적으로 개발됨. panel d...)
 
 
(같은 사용자의 중간 판 2개는 보이지 않습니다)
1번째 줄: 1번째 줄:
 
==개요==
 
==개요==
 +
판다스. 금융데이터 분석을 목적으로 개발됨. panel data와 python data analysis에서 유래했다. 별칭은 pd.
 +
 +
C언어로 작성되어 처리속도가 빠르다.
 +
 
Series라는 1차원 자료구조와 DataFrame이라는 2차원 자료구조를 이용해 데이터를 다룬다.
 
Series라는 1차원 자료구조와 DataFrame이라는 2차원 자료구조를 이용해 데이터를 다룬다.
  
금융데이터 분석을 목적으로 개발됨. panel data와 python data analysis에서 유래했다.
+
내용이 상당히 방대해 세분해야 할 듯하다;;
  
내용이 상당히 방대해 세분해야 할 듯하다;;<br />
+
공식 메뉴얼 : http://pandas.pydata.org/pandas-docs/stable/
  
 
=시리즈. Series=
 
=시리즈. Series=
54번째 줄: 58번째 줄:
 
|df = pandas.DataFrame({'행이름': 시리즈, '행이름2': 다른df['행이름']})
 
|df = pandas.DataFrame({'행이름': 시리즈, '행이름2': 다른df['행이름']})
 
|}<br />
 
|}<br />
=데이터프레임. DataFrame.=
 
2차원 구조의 데이터를 다루기 위한 도구.
 
  
===선언 및 데이터 추가===
+
<br />
{| class="wikitable"
 
!의도
 
!방법
 
|-
 
|선언
 
|가장 쉬운 방법은 사전을 이용한 선언.<syntaxhighlight lang="python">
 
데이터프레임 = DataFrame({'열이름1':[1,2,3,4,5]
 
                '열이름2':[6,7,8,9,10]
 
                '열이름3':[10,9,8,7,6]
 
            index = 리스트 })
 
</syntaxhighlight>각자의 열은 시리즈 객체로 존재한다. index옵션은 없어도 된다.
 
|-
 
|칼럼 순서 바꾸기
 
|<syntaxhighlight lang="python">
 
데이터프레임2 = DataFrame(데이터프레임1, columns=[열이름1, 열이름2, ...])
 
</syntaxhighlight>
 
|-
 
|열 추가
 
|데이터프레임.insert(추가될 위치, "열이름", 붙일데이터)
 
 
 
보통 가장 뒤에 붙여 추가될 위치에 len(데이터프레임.columns)를 넣는다.
 
|-
 
|행 추가(리스트로)
 
|열 갯수와 동일한 리스트를 행에 붙인다.
 
데이터프레임.loc["새로운인덱스"]=['값1', '값2', ...]
 
 
 
보통, 가장 뒤에 붙이기 위해 len(데이터프레임.index)을 넣는다.
 
|-
 
|행 추가(사전으로)
 
|열 이름과 매칭시킨 사전을 붙인다.
 
데이터프레임.loc["새로운인덱스"]={"열이름1":'값1', '열이름2':'값2', ...}
 
|}
 
 
 
===열 조작===
 
{| class="wikitable"
 
!의도
 
!방법
 
!설명
 
|-
 
|열 리스트 얻기
 
|df.columns
 
|어떤 칼럼이 있는지 알려준다.
 
|-
 
|열 이름 바꾸기
 
|데이터프레임.rename(columns={'구이름':'신이름', '구이름2':'신이름2'}, inplace=True)
 
|inplace=True 이 옵션이 뭔진 모르겠네;; 없어도 잘 되긴 한다.
 
|-
 
|열 순서 바꾸기 및 추출
 
|df<nowiki>[['열이름1', '열이름2']]</nowiki>
 
|열이름에 해당하는 순서로 해당 열들만 추출된다.
 
|-
 
|열 제거
 
|df = df.drop(columns='열이름')
 
|
 
|-
 
|열 붙이기
 
|df['새로운 칼럼'] = 칼럼
 
|행의 크기가 같은 칼럼을 붙일 수 있다.
 
|-
 
|새로운 칼럼 만들기
 
|df['새 칼럼'] = df['열이름'].rank()
 
|크기가 같은 칼럼을 만든 후 덧붙일 수 있다.
 
|-
 
|같은 인덱스를 사용하는 데이터의 열 추가.
 
|df = pd.merge(df1, df2, how='옵션', left_index=True, right_index=True)
 
|
 
{| class="wikitable"
 
!옵션
 
!의미
 
|-
 
|how
 
|inner : 양쪽에 모두 있는 인덱스만 합친다.
 
outer : 한쪽에만 있는 인덱스라도 합친다
 
|-
 
|left_index = True
 
|좌측의 인덱스 기준으로 합친다.
 
|-
 
|right_index = True
 
|우측 기준. 거의 양쪽 다 True 옵션을 준다.
 
|}
 
|-
 
|이중칼럼 만들기
 
|columns = [['1열이름']*len(df), df.columns]
 
|columns 명령에 리스트 하나면 속성(칼럼) 한 줄이 되지만, 여기에 2차원리스트를 넣으면 2중, 3중 속성을 만들 수 있다.
 
|-
 
|이중칼럼 접근
 
|df[('상위칼럼','하위칼럼')]
 
|
 
|}
 
 
 
===인덱스 조작===
 
{| class="wikitable"
 
!의도
 
!방법
 
!설명
 
|-
 
|인덱스를 데이터화
 
|데이터프레임.reset_index
 
|숫자 인덱스가 아닌 경우 사용. 인덱스 목록을 뽑아낼 때의 사전작업.
 
(엑셀에서 불러왔을 때 필요하다.)
 
|-
 
|인덱스리스트 얻기
 
|list(데이터프레임['''<nowiki/>'인덱스열이름''''])
 
데이터프레임.index
 
|위에서 얻은 인덱스 열이름을 기입해 넣거나('''<nowiki/>'Unnamed: 0'),'''
 
바로 인덱스를 불러오기.(둘 다 시도해 볼 것.)
 
|-
 
|인덱스 이름 바꾸기
 
|데이터프레임.rename(columns={'index':'신이름'})
 
|
 
|-
 
|데이터 크기 살피기
 
|len(df.index)
 
|
 
|-
 
|인덱스 이어붙이기(행 합치기)
 
|df = pd.concat([df1, df2, df3,...])
 
|이렇게 쓰면 인덱스들을 이어붙인다.
 
|}
 
 
 
===데이터 접근===
 
{| class="wikitable"
 
!의도
 
!방법
 
!설명
 
|-
 
|칼럼 접근
 
|데이터프레임["열이름"]
 
|
 
|-
 
|행접근
 
|데이터프레임.loc["인덱스"]
 
|데이터프레임.index['인덱스']형태로 접근도 가능하다.
 
loc을 쓰지 않으면 하위속성(칼럼)에서 해당 속성을 찾는다.(열 선택)
 
|-
 
|행접근(정수인덱스)
 
|df.iloc[정수]
 
|순서에 따른 정수인덱스를 사용할 수 있다.
 
|-
 
|칼럼목록
 
|데이터프레임.columns
 
칼럼목록을 얻는다.
 
|
 
|-
 
|행목록
 
|데이터프레임.index
 
인덱스 목록을 얻는다.
 
|
 
|-
 
|특정 데이터 접근
 
|데이터프레임['열이름'][숫자]
 
|열 이름의 '숫자'번째 요소에 접근한다.
 
한 줄일지라도 시리즈 형태로 반환한다.
 
 
 
그 시리즈에서 하위 속성에 접근하는 방식이다.
 
|-
 
|특정 데이터 접근2
 
|df['열이름']['찾을내용']
 
|열을 찾은 후 해당 내용을 찾는다.
 
|-
 
|특정 데이터 접근3
 
|df.loc['행이름']['열이름']
 
|행을 찾고 열을 찾는다.
 
|-
 
|상위 5개 데이터 확인
 
|데이터프레임.head()
 
|
 
|-
 
|조건 인덱싱1
 
|[데이터프레임['열이름'] > 숫자]
 
|숫자 이상의 값을 가진 값만 추출한다.
 
이외 == 등의 조건으로 인덱스를 추출할 수 있다.
 
 
 
인덱스가 조건을 통과했는지 여부를 True, False로 보여준다.
 
 
 
 
 
df['열이름']>100 을 하면 이에 해당되는 인덱스를 뱉어낸다. 때문에 df[df['열이름']>100] 형태로 해당하는 데이터를 뽑아낼 수 있다.
 
|-
 
|조건 인덱싱2
 
|데이터프레임 = 데이터프레임[데이터프레임['열이름']
 
|조건에 맞는 행만 살린다.
 
|-
 
|
 
|
 
|
 
|}
 
 
 
===전체 틀 조작===
 
{| class="wikitable"
 
!의도
 
!방법
 
!설명
 
|-
 
|데이터프레임 정렬
 
|데이터프레임.sort_values(by = '열이름', ascending = True)
 
|ascending 옵션이 True면 오름차순
 
|}
 
===데이터 조작===
 
{| class="wikitable"
 
!의도
 
!설명
 
!예시
 
|-
 
|데이터 정렬
 
|ascending = False를 추가하면 내림차순으로 정렬한다.
 
|df = df.sort_values(by='열이름')
 
|-
 
|필터링
 
|
 
|
 
|-
 
|행간 연산
 
|.shift(n) n에 해당하는 만큼 데이터를 밀어낸다.
 
|df['열'] - df['열'].shift(1) 형식으로 해당 열의 전 값과 연산할 수 있다.
 
|-
 
|과거 데이터의 평균
 
|적용할 함수로 숫자만큼의 과거데이터를 연산하여 만든다.
 
데이터프레임['열이름'].rolling(window=숫자).함수명()
 
 
 
이후 열 추가 등의 처리를 해준다.
 
 
 
여러 데이터의 평균을 구하거나 최대, 최솟값 찾기에 사용한다.
 
|df2= df['열이름'].rolling(window=5).mean()
 
|-
 
|전치
 
|df.T
 
|행과 열을 바꾼다.
 
|-
 
|
 
|
 
|
 
|}<br />
 
===데이터 검색===
 
{| class="wikitable"
 
!의도
 
!방법
 
!설명
 
|-
 
|인덱스 찾기
 
|df[행이름 == 값]
 
|해당 검색결과에 해당하는 인덱스를 구할 수 있다.
 
df.열이름/ df.열이름['인덱스'] 형태의 연산도 가능하다.
 
|}
 
===행 순회===
 
<syntaxhighlight lang="python">
 
for ntp in df.itertuples():
 
    ntp.속성명 + ntp.속성명2
 
</syntaxhighlight>튜플화 하여 속성명으로 데이터에 접근해 연산이 가능하다.
 
 
 
===데이터 형식===
 
[다양한 형식이 있을 텐데.. 찾아 조금 채워보자.]
 
{| class="wikitable"
 
!의도
 
!방법
 
!설명
 
|-
 
|시계열 데이터로
 
|df.index = pd.to_datetime(df.index)
 
|20200322와 같은 숫자는 그냥 문자열로 취급된다. 이를 시계열로 인식되게 하려면 데이터 변환을 해주어야 한다.
 
|-
 
|숫자형데이터
 
|df['열이름'] = pd.to_numeric(df['열이름'])
 
|해당 데이터가 숫자임을 알려주는 것.
 
|}<br />
 
 
 
=자료 읽어오기=
 
 
 
==엑셀과 연동==
 
2차원 데이터를 다루는 가장 쉬운 방법은 엑셀을 이용하는 것. 저장하고 시각화 하는 데 엑셀을 이용한다면 굉장히 편리할 것이다.
 
 
 
엑셀 관련기능을 사용하려면 관련 라이브러리를 설치해야 한다.
 
{| class="wikitable"
 
!의도
 
!방법
 
!설명
 
|-
 
|파일 불러오기
 
|객체 = pandas.read_excel('''<nowiki/>'<nowiki/>'''c:\\경로.xlsx'''<nowiki/>'''')
 
객체 = pandas.read_csv('''<nowiki/>''''c:\\경로.csv')
 
|pip install xlrd 따위의 라이브러리 설치가 선행되어야 한다.
 
저장했던 엑셀파일을 불러오면 저장한 df 그대로 사용되는 게 아니라, 엑셀의 제한된 기능에 따라 변형되기 때문에 칼럼을 다시 만져주어야 제대로 사용할 수 있다. 기본적으로 맨 윗줄을 칼럼 처리한다.(상관없으면 그냥 쓰고;)
 
 
 
때문에 df['열이름'] = pd.to_numeric(df['열이름']) 형태로 데이터형을 다시 통일, 설정해주어야 한다.
 
 
 
 
 
인덱스 지정은 따로 하지 않는다. 'index_col=숫자' 옵션으로 인덱스를 지정할 수도 있다.
 
 
 
Sheet_name='시트명' 옵션으로 해당 시트를 열 수도 있다.
 
|-
 
|파일 저장하기
 
|객체.to_excel('''<nowiki/>'<nowiki/>'''c:\\경로.xlsx'''<nowiki/>'''')
 
객체.to_csv('''<nowiki/>'<nowiki/>'''c:\\경로.csv'''<nowiki/>'''')
 
|pip install openpyxl 따위의 라이브러리 설치가 선행되어야 한다.
 
|}
 
 
 
==html 표 불러오기==
 
{| class="wikitable"
 
!의도
 
!방법
 
!설명
 
|-
 
|데이터 불러오기
 
|객체 = pandas.read_html('''h<nowiki/>t<nowiki/>ml 문서''')'''<nowiki/>'''
 
|'''<nowiki/>'''html 문서의 데이터타입은 str이어야 한다. requests 등으로 웹문서를 불러와 변환해 넣으면 된다.
 
|}표형 데이터는 쉽게 가져올 수 있다.<syntaxhighlight lang="python">
 
page = requests.get(url)
 
tables = pd.read_html(page.text)
 
</syntaxhighlight>  [굳이 .text 속성에 접근해야 하네;;? 그냥 객체와 text속성은 어떻게 다른지 보자.]
 
 
 
여러 테이블이 있는 경우, 데이터프레임이 들어있는 리스트로 반환된다.<br />
 
  
 
==결측치 처리==
 
==결측치 처리==
411번째 줄: 103번째 줄:
 
|}
 
|}
 
<br />
 
<br />
 +
[[분류:Pandas]]

2021년 4월 29일 (목) 07:50 기준 최신판

1 개요편집

판다스. 금융데이터 분석을 목적으로 개발됨. panel data와 python data analysis에서 유래했다. 별칭은 pd.

C언어로 작성되어 처리속도가 빠르다.

Series라는 1차원 자료구조와 DataFrame이라는 2차원 자료구조를 이용해 데이터를 다룬다.

내용이 상당히 방대해 세분해야 할 듯하다;;

공식 메뉴얼 : http://pandas.pydata.org/pandas-docs/stable/

2 시리즈. Series편집

리스트와 달리, 인덱싱 값을 지정할 수 있다.

from pandas import Series

의도 방법
선언 시리즈명 = Series([1,2,3,4,5], index=[1,2,3,4,5])
자료접근 시리즈명[인덱스]
인덱스 리스트 얻기 시리즈명.index
자료 리스트 얻기 시리즈명.values

2.1 연산편집

시리즈끼리 더하면 같은 인덱스를 가진 값들끼리 더해진다.

2.2 데이터 추가.편집

시리즈[인덱스]=값 혹은 시리즈=시리즈.append(더할시리즈) 형태로 추가 가능.

2.3 값에 접근하기.편집

시리즈.loc[인덱스] 는 해당 인덱스의 데이터를 가리킨다.

시리즈.iloc[정수인덱스] sms 0, 1, -1 따위의 정수 순서에 해당하는 값을 불러온다.

인덱스가 복수일 땐 시리즈로 반환한다.

시리즈.values[정수인덱스] 복수일 땐 배열로 반환한다.

2.4 삭제.편집

시리즈=시리즈.drop(인덱스)

의도 설명 방법
시리즈 합치기 df = pandas.DataFrame({'행이름': 시리즈, '행이름2': 다른df['행이름']}) 형태로 합치면 해당 인덱스에 대해 빈 값은 NaN으로 처리되어 합쳐진다. df = pandas.DataFrame({'행이름': 시리즈, '행이름2': 다른df['행이름']})



2.5 결측치 처리편집

NaN 처리.

fillna() 함수를 사용한다.

df = df.fillna(method='옵션')

옵션 설명
bfill(backward) 뒤에 있는 값으로 NaN을 덮어쓴다. 마지막 데이터가 NaN이라면 처리 불가
ffill(foreward) 앞의 있는 값으로 덮어쓴다. 처음 데이터가 NaN이면 처리 불가.

따라서 위의 옵션을 둘 다 써서 빈틈이 없게 만드는 게 일반적.


dropna() 함수로 NaN이 있는 행을 제거하는 방법도 있다.

2.6 이외 활용편집

의도 방법 설명
순위 얻기 내장함수인 .rank()를 사용한다.

ascending=False 옵션을 줄 수 있다.

df['열이름'].rank()
df.pct_change()  # 일간 변동률?? 뭐하는 거지?