Python for Data Analysis
by Wess McKinney
Ch 1~Ch3
구조화된 데이터 ⓐ 각 컬럼의 형식이 문자열, 숫자, 날짜 등으로 서로 다른 표 혹은 스프레드시트와 비슷한 데이터 ⓑ 다차원 배열(행렬) ⓒ SQL 에서 기본키나 외래키 같은 키 컬럼에 의해 서로 연관되는 여러가지 표 ⓓ 일정하거나 일정하지 않은 간격의 시계열
라이브러리 NumPy : 다차원 배열 객체, 선형대수, 푸리에 변환, 난수 생성 pandas : 시계열(비시계열 데이터 통합), 메타데이터 보존하는 산술 연산과 축약 연산 matplotlib : 그래프, 2차원 데이터 시각화 Scipy : 과학 계산 컴퓨팅 영역, 미적분, 선형 scikit-learn : 분류, 회귀, 클러스터링, 차원 축소, 모델 선택, 전처리 statsmodels : 회귀 모델, 분산 분석, 시계열 분석, 비모수 기법, 통계 모델 시각화
파이썬 특징1. 객체 모델의 일관성. 파이썬 객체 : 숫자, 문자열, 자료구조, 함수, 클래스, 모듈 함수는 괄호와 0개 이상의 인자를 전달해서 호출할 수 있으며, 반환되는 값은 선택적으로 변수에 대입할 수 있다. 파이썬의 거의 모든 객체는 함수를 포함하고 있는데 이를 메서드. 객체의 내부 데이터에 접근할 수 있다. 변수에 값을 할당하는 것은 이름을 객체에 연결하는 것이므로 바인딩이라고 부른다. 값이 할당된 변수 이름을 때때로 바운드 변수라고 부르기도 한다.
isinstance() : 튜플을 넘겨서 객체의 자료형이 주어진 튜플 중 하나인지 검사할 수 있다.
ex) a=4.5
isistance(a,(int,float))
>>true
속성 : 객체 내부에 저장되는 다른 파이썬 객체 메서드 : 객체의 내부 데이터에 접근할 수 있는 함수 속성과 메서드는 getattr 함수를 통해 이름으로 접근 가능 ex) getattr(a,'split') <-> <function str.split> hasattr : setattr :
여러 개의 입력을 처리해야 하는 함수 작성할 때 유용한 함수
def isiterable(obj) : try : iter(obj) return True except TypeError : #iterable 객체 아님 return False
-iterable 함수는 isinstance 처럼 파이썬에 포함된 함수가 아니니까 만들어야 한다. -iterable 가능한 함수인지 확인
리스트, 튜플, ndarray 처럼 순차적인 자료구조를 다루는 함수를 작성할 때 주로 사용. 먼저 객체가 리스트(또는 NumPy 배열)인지 검사해서 그렇지 않을 경우 인자를 변환해 줄 수 있다.
이항 연산자와 비교문
a=[1,2,3]
c=list(a)
a is not c
>> True
a==c
>>Truel
list는 항상 새로운 파이썬 리스트를 생성하므로 c는 a와 구별 된다는 점을 명심하자. is로 비교하는 것과 ==연산자로 비교하는 것은 같지 다.
'단일 값'을 받는 자료형을 스칼라 타입이라 한다. ex) None, str, bytes, float, bool, int
timeline에서 시간에 대해 사칙연산 할 수 있는 함수 timedelta ( ) : 초, 시간, 일, 주 relativedelta ( ) : 달, 년
for 문 : 리스트나 튜플 같은 컬렉션이나 이터레이터를 순회한다 for value in collection : #value를 이용하는 코드 range : 연속된 정수를 넘겨주는 이터레이터를 반환. (그러므로 for문과 자주 사용) range(start, end, step) while 문: 조건을 명시하여 해당 조건이 False 또는 break 문을 사용해서 반복문을 끝낸다.
튜플
- 튜플에 저장된 객체 자체는 변경이 가능하지만, 한번 생성되면 각 슬롯에 저장된 객체를 변경하는 것은 불가능하다. 자주 헷갈리는 개념이니 다시 한번 상기
- 튜플 연산(+, * ) 가능
tup =tupple (['foo',[1,2],True]) tup[2] = False >> Type Error
*rest : 튜플에서 값 분리하기를 이용한 문법 함수의 시그니처에서 길이를 알 수 없는 긴 인자를 담기 위한 방법 ( ' * ' 가 중요하며, rest가 아닌 다른 변수명을 써도 가능)
values = 1, 2, 3, 4, 5
a,b, *rest = values
a,b
>(1,2)
rest
>(3,4,5)
리스트
- 객체의 1차원 순차 자료형이며 많은 함수에서 교차적으로 사용 가능
- 이터레어나 제너레이터 표현에서 실제 값을 모두 담기 위한 용도
ex) gen=range(10)
gen
>range(10)
list(gen)
[0,1,2,3,4,5,6,7,8,9]
- 추가 (append, insert), 삭제 (pop, remove) , 값 확인 (in/not in), 이어붙이기 (extend)
insert는 append에 비해 연산 비용이 많이 든다. 순차 자료형의 시작과 끝에 원소를 추가하고
싶으면 collections.deque 함수를 사용하면 더 빨리 처리할 수 있다
*bisect.bisect : 메서드는 값이 추가될 때 이진 탐색과 정렬 리스트 유지할 수 있는 위치를 반환하며, bisect.insort는 실제로 정렬된 상태를 유지한 채 값을 추가한다
#bisect(이진 탐색)은 int 뿐만 아니라 str(영어, 한글은 테스트 안해봄)도 가능하다.
import bisect
c=[1,2,2,2,3,4,7]
bisect.bisect(c,2)
>> 4 # 객체 2가 끝나는 인덱스는 [3]. 찾는 객체가 끝나는 인덱스를 반환하는 듯 하다.
bisect.bisect(c,5)
>> 6 #객체 5는 없지만 순차적으로 정렬하면 4와 6사이에 존재. 5가 있다면 [6]위치에 있었을 것을 생각해 리턴한듯 하다.
bisect.insort(c,6)
c
>>[1,2,2,2,3,4,6,7] # 4와 7사이에 정렬적으로 6이 삽입된 것을 볼 있다.
리스트 내장 순차 자료형 enumerate : 아이템의 색인과 함께 처리하고자 할 때. mapping에 유용 sorted : 정렬 (bisect 함수 쓰기 전에 사용해야 할 듯! ) zip : 여러 리스트나 튜플 또는 다른 순차 자료형을 사로 짝지어서 튜플의 리스트로 생성. 여러개의 순차 자료형을 받을 수 있으며 반환되는 리스트 크기는 가장 짧은 크기로. reversed : 순차 자료형을 역순으로. (제너레이터이기 때문에 list()나 for 문으로 모든 값을 다 ㅏㄷ아오기 전에는 순차 자료형을 생성하지 않는)
some_list = ['foo' , 'bar' ,'baz'] mapping = {} for i, v in enumerate (some_list) : mapping[v] = i mapping {'bar':1, 'baz':2, 'foo':0}
딕셔너리
키-값 쌍. 해시맵 또는 연관 배열
- 키-값 추가할 때는 딕셔너리명[키]= '값' 으로 추가한다. 리스트와 헷갈리면 안 된다.
- 값 유무 확인 (in-없으면 error-, get -get은 값이 없을 때 none 리턴- ), 삭제 (del, pop), 추가 및 업데이트(update),
- 1개의 사전은 2개짜리 튜플로 구성되어 있으므로, dict 함수가 2개짜리 튜플의 리스트 인자로받아 사전을 생성할 수 있다
mapping = {}
for key, value in zip(key_list, value_list):
mapping[key] = value
ex ) mapping = dict(zip (range(5), reversed(range(5))))
mapping
{0:4, 1:3, 2:2, 3:1. 4:0}
집합
- 유일한 원소만 담는 정렬되지 않은 자료형
set([2,2,2,1,3,3])
>{1,2,3}
- 합집합, 교집합, 차집합, 대칭차집합 같은 산술 집합 연산을 제공
- 집합에 리스트 같은 원소들을 담으려면 리스트를 튜플로 형변환 해야한다.
중첩 리스트 표기법
ex1) 영어 이름과 스페인어 이름을 담고 있는 두개의 리스트
all_data = [ [john,..., steven ], ['maria',..., 'pillar'] ]
all_data에서 알파벳 e가 2개 이상 포함된 이름의 목록 구하는 방법
result = [name for names in all_data for name is names
if name, count('e') >=2 ]
result
> 'steven'
ex2)
some_tuples = [(1,2,3) , (2,3,4) , (4,5,6)]
flattened = [x for tup in some_tuples for x in tup]
flattened
> [1,2,3,2,3,4,4,5,6]
또는
reulst = {}
for tup in some_tuples :
for x in tup :
flattened.append(x)
함수
키워드 인자는 항상 일반 인자 다음에 와야 한다. func (5,6,x=7) (O) , func (x=7, 5,6) (X)
익명 함수(=lambda 함수) : 값을 반환하는 단순한 한 문장으로 이루어진 함수.
def apply_to_list(some_list, f) : return [f(X) for x in some_list] ints=[4,0,1,5,6] apply_to_list(ints,lambda x:x*2) >> [8,0,2,10,12]
커링 : 함수에서 일부 인자만 취하기
ex) def add_numbers (x,y) : return x+y add_five = lambda y:add_numbers(5,y) # x,y 중 y 인자만 받았다. (=두번째 인자를 커링했다) add_five(2) >> 7 또는 functools 모듈에서 partial 함수를 이용하면 이 과정을 단순화시킬 수 있다 from functools import partial add_five =partial(add_numbers, 5)
제너레이터는 순회 가능한 객체(이터레이터)를 생성하는 간단한 방법. -일반 함수는 실행되면 단일 값을 반환하는 반면, 제너레이터는 순차적인 값을 매 요청 시마다 하나씩 반환. - 제너레이터를 생성하려면 함수에서 return을 하는 대신 yield 예약어를 사용.

