pandas

  • 구조화 된 데이터 처리를 지원하는 라이브러리
  • python계의 엑셀
  • panel data - > pandas
  • 고성능 array 계산 라이브러리인 numpy와 통합하여 강력한 '스프레드시트' 처리 기능을 제공
  • 인덱싱, 연산용 함수, 전처리 함수 등을 제공함
  • 데이터 처리 및 통계 분석을 위해 사용

데이터 로딩

  • pd.read_csv: csv 읽어옴
  • head(): 처음 다섯 행 출력
  • columns: 컬럼 이름 지정

series

  • DataFrame: 데이터 테이블 전체를 포함하는 object
  • 데이터 프레임중 하나의 column에 해당하는 데이터의 모음 object
  • 데이터, 인덱스로 구성됨
import pandas as pd
list_data = [1, 2, 3, 4, 5]
list_name = ['a', 'b', 'c', 'd', 'e']
sample_obj = pd.Series(data=list_data, index=list_name)

sample_obj['a'] # 인덱스로 접근하기
sample_obj['a'] = 3.2 # 인덱스로 할당하기
sample_obj.astype(int) # 타입 변경
sample_obj.values # 값 리스트만
sample_obj.index # 인덱스 리스트만
sample_obj.name # 컬럼 이름 지정
  • 인덱스 값을 기준으로 series 생성, 인덱스가 데이터보다 많으면 NaN 추가

DataFrame

  • 데이터 테이블 전체를 포함하는 object
  • series를 모아서 만든 데이터 테이블 = 기본 2차원
