4 minute read

py 5-1

Exception

try:
    ...
except ZeroDivisionError:
    ...
except IndexError as i:
    ...
    print(i)
    print("Index Error Occurs!")
else:
    ...
    p

built-in exception

IndexError NameError ZeroDivisionError ValueError FileNotFoundError

try-except-else-finally

굳이 else가 있는 이유: else는 에러가 없을 때 실행. finally는 언제나 실행. try clause에서 성공하면 연결해서 실행할 코드가 있을 때 else을 사용 함. 이런 특수한 상황에서 쓰기 때문에 흔히 보기는 쉽지 않다.

try:
    ...
except:
    ...
else:
    ...
fianlly:
    ...

reference: https://stackoverflow.com/questions/16138232/is-it-a-good-practice-to-use-try-except-else-in-python

raise Exception

...
raise ValueError("Value not typed")

assert

decimal_number = ...
...
assert isinstance(decimal_number, int)

file

f = open("dir_and_file.extension", "r")
contents = f.read()
...
f.close()
with open("dir_and_file.extension", "r")) as f:
    contents = f.read()
with open("dir_and_file.extension", "r")) as f:
    one_line = f.readlines()
    ...
with open("dir_and_file.extension", "w", encoding = "utf8)) as f:
    data = ...
    f.write(data)

os

import os
os.mkdir("log)

dir

if not os.path.isdir("log") # 현재 sys.path에 log가 없으면
    is.mkdir("log)
import pathlib

cwd = pathlib.Path.cwd()
cwd.parent
list(cwd.parents)
list(cwd.glob("*"))

#use with list

pickle

f = open(“file.pickle”, “wb”) dta = … pickle.dump(data, f) f.close()

f= open(“file.pickle”, “rb”) data = pickle.load(f) f.close()

class 저장하기 등…

logging

import logging

logging.debug(str_arg) logging.info(str_arg) logging.warning(str_arg) logging.error(str_arg) logging.critical(str_arg)

debug: 개발처리 기록 info: 처리 진행 되는 동안 알림(서버 로그 등) warning: 의도치 않은 정보 입력이 들어옴. exception으로 예측한 값이 들어옴. 어쨌든 처리는 했음. error: 프로그램은 돌아감. 처리 에러가 남. client가 요청한 파일 없음 등 critical: 프로그램 꺼졌음…

logging level

logger = logging.getLogger(“main”) stream_header = logging.StreamHandler() logger.addHAndler(stream_handler) logger.setLevel(logging.DEBUG) logger.setLevel(logging.CRITICAL)

config parser

# config.cfg

[Sect 1]
key1: val
key2: val
[Sect 2]
key3: val
[Sect 3]
key5: val

# .py
import configparser
config = configparser.ConfigParser()
config.sections()

config.read('config.cfg')
config.sections()

... = config['Sect1']['key1']

argparser

import argparse def argFunc(): parser = argparse.ArgumentParser(description=”show description to users”)

parser.add_argument('--key', type = int, default = ..., metavar = 'K', help = 'description of this option')
...

args = parser.parse_args() argFunc()

logging formats

logging.Formatter(‘%(asctime)s %(levelname)s %(process)d %(message)s’)

py 5-2 data handling

import csv reader = csv.reader(f, delimiter=’,’, quotechar=’”’, quoting = csv.QUOTE_ALL)

정규식

  • saerch
  • findall

파이썬 활용: https://www.w3schools.com/python/python_regex.asp

regular expression

beautiful soup

from bs4 import BeautifulSoup
soup = BeautifulSoup(books_xml, 'lxml)
soup.find_all(str_arg)
soup.find(str_arg).get_text()
...

json

import json
with open('file.json', 'r', encoding = 'utf8') as f:
    data = f.read()
    dict = json.loads(data)

dict_data = { key : val, ...}
with open('file.json', 'w' ) as f:
    json.dump(dict_data, ff)

import requests
r = requests.get(url = ...)
status = r.json()

#use status as dictoinary...

numpy

comparison

a = np.array...
b = np.array...

a > b
a == b
# return boolean np array
# return each true and false

all and any

np boolean array에서 True의 개수에 따라…

a = np.arange(...)
np.any(a > num)
# return boolean
np.all(a > num)
# return boolean

comparison : logical_

a = boolean array...
b = boolean array...

np.logical_and(a, b)
# for each index, true if both brue

np.logical_and(a)
# reversed boolean array

np.logical_or(a, b)
# for each index, true at least one is True.

tmp1 = a > b #booelan array
tmp2 = a < b #booelan array

# the two are same below.
np.logical_and(tmp1, tmp2)
np.logical_and(a> b, a < b)

np.where(condition, [true, false])

a = np.array...
np.where(a > 0, 3, 2)

# for each index, if true map 3, false map 2

np.where(a, 3)
# return array with True index

np.isnan(a)
# return boolean array

np.isfinite(a)
# return booelan array
# infinite number False

fancy index

a = np.array...

# booelan index
i = np.array([True, False, ...],bool)
a[i] # return only True index

# int index
i = np.array([1, 4, 6, ...], int)
a[i] # return corresponding index as list

통계학 맛보기

  • 데이터가 특정 확률분포를 따른다고 선험적으로(a priori) 가정한 후 그 분포 를 결정하는 모수(parameter)를 추정하는 방법을 모수적(parametric) 방 법론이라 합니다

  • 특정 확률분포를 가정하지 않고 데이터에 따라 모델의 구조 및 모수의 개수 가 유연하게 바뀌면 비모수(nonparametric) 방법론이라 부릅니다

  • 기계적으로 확률분포를 가정해서는 안 되며, 데이터를 생성하는 원리를 먼 저 고려하는 것이 원칙입니다

  • 각 분포마다 검정하는 방법들이 있으므로 모수를 추정한 후에는 반드시 검정을 해야 한다

  • MLE why log?
    • 경사하강법으로 가능도를 최적화할 때 미분 연산을 사용하게 되는데, 로그 가능도를 사용하면 연산량을 O(n^2) 에서 O(n) 으로 줄여줍니다
  • categorical distribution MLE

When there are d categories, $$ \begin{aligned} \mathcal & = \sum_i^n \sum_k^d \log \theta_k^{I{x_i = k}}
& = \sum_k^d n_k \log \theta_k^{I{x_i = k}}
& = \sum_k^{d-1} n_k \log + n_d \log \theta_{d}
& = \sum_k^{d-1} n_k \log + n_d \log ( 1 - \sum_k^{d-1} \theta_k )
\frac{ \mathcal}{\theta_k} & = \frac{n_k}{p_k} + \frac{-n_d}{1-\sum_k^{d-1} \theta_k} = 0
\hat p_k & = \frac{n_k}{n_d}(1-\sum_k^{d-1} \theta_k)
& = \frac{n_k}{n_d}p_d
\sum p_k & = 1.\

    \sum \hat p_k & = 1\\
    \implies \sum_k \frac{n_k}{n_d}p_d & = 1\\
    p_d & = \frac{n_d}{\sum n_k}\\
    p_k & = \frac{n_k}{n_d}p_d\\
    & = \frac{n_d}{\sum n_k} \frac{n_k}{n_d}\\
    & = \frac{n_d}{\sum n_k}
\end{aligned} $$

이렇게 풀지 않고… 일반적인 표현은 라그랑지 풀이법을 쓰는 것. \(\max_\theta \mathcal{l}(\theta)\\ s.t. \sum \theta = 1\)

라그랑지 상수를 적용하면 모양 자체는 비슷하게 나온다. 결국 d개의 parameter중에서 1개가 나머지 parameter들로 선형 종속되는 형태로 나옴. 라그랑지 승수를 정리하는 모양에서 조금 달라지긴 하지만 아이디어는 같다. 사실 라그랑지를 쓰는게 정석적인 방법 같은데, 생각 못하던 표현이었음.

reference http://www.iro.umontreal.ca/~slacoste/teaching/ift6269/A17/notes/lecture4.pdf https://math.stackexchange.com/questions/421105/maximum-likelihood-estimator-of-parameters-of-multinomial-distribution

  • multinomial districution의 combination factor은 상수라서 어차피 MLE 구할 때 노상관 됨 + convex 함수!

베이즈 정리

  • liklihood: 현재 파라미터에서 데이터의 분포를 예측
  • priori: 데이터를 보기 전 사전에 예측/가정/가설로 세워보는 분포

  • 베이즈 정리와 metric의 의미와 연결시킬 수 있음.

  • 정보의 갱신

  • 인과관계 추론

인과관계 기반 예측: 정확도가 엄청 높지는 않지만 데이터 분포가 변화해도 어느정도의 정확도를 유지할 수 있음.

조건부 기반 예측은 데이터 분포 바뀌면 그냥 망한다.

인과관계 기반 예측 모델: 중첩요인(confusion factor)을 제거해야 함. 키가 크면 머리가 좋다.

중첩요인을 제거하면 패러독스를 제거할 수 있음.

Comments