네이버 부스트캠프/LEVEL-1

[부스트캠프][WK-01 / Day5] 파이썬 기초 4, numpy/pandas

1. 강의 내용

File / Exception / Log Handling (최성철 교수님)

1) Exception

  • 예상이 가능한 예외
    발생 여부를 사전에 인지할 수 있는 예외로 개발자가 명시적으로 정의 합니다.
  • 예상 불가능한 예외
    인터프리터 과정에서 발생하는 예외로 개발자의 실수에서 비롯됩니다. 프로그램에서 인터프리터가 알아서 에러를 호출해주고 프로그램을 종료시킵니다. 이 경우 Exception Handling을 통해 대처할 수 있습니다.

try~except

try:
    예외 발생 가능한 코드
except <Exception Type>:
    예외 발생했을 때 대응하는 코드
  • Built-in Exception (기본적으로 제공하는 예외)

IndexError List의 Index 범위를 넘어갈 때
NameError 존재하지 않는 변수를 호출할 때
ZeroDivisionError 0으로 숫자를 나눌 때
ValueError 변환할 수 없는 문자/숫자를 변환할 때
FileNotFoundError 존재하지 않는 파일을 호출할 때

Exception 이름 내용
IndexError List의 Index 범위를 넘어갈 때
NameError 존재하지 않는 변수를 호출할 때
ZeroDivisionError 0으로 숫자를 나눌 때
ValueError 변환할 수 없는 문자/숫자를 변환할 때
FileNotFoundError 존재하지 않는 파일을 호출할 때

try-except-else, try-except-else-finally와 같은 구문도 쓰이며 필요에 따라 강제로 Exception을 발생시키는 raise문도 있습니다. assert는 특정 조건에 만족하지 않을 경우 예외를 발생시킵니다.

2) File Handling

기본적인 파일 종류로 text파일과 binary파일이 있습니다. 컴퓨터는 text파일을 처리하기 위해 binary 파일로 변환시킵니다. 모든 text 파일도 실제로는 binary 파일이며, ASCII/Unicode 문자열 집합으로 저장되어 사람이 읽을 수 있습니다.

Binary 파일 Text 파일
이진법 형식으로 저장 문자열 형식으로 저장
메모장으로 열면 내용 확인 불가 메모장으로 열면 내용 확인 가능
엑셀파일, 워드 파일 등 메모장에 저장된 파일, HTML 파일, py 파일 등

파이썬은 파일 처리를 위해서 "open" 키워드를 사용합니다.

# read
f = open("파일명", "r") #접근모드는 r(읽기), w(쓰기), a(추가)
f.close()

with open("파일명","r") as f:
    contents = f.read()
    print(contents) 
    # f.close()가 없음

with open("파일명","r") as f:
    contents_list = f.readlines() 
    # 파일 전체를 list로 반환,실행 시 마다 한 줄 씩 읽어옴, 메모리가 적게 쓰고 싶으면 readline()

# write - 파일을 새로 열기
f = open("파일명", "w", encoding='utf8') # encoding: 저장 표준
for i in range(1, 11):
    data = "%d번째 줄입니다.\n" % i
    f.write(data)
f.close()

# append - 기존 파일에 덮어쓰기
with open("파일명", mode="a", encoding="utf8") as f:
    for i in range(1, 11):
        data = f'{i}번째 줄입니다.\n'
        f.write(data)

# os 모듈의 사용하여 디렉토리 다루기
import os
os.mkdir("log")

# 디렉토리 있는지 확인
if not os.path.isdir("log"):
    os.mkdir("log")

# 최근에는 pathlib 모듈을 사용하여 path를 객체로 다룸
import pathlib
cwd = pathlib.Path.cwd()
cwd.parent
cwd.glob("*")

Pickle
파이썬의 객체를 영속화하는 built-in 객체입니다. 데이터, object 등 실행중 정보를 저장하고 이를 불러와서 사용할 때 쓰입니다. 객체는 항상 인터프리터가 종료되면 메모리에서 사라지게 되지만 해당 정보를 남겨서 사용하고 싶을 때 Pickle을 사용합니다.