raw_data = {'first_name':['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
           'last_name':['Miller', 'Jaconbson', 'Ali', 'Milner', 'Cooze'],
           'age':[42, 52, 36, 24, 73],
           'city':['San Francisco', 'Baltimore', 'Douglas', 'Boston']}

df = pd.DataFrame(raw_data, colums = ['first_name', 'last_name', 'age', 'city'])

# column 선택 방법 - Serise 데이터
df.first_name
df['first_name']

DataFrame indexing

  • loc[index, column]: 인덱스 이름으로 접근
  • iloc: 숫자로 변형

DataFrame handling

df.debt = df.age > 40 #column에 새로운 값 할당

values = Serise(data=['M', 'F', 'F'], index=[0, 1, 3])
df['sex'] = values

df.T # transpose
df.values # array 타입으로 값 출력
df.to_csv() # csv형태로 출력

del df['debt'] # 컬럼 삭제
df.drop('debt', axis=1)

selection with column names

  • 컬럼 하나: df['column']
  • 컬럼 하나 이상: df[[column_1, column_2, column_3]]

selection with index number

  • df[:1]
  • 한 개 이상 인덱스: df[0, 1, 2]
  • 불리언: df[column < 500]

basic, loc, iloc selection

  • basic: df[['column_1', 'column_2']]
  • loc: df.loc[1, 1]
  • iloc: df.iloc[1, 1]

index 재설정

  • df.index = list: 인덱스 할당
  • df.reset_index(inplace=True): 인덱스 리셋, inplace - 원본 데이터를 변경함

data drop

  • df.drop(index, inplace=True): 해당 인덱스 삭제

dataframe operation

serise operation

  • index를 기준으로 연산 수행, 겹치는 index가 없을 경우 NaN 반환
  • fill_value: NaN값 0으로 바꿔서 계산

series + dataframe

  • axis를 기준으로 row broadcasting 실행
  • df.add(s2, axis=0)

lambda, map, apply

  • pandas의 series type에도 map 함수 사용 가능
  • function 대신 dict, sequence 자료등으로 대체 가능
s1 = Series(np.arange(10))
s1.map(lambda x:x**2).head()

z = {1:'A', 2:'B', 3:'C'}
s1.map(z).head()
#dict type으로 데이터 교체

s2 = Series(np.arange(10, 20))
s1.map(s2).head(5)
#같은 위치의 데이터를 s2로 전환

apply for dataframe

  • map과 달리 series 전체가 해당 함수에 들어감
  • 입력 값이 series 데이터로 입력받아 handling 가능
  • 내장 연산 함수를 사용할 때도 똑같은 효과를 거둘 수 있음
  • mean, std, sum 등
  • series 단위에 apply 적용시킬 때는 map과 같은 효과

applymap for dataframe

  • series 단위가 아닌 element 단위로 함수를 적용함

pandas built-in function

describe

  • numeric type 데이터의 요약 정보를 읽어줌

unique

  • series data의 유일한 값을 list로 반환

sum

  • 기본적인 column 또는 row 값의 연산을 지원
  • sub, mean, min, max, count, median, mad, var 등

isnull

  • column 또는 row값의 Nana 값의 인덱스를 반환함
  • df.isnull().sum(): 널값이 몇갠지 보여줌

sort_values

  • column 기준으로 데이터를 sorting

correlation & covariance

  • 상관계수와 공분산을 구하는 함수
  • corr(모든 column), cov, corrwith(특정 한 column)
  • pd.option.display.max_rows: 디스플레이 행 수 늘리기

Groupby-1

  • SQL groupby 명령어와 같음
  • split -> apply -> combine 과정을 거쳐 연산함
df.groupby('Team')['Points'].sum()
  • 한 개 이상의 column을 묶을 수 있음
df.groupby(['Team', 'Year'])['Points'].sum()

hierarchical index

  • groupby 명령의 결과물도 dataframe
  • 두개의 column으로 groupby를 할 경우, index가 두개 생성
  • unstack(): 그룹으로 묶여진 데이터를 matrix 형태로 바꿔 줌
  • swaplevel(): 인덱스 레벨을 바꿔 줌
  • sort_index(level=0): 레벨을 기준으로 sort
  • index level을 기준으로 기본 연산 수행 가능

Groupby-2

  • groupby에 의해 split 된 상태를 추출 가능함
grouped = df.groupby('Team')

for name, group in grouped:
    print(name)
    print(group)
  • tuple 형태로 그룹의 key, value 값이 추출 됨
  • get_gorup(group_name): 특정 그룹의 정보를 가져올 수 있음
  • 추출된 그룹 정보에는 세 가지 유형의 apply가 가능함
  • Aggregation: 요약된 통계 정보를 추출해줌
  • Transformation: 해당 정보를 변환해줌
  • Filtration: 특정 정보를 제거하여 보여주는 필터링 기능

pivot table & crosstab

pivot table

  • index 축은 groupby와 동일함
  • column에 추가로 labeling 값을 추가하여
  • value에 numeric type 값을 aggregation 하는 형태
df_phone.pivot_table(value=['duration'],
                    index=[df_phone.month, df_phone.item],
                    columns=df_phone.network,
                    aggfunc='sum',
                    fill_value=0)

# groupby로 구현

df_phone.groupby(['month', 'item', 'network'])['duration'].sum().unstack()

crosstab

  • 두 칼럼의 교차 빈도, 비율, 덧셈등을 구할 때 사용
  • pivot table의 특수한 형태
  • user-item rating matrix등을 만들 때 사용
pd.crosstab(index=df_movie.critic,
           columns=df_movie.title,
           values=df_movie.rating,
           aggfunc='first',
           ).fillna(0)

merge & concat

merge

  • SQL에서 사용하는 merge와 같은 기능
  • 두개의 데이터를 하나로 합침
pd.merge(df_a, df_b, on='subject_id')
pd.merge(df_a, df_b, left_on='subject_id', right_on='subject_id') # 두 dataframe의 column 이름이 다를 때

join method

  • inner join: 양쪽 테이블에 같은 subject_id가 있어야 함
  • left/right join: 어느 한 쪽을 기준으로 join, 없는 것은 NaN 처리
  • full(outer) join: 같은 것은 join하고 다른 것은 NaN

index based join

pd.merge(df_a, df_b, right_index=True, left_index=True)

concat

  • 같은 형태의 데이터를 붙이는 연산작업
pd.concat([df_a, df_b], axis=1)
  • 예제) 날짜 별로 다른 파일에 저장이 되어 있을 때