제너레이터를 호출해도 코드가 바로 실행되지 않는다. > generator object square at ~ 이 나옴
제너레어로부터 값을 요청하면 > for x in gen
그떄서야 제너레이터 코드가 실행된다.
- 제너레이터 표현식을 사용하는 방법 In[19]. 21번째 줄보다 훨씬 간단하다.

itertools 모듈 : sql에서의 groupby와 기능이 유사하다. 조합을 생성하고 그룹지어준다. ( combinations(iterable , k) / permutations(iterable, k) / groupby (iterable [, keyfunc]) / product (*iterables, repeat =1)
파일 읽기 1. 파일 경로(path) 넘겨주기 2. 파일 열기 및 읽기 (+매 줄로 순회 가능 ) 3. 파일 닫기
path = 'examples/example.txt'
f=open(path)
for line in f :
pass
lines = [x.rstrip() for x in open(path]
f.close()
# with 문을 쓰면 파일 작업이 끝났을 때 필요한 작업을 쉽게 처리할 수 있다
with open(path) as f:
lines = [x.rstrip() for x in f]
f=open(path)
f.read(10)
read : 해당 파일에서 정 개수만큼의 문자를 반환 . 읽은 바이트만큼 파일 핸들의 위치를 옮긴다 tell : 현재 위치를 알려준다 seek : 파일 들의 위치를 해당 파일에서 지정한 바이트 위치로 옮긴다 파일 쓰기는 w, x 를 사용하는데 w는 같은 이름의 파일이 있으면 덮어쓰는데 반해 x는 실패한다.
Last updated
Was this helpful?