import pickle

f = open('list.pickle', 'wb') # b : binary
test = [1, 2, 3, 4, 5]
pickle.dump(test, f)
f.close()

del test

f = open('list.pickle', 'rb') 
test_pickle = pickle.load(f)
test_pickle # [1,2,3,4,5]
f.close()

3) Logging Handling

Logging은 프로그램이 실행되는 동안 일어나는 정보를 기록으로 남기는 것으로 주로 담기는 정보는 유저의 접근, Exception, 특정 함수의 사용 등이 있습니다. 남기는 방법에는 Console 화면에 출력(분석 시 사용불가), 파일에 남기기, DB에 남기기 등이 있으며 기록된 로그를 분석하여 의미있는 결과를 도출할 수 있습니다.

파이썬의 기본 Log 관리 모듈은 logging 모듈이 있습니다.

level 개요 예시
debug 개발시 처리 기록을 남겨야하는 로그 정보를 남김 다음함수로 A를 호출함, 변수 A를 B로 변경함
info 처리가 진행되는 동안의 정보를 알림 서버 시작됨, 서버 종료됨, 사용자 A가 접속함
warning 사용자가 잘못 입력한 정보나 처리는 가능하나 원래 개발시 의도치 않은 정보가 들어왔을 때 알림 Str 입력을 받아야 하는데, Int가 입력됨- str casting으로 처리, 함수에 이차원 리스트 대신 일차원 리스트가 입력됨.- 이차원으로 변환 후 처리
error 잘못된 처리로 인해 에러가 났으나, 프로그램은 동작 가능 파일에 기록을 해야하는데 파일이 없음 - Exception 처리후 사용자에게 알림, 외부서비스와 연결 불가
critical 잘못된 처리로 데이터 손실이나 더이상 프로그램 동작 불가 잘못된 접근으로 해당 파일이 삭제됨, 사용자에 의한 강제 종료

logging은 미리 설정이 필요한데, 파일에 설정하고 알려주는 configparser와 실행시점에 알려주는 argparser가 있습니다. configparser는 프로그램의 실행 설정을 파일에 저장하고 argparser는 Console 창에서 프로그램 실행 시 Setting 정보를 저장합니다. Log 결과값의 format을 Logging formmater를 통해 지정해줄 수 있습니다. (logging.Formmater)


Python data handling (최성철 교수님)

1) CSV

CSV(Comma Separate Values)는 쉼표로 구분한 텍스트 파일이며 엑셀 양식의 데이터를 프로그램에 상관없이 쓰기 위한 데이터 형식이라고 생각하면 쉽습니다. 비슷한 형태로는 탭(TSV), 빈칸(SSV) 등으로 구분해서 만들기도 합니다.

Text파일 형태로 데이터 처리 시 문장 내에 들어가 있는 ", " 등에 대해 전처리 과정이 필요하며, 파이썬에서는 간단히 CSV파일을 처리하기 위해 csv 객체를 제공합니다.

import csv
reader = csv.reader(f, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL)
Attribute Default Mean
delimiter , 글자를 나누는 기준
lineterminator \r\n 줄 바꿈 기준
quotechar " 문자열을 둘러싸는 신호 문자
quoting QUOTE_MINIMAL 데이터 나누는 기준이 quotechar에 의해 둘러싸인 레벨

2) Web (World Wide Web)

데이터 송수신을 위한 HTTP 프로토콜 사용하고, 데이터를 표시하기 위해 HTML 형식을 사용합니다.

HTML(Hyper Text Markup Language)
웹 상의 정보를 구조적으로 표현하기 위한 언어로 제목, 단락, 링크 등 요소 표시를 위해서 Tag를 사용합니다. 모든 요소들은 꺾쇠괄호 안에 둘러 쌓여서 사용됩니다. 모든 HTML은 트리 모양의 포함관계를 가지고 있습니다. 일반적으로 웹 페이지의 HTML 소스파일은 컴퓨터가 다운로드한 다음에 웹 브라우저가 해석/표시해줍니다.