import os
import pandas as pd

files = [file_name for file_name in os.listdir('./data') if file_name.endswith('xlsx')]

df_list = [pd.read_excel(os.path.join('data', df_filename) for df_filename in files)]
status = df_list[0]
sales = pd.concat(df_list[1:])

persistence

Database connection

  • data loading시 db connection 기능 제공함
import sqlite3

conn = sqlite3.connect('./data/flights.db')
cur = conn.cursor()
cur.execute('select * from airlines limit 5;')
result = cur.fetchall()
result

df_airlines = pd.read_sql_query('select * from airlines;', conn)
df_airlines

XLS persistence

  • dataframe의 엑셀 추출 코드
  • xls 엔진으로 openpyxls 또는 XlsxWrite 사용
writer = pd.ExcelWriter('./data/df_routes.xlsx', engine='xlsxwriter')
df_routes.to_excel(writer, sheet_name='Sheet1')

 

출처: boostcamp precourse

'Python > Study' 카테고리의 다른 글

파이썬 알고리즘 인터뷰 - 배열  (0) 2021.11.03
파이썬 알고리즘 인터뷰 - 문자열  (0) 2021.11.03
Basic Python) Numpy  (0) 2021.11.02
Basic Python) Data handling  (0) 2021.11.02
Basic Python) File / Exception / Log Handling  (0) 2021.11.02

Numerical Python - Numpy

"어떻게 행렬과 매트릭스를 코드로 표현할 것인가?"

coefficient_matrix = [[2, 2, 1], [2, -1, 2], [1, -1, 2]]
constant_vector = [9, 6, 5]
  • 다양한 matrix 계산을 어떻게 만들 것인가?
  • 굉장히 큰 matrix에 대한 표현(메모리 효율 x)
  • 처리 속도 문제 - python은 interpreter 언어

numpy

  • numerical python
  • 파이썬의 고성능 과학 계산용 패키지
  • matrix와 vector와 같은 array 연산의 사실상의 표준

numpy의 특징

  • 일반 list에 비해 빠르고, 메모리 효율적
  • 반복문 없이 데이터 배열에 대한 처리를 지원함
  • 선형대수와 관련된 다양한 기능을 제공함
  • C, C++, 포트란 등의 언어와 통합 가능

ndarray

import numpy as np

test_array = np.array([1, 4, 5, 8], float)
print(test_array)
type(test_array[3])
  • np.array 함수를 통해 배열을 생성함
  • numpy는 하나의 데이터 type만 배열에 넣을 수 있음
  • list와 가장 큰 차이점: 다이나믹 타이핑 x
  • C의 array를 사용하여 배열을 생성함

array creation

  • ndarray는 데이터가 차례대로 메모리에 할당
  • python 리스트는 데이터가 메모리에 차례대로 들어가는 것이 아니라 데이터의 주소를 리스트에 넣음(주소로 부터 메모리로 들어가는 단계를 한번 더 거쳐야 함)
  • shape: array의 dimension 구성을 반환
  • dtype: array의 데이터 타입을 반환

array.shape

  • array의 rank에 따라 불리는 이름이 있음
  • 0: scalar, 1: vector, 2: matrix, 3: 3-tensor, n: n-tensor
  • ndim - number of dimensions = rank
  • size - data의 갯수

array.dtype

  • single element가 가지는 data type
  • 각 element가 차지하는 memory의 크기가 결정됨(ex. np.float32, np.int8 ...)

array.nbytes

  • nbytes: array object의 메모리 크기를 반환함

Handling shape

reshape

  • reshape: array의 shape의 크기를 변경함, element의 갯수는 동일