정규식 (Regular expression)
정규표현식은 regexp 또는 regex 등으로 불리며 복잡한 문자열 패턴을 정의하는 문자 표현 공식입니다. 특정한 규칙을 가진 문자열의 집합을 추출할 때 사용합니다. HTML 역시 tag를 사용한 일정한 형식이 존재하여 정규식으로 추출이 용이합니다. regex 사이트에서 정규식 확인 및 연습이 가능합니다. 파이썬에서는 re 모듈을 import 하여 사용 가능합니다.

메타문자는 정규식 표현을 위해 원래 의미를 가지지않고 다른 용도로 사용되는 문자로 . ^ $ * + ? { } [ ] \ | ( ) 이 있습니다. 자세한 내용은 추가적인 검색을 통해 필요할 때 찾아보는 것이 좋습니다.

3) XML(eXtensible Markup Languages)

XML은 데이터의 구조와 의미를 설명하는 TAG를 사용하여 표시하는 언어이며 HTML과 문법이 비슷합니다. TAG와 TAG사이에 값이 표시되고, 구조적인 정보를 표현할 수 있습니다. 정보의 구조에 대한 정보인 스키마와 DTD 등으로 정보에 대한 정보(메타정보)가 표현되며, 용도에 따라 다양한 형태로 변경 가능합니다. 또한 컴퓨터(예: PC <-> 스마트폰) 간에 정보를 주고받기 매우 유용한 저장 방식으로 쓰이고 있습니다.

파이썬에서의 XMLHTML과 같이 구조적 markup 언어이며, 정규표현식으로 Parsing이 가능하지만 더 손쉬운 도구들이 개발되어 있습니다. 가장 많이 쓰이는 parser인 beautifulsoup으로 파싱 가능합니다.

from bs4 import BeautifulSoup
# 객체 생성
soup = BeautifulSoup(books_xml, "lxml")

# Tag 찾는 함수
soup.find_all("author") # 정규식과 마찬가지로 해당 패턴을 모두 반환
soup.get_text() # 반환된 패턴의 값 반환 (태그와 태그 사이)

4) JSON(JavaScript Object Notation)

JSON은 웹 언어인 Java Script의 데이터 객체 표현 방식이며 간결성으로 기계와 인간이 모두 이해하기 편합니다. 데이터 용량이 적고, Code로의 전환이 쉬우며 XML의 대체제로 많이 활용되고 있습니다. 파이썬의 Dictionary 형태와 매우 유사합니다.

파이썬에서의 JSON
json 모듈을 활용해서 쉽게 파싱 및 저장이 가능하며 데이터 저장 및 읽기는 dict type과 상호 호환이 가능합니다. 페이스북, 트위터, Github 등 거의 모든 사이트에서 제공하는 API는 대부분 정보 교환 시 JSON을 활용합니다. 각 사이트마다 Developer API의 활용법을 찾아 사용

import json

# JSON 파일의 구조 확인 후 읽어옴 -> Dict type처럼 처리
with open("파일명.json", "r", encoding="utf8") as f:
    contents = f.read()
    json_data = json.loads(contents)

# Dict type으로 데이터 저장 -> json 모듈로 write
with open("파일명.json", "w") as f:
    json.dump(데이터명, f)

Numpy (최성철 교수님)

다양한 수학 연산들을 리스트로 계산하게 되면 메모리 효율적이지 않고 파이썬은 인터프리터 언어이기 때문에 처리속도에 문제가 있습니다. 이러한 문제로 적절한 패키지의 활용이 필요한데 여기서 numpy가 쓰입니다.

numpy는 array연산의 사실상의 표준으로 리스트에 비해 빠르고 메모리 효율적입니다. 또한 반복문 없이 데이터 배열에 대한 처리를 지원합니다.

일반적으로 속도는 for loop < list comprehension < numpy이며 100,000,000 번의 loop를 돌 때, 약 4배 이상의 성능 차이를 보입니다. C로 구현되어 있어 파이썬의 가장 큰 특징인 dynamic typing을 포기한 대신 성능을 확보했습니다. 단, Concatenate처럼 계산이 아닌 할당에서는 연산 속도의 이점이 없습니다.

1) ndarray

numpy는 np.array 함수를 활용해서 배열을 생성하는데, 이때 생성된 객체를 ndarray라고 부릅니다. 리스트는 여러가지 데이터 타입이 들어갈 수 있지만 numpy는 하나의 데이터 타입만 배열에 넣을 수 있습니다. 또한 리스트와 달리 dynamic typing을 지원하지 않습니다.

numpy array는 메모리 공간에 데이터 값이 차례대로 할당됩니다. List는 값 자체가 아니라 주소값을 리스트에 저장하게 되어 한 번 더 들어가야 값을 찾을 수 있기 때문에 변형은 쉬우나 numpy와 비교해서 메모리 접근성이 떨어집니다.

명령어 특징
shape numpy array의 dimension 구성을 반환
dtype array 전체의 데이터 type을 반환
ndim number of dimensions
size data 개수
nbytes ndarray object의 메모리 크기 반환

array의 rank에 따라 불리는 이름이 따로 있습니다.

Rank Name Example
0 scalar 7
1 vector [10,10]
2 matrix [[10,10],[15,15]]
3 3-tensor [[[1,5,9],[2,6,10]],[[3,7,11],[4,8,12]]]
n n-tensor  

2) Handling shape

명령어 특징
reshape array의 shape 크기를 변경, element의 갯수는 동일. -1을 넣어주면 size를 기반으로 row, column 등의 개수를 조정함
flatten 다차원 array를 1차원 array로 변환

3) indexing & slicing

  • indexing: list와 달리 이차원 배열에서 [0,0] 표기법을 제공합니다. matrix의 경우 앞은 row, 뒤는 column을 의미합니다.
  • slicing: list와 달리 행과 열 부분을 나눠서 slicing이 가능합니다. 이는 matrix의 부분 집합을 추출할 때 유용합니다.
a = np.array([[1, 2, 3, 4, 5],[6, 7, 8, 9, 10]], int)
a[:,2:] # 전체 Row의 2열 이상
a[1,1:3] # 1Row의 1열~2열
a[1:3]# 1 Row ~ 2 Row의 전체

4) creation function

명령어 특징
arange array의 범위를 지정하여 해당 값의 리스트를 생성하는 명령어, step은 float도 가능
zeros 0으로 가득찬 ndarray 생성
ones 1로 가득찬 ndarray 생성
empty shape만 주어지고 비어있는 ndarray 생성(Memory initialization 되지 않음)
something_like zeros_like, ones_like, empty_like가 있으며 기존의 ndarray와 크기가 동일한 ndarray를 반환
identity 단위행렬 생성
eye 대각선이 1인 행렬(k값이 시작, index 변경 가능)
diag 대각행렬의 값을 추출(k값이 시작, index 변경 가능)
np.random.uniform 균등 분포로 부터 random sampling으로 array를 생성
np.random.normal 정규 분포로 부터 random sampling으로 array를 생성

5) operations functions

  • axis
    모든 operation function을 실행할 때 기준이 되는 dimension 축 입니다. axis는 1차원부터 가장 먼저 생긴 축의 값이 제일 크고 새로 생기는 축의 값이 가장 작습니다. 3차원의 경우 열이 2, 행이 1, 채널이 0이 됩니다.
명령어 특징
sum ndarray의 element들의 합, list의 sum과 동일
vstack vertical stack으로, vertical로 numpy array를 합치는 함수
hstack horizonal stack으로, horizonal로numpy array를 합치는 함수
concatenate numpy array를 합치는 함수. axis를 통해 hstack, vstack이 정해짐
수학 함수 mean, std등 다양한 수학 함수 사용 가능

6) array operations