import numpy as np
np.array(test_matrix).reshape(2, 4)
np.array(test_matrix).reshape(-1, 2)
# -1: size를 기반으로 row 갯수 선정

flatten

  • flatten: 다차원 array를 1차원 array로 변환
np.array(test_matrix).flatten()

indexing & slicing

  • list와 달리 이차원 배열에서 [0, 0] 표기법을 제공함
  • matrix일 경우 앞은 row 뒤는 column을 의미함
a = np.array([[1, 2, 3], 
              [4, 5, 6]])

print(a[0][2])
print(a[0, 2])
a[0, 2] = 10 # 0, 2에 10 할당
  • 리스트와 달리 행과 열을 나눠서 slicing이 가능함
  • matrix의 부분 집합을 추출할 때 유용함
a = np.array([[1, 2, 3, 4, 5],
             [6, 7, 8, 9, 10]])

a[:, 2:] # 전체 row의 2열 이상
a[1, 1:3] # 1 row의 1~2열
a[1:3] # 1~2 row 전체
  • a[start : end : step]

creation function

  • arange: array의 범위를 지정하여 값의 list를 생성하는 명령어
  • zeros: 0으로 가득찬 array 생성
  • ones: 1로 가득찬 array 생성
  • empty: memory만 주어지고 비어있는 array 생성
  • somthing_like: array의 shape 크기 만큼 1, 0, 또는 empty array를 반환

identity

  • 단위 행렬을 생성함

eye

  • 대각선의 값이 1인 행렬, k값의 시작 index의 변경이 가능

diag

  • 대각 행렬의 값을 추출함, k값 지정 가능

random sampling

  • 데이터의 분포에 따른 sampling으로 array 생성
np.random.uniform(0, 1, 10).reshape(2, 5)

operation functions

sum

  • array의 element 간의 합

axis

  • 모든 operation function을 실행할 때 기준이 되는 dimension 축
  • (3, 4): axis = 0은 3, axis = 1은 4

mean & std

  • array의 element들 간의 평균 또는 표준편차를 반환

mathmatical functions

  • 그 외에도 다양한 수학 연산자를 제공함

concatenate

  • array를 합치는 함수
  • vstack: 세로로 붙이기
  • hstakc: 가로로 붙이기
  • concatenate: axis를 기준으로 붙임
  • np.newaxis: 축을 추가해줌

operations b/t array

  • numpy는 array간의 기본적인 사칙 연산을 지원함
  • element-wise operations: array간 shape이 같을 때, 같은 위치에 있는 element끼리 연산

Dot product

  • matrix의 기본연산, dot 함수 사용
test_a.dot(test_b)

transpose

  • transpose 함수 또는 T attribute 사용

broadcasting

  • shape이 다른 배열 간 연산을 지원하는 기능
test_matrix = np.array([[1, 2, 3],
                       [4, 5, 6]])
scalar = 3
print(test_matrix + scalar)
  • scalar-vector 외에도 vector-matrix 간의 연산도 지원

numpy performace

  • timeit: jupyter 환경에서 코드의 퍼포먼스를 측정하는 함수
  • 일반적인 속도: for loop < list comprehension < numpy
  • numpy는 C로 구현되어 있어 성능을 확보하는 대신 dynamic typing을 포기함
  • concatenate 처럼 계산이 아닌 할당에서는 연산 속도의 이점이 없음

comparison

All & Any

  • array의 데이터 전부 또는 일부가 조건에 만족 여부 반환

comparison operation

  • 배열의 크기가 동일할 때, element간 비교의 결과를 boolean type으로 반환(element-wise)
  • logical_and, logical_not, logical_or

np.where

np.where(a > 0, 3, 2) # where(condition, True, False)

a = np.arange(10)
np.where(a>5) # index 값 반환

a = np.array([1, np.NaN, np,Inf])
np.isnan(a)
np.isfinite(a)

argmax & argmin

  • array내 최대값 또는 최소값의 index 반환
  • axis 기반의 반환