numpy는 array간의 기본적인 사칙 연산을 지원하며 array간 shape이 같을 때 일어나는 연산을 Element-wise operations라고 합니다. dot 함수를 사용해 dot product를 연산하며 transpose 또는 T attribute를 사용하면 전치행렬을 만들 수 있습니다. Shape이 다른 배열 간 연산을 지원하는 기능을 broadcasting이라고 하며 scalar-vector간 연산 외에도 vector-matrix 간의 연산도 지원합니다.

7) comparisons

numpy는 배열의 크기가 동일할 때 element간 비교의 결과를 Boolean type으로 반환합니다.

명령어 특징
all 모두 다 조건에 만족하면 True
any 하나라도 조건에 만족하면 True
logical_and 둘다 True면 True
logical_not True는 False, False는 True
logical_or 둘 중 하나라도 True면 True
np.where(조건, True값, False값) 조건이 맞으면 True, 조건이 틀리면 False. 조건이 맞는 index 값을 반환하기도 함.
isnan null 값인지 확인
isfinite 유한숫자인지 확인
argmax/min array 내 최대/최소값의 index를 반환(axis 기반의 반환도 가능)
argsort array 내 각 값들이 몇번째로 작은지 인덱스를 반환해줌

8) boolean, fancy index

  • boolean index: 특정 조건에 따른 값을 배열 형태로 추출합니다. comparison operation 함수들도 모두 사용가능하며 조건이 True인 index의 element만 추출합니다. boolean list를 사용하며 원래의 array와 boolean index의 shape이 같아야 합니다.
  • fancy index: numpy는 array(반드시 integer로 선언)를 index value로 사용해서 값 추출합니다. matrix 형태의 데이터에도 가능합니다. integer list를 사용하며 shape이 같을 필요는 없지만 범위를 벗어나면 안됩니다.
a = np.array([2, 4, 6, 8], float)
b = np.array([0, 0, 1, 3, 2, 1], int)
a[b] # braket index, b 배열의 값을 index로 하여 a의 값들을 추출
# array([2., 2., 4., 8., 6., 4.])

a.take(b) # braket index와 같은 효과

9) numpy data i/o

명령어 특징
loadtxt & savetxt text type의 데이터를 읽고, 저장

Pandas 1 (최성철 교수님)

pandas는 구조화된 데이터의 처리를 지원하는 Python 라이브러리이며 panel data의 줄인 말입니다. 고성능 array 계산 라이브러리인 numpy와 통합하여, 강력한 스프레드시트 처리 기능을 제공합니다. 인덱싱, 연산용 함수, 전처리 함수 등을 제공하며 데이터 처리 및 통계 분석을 위해서 사용합니다.

1) series

series는 DataFrame 중 하나의 Column에 해당하는 데이터의 모음 object입니다 (column vector를 표현하는 object). 리스트와의 차이는 인덱스를 숫자 뿐만 아니라 문자로도 지정 가능하다는 것입니다. dict type을 Series에 넣으면 key값이 인덱스, value가 값으로 들어갑니다. 인덱스의 이름도 설정이 가능합니다. 기본적으로 series 데이터는 인덱스 기준으로 생성되며 인덱스에 값이 없다면 NaN(null)으로 표현됩니다.

2) dataframe

dataframe은 Data Table 전체를 포함하는 object입니다. 데이터 프레임 안의 값에 접근하기 위해서는 인덱스와 컬럼을 모두 알아야 합니다. 또한 컬럼 각각의 데이터 타입이 다를 수 있습니다. 보통 데이터 프레임은 DataFrame 함수로 만들기 보다 CSV나 EXCEL파일을 불러옵니다. column을 선택하면 series가 추출됩니다.

loc, iloc를 사용해 인덱싱 하는데 loc는 index 이름, iloc는 index number를 기준으로 인덱싱합니다. 이외에 T로 transpose, values로 값 출력, to_csv로 csv변환, del 또는 drop으로 column 삭제 등 다양한 핸들링 기법이 사용 가능합니다.

3) selection & drop

df["account"].head(3) # 한 개의 column 선택
df[["account", "street", "state"]].head(3) # 한 개 이상의 column 선택
df[:3] # column 이름 없이 사용하는 index number는 row기준 표시
df["account"][:3] # column 이름과 함께 사용 시 해당 column만 적용

# 인덱싱
df[["name", "street"]][:2] # column과 index number
df.loc[[211829, 320563],["name","street"]] # column과 index name
df.iloc[:2,:2] # column number와 index number

df.drop(1) # index number로 drop
df.drop([0, 1, 2, 3]) # 한 개 이상의 index number로 drop
df.drop("city", axis=1) # axis 지정 축을 기준으로 drop -> column중에 "city"

4) dataframe operation

series는 index를 기준으로 연산을 수행하며 겹치는 index가 없을 경우 NaN값으로 반환합니다. 데이터 프레임은 column과 index를 모두 고려하며 계산을 수행합니다. add operation을 쓰면 NaN값을 다른 값(fill_value=값)으로 변환해서 넣어줄 수 있습니다. operation type에는 add, sub, div, mul 등이 있습니다

5) lambda, map, apply

pandas의 series type의 데이터에도 map 함수 사용가능하며 function 대신 dict, sequence형 자료 등으로 대체도 가능합니다.

map함수의 기능 중 데이터 변환 기능만 담당하는 replace 함수도 존재합니다. 변경사항을 저장하기 위해서는 inplace=True를 작성해 주어야 합니다. apply는 map과 달리 series 전체(column)에 적용하는 함수입니다.

s1.map(lambda x: x**2)

f = lambda x : x.max() - x.min()
df_info.apply(f) # 각 column 별로 결과값 반환
# 내장 연산 함수를 사용할 때도 똑같은 효과를 거둘 수 있음

f = lambda x : -x
df_info.applymap(f) # series 단위가 아닌 element 단위로 함수를 적용. 데이터프레임 모든 값에 적용됨

6) panda built-in functions

함수 특징
describe() Numeric type 데이터의 요약 정보를 반환
unique() series data의 유일한 값을 list로 반환
sum(axis=) 기본적인 column(axis=0) 또는 row(axis=1) 값의 연산을 지원
isnull() column 또는 row 값의 NaN (null) 값의 index를 반환, sum이랑 같이 활용하기도 함
sort_values() olumn 값을 기준으로 데이터를 sorting (ascending=True : 오름차순)
corr, cov, corrwith 상관계수와 공분산을 구하는 함수

Pandas 2 (최성철 교수님)

1) Groupby

groupby는 SQL groupby 명령어와 동일하며 split->apply->combine 과정을 거쳐서 연산합니다.

위의 그림과 같이 할 수 있으며 한 개 이상의 column을 묶을 수 있습니다. Groupby 명령의 결과물도 결국은 dataframe입니다.

두 개의 column으로 groupby를 할 경우, index가 두 개 생성되는데 이를 Hierarchical index라 부릅니다. 이를 unstack() 명령어를 통해서 묶인 데이터를 matrix 형태로 풀어주기도 하며 reset_index()로 groupby를 풀어주기도 합니다. 또한 swaplevel을 통해 index level을 변경할 수 있으며 sortlevel을 통해 level에 따라 index를 정렬할 수 있습니다.

# index level을 기준으로 기본 연산 수행 가능
h_index.sum(level=0)
h_index.sum(level=1)

groupby에 의해 split된 상태를 grouped 상태라고 합니다. 이때, tuple의 형태로 그룹의 key값과 value값이 추출됩니다. get_group을 통해서는 특정 key값을 가진 그룹의 정보만 추출이 가능합니다.

  • 추출된 group 정보에는 세 가지 유형의 apply가 가능합니다.
  1. Aggregation: 요약된 통계정보를 추출해 줌
  2. Transformation: 해당 정보를 변환해 줌. aggregation과 달리 key값 별로 요약된 정보가 아니며 개별 데이터의 변환을 지원
  3. Filteration: 특정 정보를 제거하여 보여주는 필터링 기능
#aggregation
grouped.agg(sum)
grouped.agg([sum, max])
grouped.describe()