a = np.array([[1, 2, 4, 7],
             [9, 88, 6, 45],
             [9, 76, 3, 4]])

np.argmax(a, axis=1)
# array([3, 1, 1])
  • argsort(): 오름차순으로 정렬한 index 반환

boolean & fancy index

boolean index

  • 특정 조건에 따른 값을 배열 형태로 추출
  • comparison operation 함수들도 모두 사용 가능
test_array = np.array([1, 4, 0, 2, 3, 8, 9, 7])

test_array[test_array > 3]

fancy index

  • array를 index value로 사용해서 값 추출
a = np.array([2, 4, 6, 8])
b = np.array([0, 0, 1, 3, 2, 1]) # 반드시 integer로 선언
a[b] # b 배열의 값을 index로 하여 a 값을 추출함
a.take(b) # bracket index와 같은 효과
  • matrix도 사용 가능

numpy data i/o

loadtxt & savetxt

  • text type의 데이터를 읽고 저장하는 기능
a = np.loadtxt('population,txt', delimiter='\t')

np.savetxt('int_data_2.csv', a_int_3, fmt='%.2e', delimiter=',')

numpy object - npy

np.save('npy_test.npy', arr=a_int)

npy_array = np.load(file='npy_test.npy')
  • 피클 형태로 저장

출처: boostcamp precourse

'Python > Study' 카테고리의 다른 글

파이썬 알고리즘 인터뷰 - 문자열  (0) 2021.11.03
Basic Python) Pandas  (0) 2021.11.02
Basic Python) Data handling  (0) 2021.11.02
Basic Python) File / Exception / Log Handling  (0) 2021.11.02
Basic Python) module & project  (0) 2021.11.02

Comma separte value(csv)

  • csv, 필드를 쉽표로 구분한 텍스트 파일
  • 엑셀 양식의 데이터를 프로그램에 상관없이 쓰기 위한 데이터 형식
  • 탭(TSV), 빈칸(SSV) 등으로 구분해서 만들기도 함
  • 통칭하며 character separated values(CSV)
  • 엑셀에서는 '다른 이름 저장' 기능으로 사용 가능

엑셀로 CSV 파일 만들기

1) 파일 다운로드
2) 파일 열기
3) 파일 -> 다른 이름 저장 -> CSV 선택
4) 엑셀 종료 후 notepad로 파일 열어보기

파이썬으로 CSV 파일 읽기/쓰기

  • 일반적 textfile을 처리하듯 파일을 읽어온 후, 한줄 한 줄씩 데이터를 처리함
line_counter = 0
data_handler = [] # 데이터의 헤드
customer_list = [] # customer 개별 리스트

with open ('customer.csv') as f:
    while True:
        data = f.readline()
        if not data: break
        if line_counter == 0:
            data_handler = data.split(',')
        else:
            customer_list.append(data.split(','))
        line_counter += 1

csv 객체로 csv 처리

  • text 파일 형태로 데이터 처리시 전처리 과정이 필요
  • 파이썬에서는 간단히 csv 파일을 처리하기 위해 csv 객체를 제공함
import csv
reader = csv.reader(f,
                   delimiter = ','
                   quotechar="'",
                   quoting=csv.QOUTE_ALL)

Web

  • 인터넷 = Web
  • 데이터 송수신을 위한 HTTP 프로토콜 사용
  • 데이터를 표시하기 위해 HTML 사용

web은 어떻게 동작하는가?

  1. 요청: 웹주소, form, header 등
  2. 처리: Database 처리 등 요청 대응
  3. 응답: HTML, XML 등으로 결과 반환

HTML(Hyper Text Markup Language)

  • 웹상의 정보를 구조적으로 표현하기 위한 언어
  • 제목, 단락, 링크 등 요소 표시를 위해 Tag 사용
  • 모든 요소들은 꺾쇠 괄호 안에 둘러 쌓여 있음
  • ex)
  • 모든 HTML은 트리 모양의 포함 관계를 가짐
  • HTML 소스파일을 컴퓨터 브라우저가 해석

왜 웹을 알아야 하는가?

  • 정보의 보고, 많은 데이터들이 웹을 통해 공유됨
  • HTML도 일종의 프로그램, 페이지 생성 규칙이 있음: 규칙을 분석하여 데이터의 추출이 가능
  • 추출된 데이터를 바탕으로 하여 다양한 분석이 가능

정규식(regular expression)

  • 복잡한 문자열 패턴을 정의하는 문자 표현 공식
  • 특정한 규칙을 가진 문자열의 집합을 추출
  • HTML 역시 tag를 사용한 일정한 형식이 존재하여 정규식으로 추출이 용이함
  • 문법은 매우 방대, 스스로 찾아서 하는 공부 필요

정규식 연습장 활용하기: regexr.com

정규식 기본 문법 - 메타문자

  • 정규식 표현을 위해 다른 용도로 사용되는 문자
  • {m, n}: 반복 횟수를 지정
  • ?: 반복 횟수가 1회
  • |: or, ^: not

정규식 in 파이썬

  • re모듈을 import하여 사용
  • 함수: search - 한개만 찾기, findall - 전체 찾기
  • 추출된 패턴은 tuple로 반환 됨
import re
import urllib.request

url = 'hhtps://bit.ly/3rxQFS4'
html = urllib.request.urlopen(url)
html_contents = str(html.read())
id_results = re.findall(r'([A-Za-z0-9]+\*\*\*)', html_contents)

for result in id_results:
    print(result)

XML(extensive markup language)

  • 데이터의 구조와 의미를 설명하는 Tag를 사용하여 표시하는 언어
  • Tag와 Tag 사이에 값이 표시되고 구조적인 정보를 표현할 수 있음
  • HTML과 문법이 비슷, 대표적인 데이터 저장 방식

XML이란

  • 정보 구조에 대한 정보인 스키마와 DTD 등으로 정보에 대한 정보가 표현되며, 용도에 따라 다양한 형태로 변경가능
  • XML은 컴퓨터(PC와 스마트폰)간에 정보를 주고 받기 매우 유용한 저장 방식으로 쓰이고 있음

Beautifulsoup

  • html, xml등 markup 언어 scraping을 위한 대표적인 도구
  • lxml과 html5lib 과 같은 parser를 사용함
  • 속도는 상대적으로 느리나 간편히 사용할 수 있음
# 모듈 호출
from bs4 import BeautifulSoup

# 객체 생성
soup = BeautifulSoup(books_xml, 'lxml')
# 태그 찾는 함수 find_all 생성
for book_info in soup.find_all('author'):
    print(book_info.get_text())

JavaScript Object Notation

  • 원래 웹 언어인 java Script의 데이터 객체 표현 방식
  • 간결성으로 기계/인간이 모두 이해하기 편한
  • 데이터 용량이 적고, code로 전환이 편함
  • xml 대체제로 많이 활용 됨

Json overview

  • python의 dict type과 유사
  • key:value 쌍으로 전환 가능

Json in python

  • 데이터 저장 및 읽기는 dict type과 상호호환 가능
  • 웹에서 제공하는 API는 대부분 정보 교환시 Json 활용
import json

# 읽기
with open('json_example.json', 'r', encoding='utf8') as f:
    contents = f.read()
    json_data = json.loads(contents)

# 쓰기
dict_data = {'name':'Zara', 'Age':7, 'Class':'First'}

with open('data.json', 'w') as f:
    json.dump(dict_data, f)

출처: boostcamp precourse

'Python > Study' 카테고리의 다른 글

Basic Python) Pandas  (0) 2021.11.02
Basic Python) Numpy  (0) 2021.11.02
Basic Python) File / Exception / Log Handling  (0) 2021.11.02
Basic Python) module & project  (0) 2021.11.02
Basic Python) object oriented programming  (0) 2021.11.02

+ Recent posts