#transformation
score = lambda x: (x.max())
grouped.transform(score)

score = lambda x: (x - x.mean()) / x.std()
grouped.transform(score)

#filter
df.groupby('Team').filter(lambda x : len(x) >= 3)

2) Pivot table, Crosstab

Pivot table은 index 축은 groupby와 동일하며 column에 추가로 labeling 값을 추가하여 Value에 numeric type 값을 aggregation 하는 형태입니다.

# pivot table
df_phone.pivot_table(["duration"], 
                    index=[df_phone.month, df_phone.item],
                    columns=df_phone.network, aggfunc="sum", fill_value =0)

Crosstab은 두 칼럼에 교차 빈도, 비율, 덧셈 등을 구할 때 사용합니다. Pivot table의 특수한 형태이며 User-Item Rating Matrix 등을 만들 때 사용 가능합니다. 네트워크 형태의 데이터를 표현할 때 crosstab을 사용하면 편합니다.

pd.crosstab(index=df_movie.critic, columns=df_movie.title, values=df_movie.rating, 
        aggfunc="first").fillna(0)

3) Merge & Concat

Merge는 SQL의 merge(join)와 같은 기능을 가지고 있으며, 두 개의 데이터를 하나로 합칠 때 사용합니다.

# subject_id 기준으로 merge
pd.merge(df_a, df_b, on='subject_id')
# on은 양쪽에 모두 해당 컬럼이 있어야 함.
# 두 dataframe의 column 이름이 다를때 left_on, right_om을 사용합니다.

pd.merge(df_a, df_b, on='subject_id', how='left') # 왼쪽 df를 기준으로 합치며 오른쪽 df에 없는 값은 NaN값으로 나옴
pd.merge(df_a, df_b, on='subject_id', how='right') # 오른쪽 df를 기준으로 합치며 왼쪽 df에 없는 값은 NaN값으로 나옴
pd.merge(df_a, df_b, on='subject_id', how='outer') # 양쪽을 다 살리며 빈 공간은 NaN값으로 처리
pd.merge(df_a, df_b, on='subject_id', how='inner') # 교집합

Concat은 같은 형태의 데이터를 붙이는 연산 작업입니다. 위아래로 concat시에는 같은 컬럼을 가지고 있어야하며 append도 동일하게 동작합니다. axis=1을 해주면 옆으로 붙여줍니다.

4) persistence

Data loading 시 db connection 기능을 이용하여 Database에서 dataframe을 가져올 수 있습니다. 이때 sqlite3 라이브러리를 활용합니다.

import sqlite3

# db 연결
conn = sqlite3.connect("db명.db")
cur = conn.cursor()
cur.execute("select * from airlines limit 5;")
results = cur.fetchall()
results

# df 생성
df_airplanes = pd.read_sql_query("select * from airlines;", conn)
df_airports = pd.read_sql_query("select * from airports;", conn)
df_routes = pd.read_sql_query("select * from routes;", conn)

# 엑셀 추출
writer = pd.ExcelWriter('경로/df_routes.xlsx', engine='xlsxwriter') # 엔진으로 xlsxwriter 또는 openpyxls 사용
df_routes.to_excel(writer, sheet_name='Sheet1')

# 가장 일반적인 python 파일 persistence
# to_pickle, read_pickle 함수 사용
df_routes.to_pickle('경로/df_routes.pickle')

2. 과제 수행 과정 / 결과물 정리

선택과제 수행


3. 피어세션 정리

https://hackmd.io/zNicvvwZTX2EvldV5pd0PQ?view


4. 학습 회고

첫 주의 학습이 끝났는데 생각보다 바쁘게 지나갔습니다.

이미 알고 있다고 생각했던 개념들을 다시 배웠는데 알고 있는게 아니라는 사실을 깨닫게 되는 한 주 였습니다. 특히 확률, 통계와 연결되는 여러 수식과 분포, 이를 딥러닝에 적용하는 방법을 다시 한 번 복습할 예정입니다. 

흐름 잃지 않고 끝까지 모두 마칠 예정입니다.