안녕하세요 늑대양입니다 :)
오늘은 [AI 데이터 사이언티스트 취업 완성 과정]의 8일차 일과를 정리하여 안내해드리도록 하겠습니다.
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/001.gif)
Day 8. 시간표:
- 온라인 학습: [한 번에 끝내는 데이터 사이언스]
- 워크시트 작성 및 제출: 마감기한: 9월 2일 (금) 13:00
- 오프라인 강의: [프로그래밍 실전 : Python]
Day 8. 온라인 학습 범위:
- 7강
- 예상 학습 시간: 3:34:19
대주제(Part) | 중주제(Chapter) | 소주제(Clip) |
Part.3 파이썬 기초와 데이터분석 | Chapter.01 파이썬 프로그래밍 | CH01_09. 함수 (이론) |
Part.3 파이썬 기초와 데이터분석 | Chapter.01 파이썬 프로그래밍 | CH01_10. 함수 (실습) |
Part.3 파이썬 기초와 데이터분석 | Chapter.01 파이썬 프로그래밍 | CH01_11. IO (이론) |
Part.3 파이썬 기초와 데이터분석 | Chapter.01 파이썬 프로그래밍 | CH01_12. IO (실습) |
Part.3 파이썬 기초와 데이터분석 | Chapter.01 파이썬 프로그래밍 | CH01_13. OOP (이론) |
Part.3 파이썬 기초와 데이터분석 | Chapter.01 파이썬 프로그래밍 | CH01_14. Class (이론) |
Part.3 파이썬 기초와 데이터분석 | Chapter.01 파이썬 프로그래밍 | CH01_15. Class (실습) |
Chapter.01 파이썬 프로그래밍:
09. 함수(이론):
함수(Function): 한 가지의 기능을 하는 코드 묶음, input을 받아서 처리하고 Output을 돌려주는 코드
- 함수(function)는 기능(function)을 의미합니다
- 함수의 input을 parameter (또는 argument)라고 합니다
- 함수는 input을 받아서 주어진 기능대로 처리한 뒤, output을 return 합니다
- 정의한 함수를 사용하는 것을 function call이라고 합니다
# function definition syntax example
def function1(a, b):
something = ...
<statement>
<statement>
...
...
return something
result = function1(3, 5)
- def <function_name> (<parameter1>, <parameter2>, ... **)**의 형태로 함수 prototype을 정합니다
- 함수를 호출하면 정의한 code block 내의 코드를 실행합니다
- 함수의 input인 parameter에 어떤 값이 들어오고 어떤 결과를 return할지 잘 정해야합니다
(parameterization) - 함수를 사용하면 코드를 구조화하기 쉽습니다
- 코드의 구조화가 잘되어 있으면, 가독성도 높고 유지/보수를 하기가 편합니다
- 기존 코드를 설계할 때부터 함수로 작성하는 경우도 있고, 우선 기능을 하는 코드를 만든 다음에 재구조화를 하는 경우도 있습니다
- 이러한 작업을 Refactoring 이라고 합니다
- 구조화된 코드는 코드의 재사용성(Reusability)가 향상됩니다. → 코드의 생산성 향상!!
Key Points:
- 함수를 정의해서 사용할 때도, : 사용이 중요합니다.
- 함수를 사용하는 이유는 코드의 재사용성을 높이기 위해서 사용합니다.
- 함수들의 구조를 잘 짜면 유지보수하기 쉬운 좋은 코드를 만들 수 있습니다
10. 함수 (실습):
11. IO (이론):
I/O : Input/Output의 약자로 컴퓨터가 데이터를 입력받고 출력하는 모든 작업을 의미합니다
- 프로그램 입장에서 들어오는 모든 데이터를 Input, 나가는 모든 데이터를 Output이라고 합니다
- 메인 메모리 입장에서 생각하는 들어오고 나가는 모든 데이터에 대해서 I/O 처리라고 부릅니다. (단, CPU와의 소통은 제외)
- 사용자로부터 키보드로 입력받는 것을 stdin 이라고 하며, 사용자에게 다시 결과를 모니터로 보여주는 것을 stdout 이라고 합니다
# stdin/stdout example
a = input("숫자를 하나 입력하세요 : ") # input 함수는 뭐든 str로 받아옵니다.
print(a)
>>> 숫자를 하나 입력하세요 : 5
>>> '5'
- 프로그램은 메인 메모리 상에서 존재하기 때문에, 스토리지로부터 파일을 불러오는 것도 input이고, 프로그램의 결과를 스토리지에 저장하는 것도 output 입니다
- 스토리지와 프로그램 사이의 I/O를 file I/O 라고 합니다
# filein/fileout example
with open("data/a.txt", 'r') as f:
data = f.readlines()
- 파이썬에서는 with open() 함수를 통해서 텍스트 파일을 쉽게 불러올 수 있습니다.
- ‘r’, ‘r’, ‘a’ 등의 mode를 바꿔서 파일을 다른 옵션으로 열 수 있다 (read, write, append)
- 다른 타입의 파일을 열기 위해선 다른 라이브러리들이 필요합니다
e.g. png, jpg 파일을 열기 위해 PIL, opencv 라이브러리를 사용할 수 있다
e.g. pk, pkl 파일을 열기 위해 pickle 라이브러리를 사용할 수 있다
e.g. csv, excel 파일을 열기 위해 pandas, csv, openpyxl 라이브러리를 사용할 수 있다. (파일 타입이 binary라서 'rb'를 써야함) - I/O가 데이터 처리를 할 때, 가장 느린 파트이기 때문에 신경써줘야 합니다
(Performance bottleneck)
Key Points:
- 파이썬에서 키보드로 데이터를 입력하려면 input 함수를 사용해야 합니다.
- 파일로 된 데이터를 읽어오려면 file I/O 처리가 필요합니다. 어떤 타입의 데이터를 읽어오느냐에 따라 필요한 라이브러리가 달라집니다.
- file의 사이즈가 크면, file I/O가 데이터 처리에 치명적인 성능 저하를 가져올 수 있습니다.
12. IO (실습):
13. OOP (이론):
OOP: Objective-Oriented Programming의 약자로 객체(Object)를 기반으로 프로그램을 만드는 방법론입니다
- OOP는 실제 세상을 표현하고 있는, 여러가지 개념들을 프로그램으로 옮겨서 구현할 수 있기 위한 컨셉의 프로그래밍 패러다임(paradigm)입니다.
→ 개념의 추상화(abstraction) - 객체(object)라는 개념은 실제 사물 하나 하나를 의미할 수 있고, 이러한 사물들이 공유하는 속성을 정의한 것을 클래스(Class)라고 합니다
- 기존 방식은 데이터(변수, variable)와 데이터를 처리하는 기능(함수, function)이 독립적이었지만, OOP는 이를 하나의 개념(Class)로 묶어서 생각하기 때문에 그 객체가 처리되는 기능을 자연스럽게 정의할 수 있습니다
- Class에는 Class를 기술하는 정보를 나타내는 변수인 Class variable과 Class의 특징을 설명하는 기능인 Class method를 포함합니다
- 추상적인 개념 Class를 실제로 사용하려면 하나 하나의 개별 사물로 만들어야 하는데, 이를 개별 사물인 객체(objec)라고 합니다
→ 개념의 구체화(instantiation) - 위와 같은 개념을 살려 프로그램을 만드는 방식은 OOP의 장점은 다음과 같습니다
OOP의 장점:
- 클래스 구조를 잘 설계하면 라이브러리 형태로 재사용이 쉬워진다
→ 생산성 향상 - 일상 생활에 존재하는 개념을 그대로 프로그램에 구현 가능하다
→ 자연적인 모델링 - 클래스의 상속의 개념 때문에, 프로그래밍 자체의 재사용성이 극대화된다
→ 재사용성 증가 (상속) - OOP를 이용하여 개발을 하게되면, 다른 기능을 수정하더라도 클래스가 서로 다르게 구현되어 있어 다른 기능에 끼치는 영향이 매우 적어질 수 있다
→ 유지보수 용이성 증가
Inheritance(상속):
- 클래스는 개념의 추상화이기 때문에, 해당 개념을 계승하는 하위 개념을 만들 수 있습니다
- 상위/하위 개념이 상대적으로 존재하며, 상속하는 클래스는 superclass, 상속받는 클래스는 subclass라고 얘기합니다.
- subclass는 superclass의 모든 개념을 이어받기 때문에, class variable, class method도 그대로 이어받습니다.
Polymorphism(다형성):
- 여러 하위 클래스가 같은 Class method를 상속받게 되면, 그 기능을 다르게 구현할 수 있습니다
- 예를 들어 Animal 이라는 Class에 Speak()이라는 method가 있다면, 이 기능은 다른 동물을 표현하는 subclass들마다 다르게 구현될 수 있습니다
→ Dog: “Woof”, Cat: “Meow”, Cow: “Moo” - 이렇게 하나의 기능을 나타내는 개념이 실제 구현해서 다양한 형태로 표현 가능한 것을 Polymorphism이라고 합니다
- 이러한 다형성을 구현할 수 있는 기능을 Method Overriding 이라고 합니다
Abstraction(추상화):
- Abstraction(추상화)는 Class 내부에 구현된 Class variable이나 Class method를 직접 보지 않아도 개념상으로 사용할 수 있게 하는 개념입니다
- 기능에 대한 명세나 변수의 의미만 확실하게 알면, 내부 구현은 살펴보지 않아도 됩니다
Encapsulation(은닉화):
- Encapsulation은 Class variable과 Class method까지 단일 개념으로 구성되어 있어, 사용자가 개념 구현의 혼선을 막고 심플하게 사용할 수 있게 만드는 특징을 말합니다
- Encapsulation이 잘되면 사용자는 Class의 내부 구현 코드를 보지 않아도 내부 데이터와 기능을 사용하는데 아무런 문제가 없습니다
- 우리가 사용해왔던 모든 함수들, Data type들의 내부 구현 코드를 보지 않아도 개념적으로 이해하고 사용할 수 있는 이유도 Encapsulation이 잘되기 때문입니다
- List.append()를 예로 들 수 있습니다
Key Points:
- OOP는 대규모 코드의 유지/보수를 편리하게 하기 위해서 생긴 프로그래밍 방법론입니다.
- OOP는 구현하고자 하는 대상을 Class로 저의하여 코드를 구현할 수 있게 해줍니다.
- 다양한 특징들이 Class를 통해서 구현된 코드가 재사용되기 편하게 해줍니다.
- 이러한 이유로 잘 만들어진 open-source library들을 손쉽게 이용할 수 있습니다.(**)
14. Class (이론):
Class: OOP에서 구현하려는 개념을 추상화한 코드 템플릿
- Class를 이용해서 구현하려는 개념을 객체(object)의 형태로 찍어낼 수 있습니다
- 구현하려는 대상의 특성을 Class variable로, 대상이 수행해야 하는 일을 Class method로 구현해야 합니다
- Constructor(생성자)를 통해서 객체를 찍어내는 틀을 정의할 수 있습니다
# Python Class example
class class_name(superclass): # 상속을 받고 싶을 때, 상속받을 클래스 이름을 파라미터로 지정.
def __init__(self, name, weight): # Constructor!, 규칙!
self.name = name
self.weithgt = weight
...
def method1(self, a, b):
tmp_weight = self.weight + a
<statement>
...
return tmp_weight
>>> object1 = class_name("Kim", 70) # class_name(): __init__ method call
>>> object1.name
>>> "Kim"
>>> object1.method1(5, 7)
>>> 75
- 생성자는 init() 함수를 이용하여 구현합니다.
- 구현되는 객체는 self 라는 자체 변수를 가집니다. self는 말 그대로 객체 자기 자신을 지칭합니다.
- self 변수를 통해서 모든 객체는 자기 자신을 구분할 수 있습니다.
- Class method도 self 변수를 이용하여 객체를 구분합니다.
- self는 Class variable이기 때문에 하나의 Class 내에서 통용됩니다.
- Class도 역시 재사용성을 고려하여 디자인되어야 합니다.
- Class를 구현할 때 제일 중요한 포인트는 “어떤 특성과 어떤 기능을 구현할 것인가" 입니다.
ML/DL Project 실무에서의 활용:
- Tensorflow/Keras template: https://github.com/Husseinjd/keras-tensorflow-template
- Pytorch template: https://github.com/victoresque/pytorch-template
GitHub - Husseinjd/keras-tensorflow-template: The template serves for automation in training and evaluation of Deep learning m
The template serves for automation in training and evaluation of Deep learning models for competitions. - GitHub - Husseinjd/keras-tensorflow-template: The template serves for automation in trai...
github.com
GitHub - victoresque/pytorch-template: PyTorch deep learning projects made easy.
PyTorch deep learning projects made easy. Contribute to victoresque/pytorch-template development by creating an account on GitHub.
github.com
Key Points:
- 구현하려는 대상의 특성과 기능을 명확하게 정의합니다.
- OOP의 개념을 명확하게 하여, 기능별 구현 사항을 명확하게 정의합니다. (명세 사항)
15. Class (실습):
Day 7. 프로그래밍 실전 : Python
프로젝트는 크게 세 가지 진행:
1. EDA 프로젝트: 제공되는 데이터로 진행
2. 모델링 프로젝트: 열려있는 대회가 있으면 참여 (독려)
3. 파이널 프로젝트: 기업 연계 프로젝트 (기업에서 제공하는 주제) 트랙별로 하나를 선정하려고 노력함, CV, 자연어처리, 추천시스템
4. 함수 (실습):
- 파이썬은 확장성 짱짱!
- 쉽게 짤 수 있다!
- 남들이 무료로 짜둔 공개된 코드가 매우 많다 (오픈소스 라이브러리)
사용하게될 오픈소스 라이브러리:
- 웹 크롤링 관련: beautifulsoup4, requests, selenium, ...
- 데이터분석 관련: numpy, pandas, matplotlib, seaborn, plotly, ...
- 머신러닝 관련: scikit-learn, optuna, imblearn, tslearn, yellowbrick, ...
- 딥러닝 관련: tensorflow, pytorch, pytorch-lightning, hydra, wandb, ...
여러 언어들이 있지만 그중에서도 파이썬이 압도적으로 쉽게 사용 가능!!
데이터, 머신러닝 분야에선 파이썬이 압도적으로 코드가 많음
오픈소스 라이브러리에 익숙해지도록 하자!
영어를 봤을 때, 기분이 안나쁘면 좋다!
불친절하게 생겨보이는 정확한 설명서를 읽을 줄 알아야한다.
밑바닥부터 다 만드는 것보다 나와있는걸 활용해서 원하는 걸 제대로 구현할 수 있는 것이 중요!!
보고 하면 된다!! 이걸 믿고 갑시다!!
파이썬에 이미 정의되어 있는 함수들을 사용해보자!
Python math library 공식 페이지: https://docs.python.org/3/library/math.html
math — Mathematical functions — Python 3.10.6 documentation
math — Mathematical functions This module provides access to the mathematical functions defined by the C standard. These functions cannot be used with complex numbers; use the functions of the same name from the cmath module if you require support for co
docs.python.org
- 파이썬 공식문서(혹은 모든 기술문서)를 볼 때, 버전을 가장 먼저 확인하자!
- 기술문서는 영어로 보도록하자!
- 기술문서는 정확하게 서술해야 하므로 처음 읽는다면 불편할 수 있다 > 익숙해지도록하자!
# 함수 실습 예제
# Version 확인 명령어
!python --version
!conda --version
>Python 3.8.13
conda 4.12.0
# 수학 계산을 해봅시다.
import math
# 절대값, 올림, 내림
# sin, cos
round(3.1415927, 3)
print(math.sin(math.pi))
print(math.cos(math.pi))
>3.142
1.2246467991473532e-16
-1.0
주피터 노트북 단축키:
단축키를 사용하려면 [Esc] 키 부터 눌러야 단축키 입력 가능 (셀 내에서 작업 중일 때는 단축키 사용 불가능)
- A: 위에 셀 추가
- B: 아래 셀 추가
- dd: 셀 삭제 (정확하게 말하면 잘라내기)
- z: 실행 취소 (주피터 기본으로는 2~3개 가능)
- M: 셀 선택 후, M 키를 누르면 마크다운 셀로 형식 변경
- Y: 셀 선택 후, Y 키를 누르면 코드 셀로 형신 변경
- 1, 2, 3, 4 번을 통해, h1, h2, h3, h4 로변경 가능 (코드셀, 마크다운 셀 무관)
# 함수 실습 예제 - 2
# 복권 숫자를 만들어봅시다.
import random
lotto = []
for n in range(6):
lotto.append(random.randint(1, 46))
lotto
>[38, 38, 13, 46, 24, 29]
# 다양한 사전들을 써봅시다.
import collections
collections.defaultdict()
>defaultdict(None, {})
collections.defaultdict(int)
>defaultdict(int, {})
D = collections.defaultdict(int) # 초기값 설정이 필요한 경우 defaultdict 사용!!
words = ['a', 'b', 'a', 'b', 'c']
for word in words:
D[word] += 1
D
>defaultdict(int, {'a': 2, 'b': 2, 'c': 1})
## 예전에 학습했던 방식
# for word in words:
# if word in D:
# D[word] += 1
# else:
# D[word] = 1
# 불러올 때, 좀 덜 귀찮게 불러오기!
from collections import default dict
D = defaultdict(int)
코드를 외우지 말고 이해하자
모듈: 함수들이 들어가 있는 묶음
클래스: (약간)추상적인 개념
구현체: 클래스 개념에서 옴
구현체 관점: 라이브러리 > 모듈 > 클래스 > 함수
이해의 방법:
게임 캐릭터를 만들려고함 (스타크래프트 저글링)
저글링이라는 개념이 있음 (저그 종족이고 체력이 35고 뛰어댕김, 공격가능 등등)
게임 기획자가 디자인 후, 디자이너가 코드로 짬 > 구현을 했다! > 구현된 코드를 구현체! (구현하면 구현체)
추상적인 개념: 저글링!
추상체: 추상적 개념 (말과 글)
구현체: 구현된 코드 (실행되어야만 하는 것은 아니고 코드로 작성되어있어도 구현체, 말과 글을 코드로 작성하면 구현체)
5. I/O (Input / Output):
1. STDIN / STDOUT (Standard IN, Standard OUT):
I/O Device: Input / Output Device
컴퓨터에게 I/O device는 키보드, 마우스 등의 주변기기
컴퓨터 프로그래밍에서의 IO는 (데이터 분석을 할 때 정말 중요) 스토리지와 주고 받는 것으로 이해하자 (데이터가 나가고 들어오고 하는 것)
메인 메모리에 프로그램(컴퓨터에 떠있는 모든 것)이 올라감
스토리지로부터 로딩
로딩: 운영체제가 스토리지로부터 메인 메모리에 올리는 작업
저장: 메인 메모리에 있는 것을 스토리지에 기록하는 작업
다운로드: 웹에서 정보를 가져와서 메인 메모리를 거쳐서 스토리지에 저장하는 작업
외부 주변기기(스피커, 모니터, 마우스등등): 키보드를 이용해 사용자가 입력하는 것을 stdin, 컴퓨터가 모니터에 보여주는 것을 stdout
I/O 관련 크게 세 가지 분류:
스토리지: 데이터가 나가고 들어올 때의 I/O
네트워크: 네트워크를 통해 패킷들이 왔다 갔다 할 때의 I/O
사용자: stdin / stdout
# I/O 실습 예제
# a에 키보드로 입력받은 값을 할당하고 출력해본다.
a = input("아무거나 입력해주세요. ")
a, type(a)
a + 3
>아무거나 입력해주세요. 7
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Input In [4], in <cell line: 5>()
2 a = input("아무거나 입력해주세요. ")
3 a, type(a)
----> 5 a + 3
TypeError: can only concatenate str (not "int") to str
# input()을 통한 문자열 더하기
a = input("아무거나 입력해주세요. ")
a, type(a)
a + '3'
>아무거나 입력해주세요. 5
'53'
# 입력받는 값을 숫자라고 가정한 경우.
a = int(input("숫자를 아무거나 하나 입력해주세요. "))
a + 3
>숫자를 아무거나 하나 입력해주세요. 7
10
# Q. 만약에 stdin으로 여러 개의 숫자가 들어오는 경우, 입력의 format을 알고 있다고 가정했을 때, 이를 효과적으로 처리할 수 있을까?
# 이는 숫자를 2개로 가정한 경우
input("숫자를 2개 입력해주세요. e.g. 3,4: ")
>숫자를 2개 입력해주세요. e.g. 3,4: 4, 5
'4, 5'
# split() 활용
input("숫자를 2개 입력해주세요. e.g. 3,4: ").split(',')
>숫자를 2개 입력해주세요. e.g. 3,4: 30,50
['30', '50']
# for 문을 곁들인
# 빈칸을 넣어도 int안에 들어가면 날려주므로 무관!
L = input("숫자를 2개 입력해주세요. e.g. 3,4: ").split(',') # ['30', '50']
for i in L:
print(int(i))
>숫자를 2개 입력해주세요. e.g. 3,4: 30,50
30
50
# a, b 각각 리스트의 원소 할당!
a, b = input("숫자를 2개 입력해주세요. e.g. 3,4: ").split(',')
print(int(a) + 10)
print(int(b) + 10)
>숫자를 2개 입력해주세요. e.g. 3,4: 30,40
40
50
# I/O 실습 예제 - 2
L = input("숫자를 여러개 입력해주세요. e.g. 3, 4, ...: ").split(',')
for i in L:
print(int(i))
>숫자를 여러개 입력해주세요. e.g. 3, 4, ...: 1,2,5,7, 10, 12, 3,4
1
2
5
7
10
12
3
4
#
L = input("숫자를 여러개 입력해주세요. e.g. 3, 4, ...: ").split(',')
L2 = []
for i in L:
L2.append(int(i))
L2
>숫자를 여러개 입력해주세요. e.g. 3, 4, ...: 1, 5, 7
[1, 5, 7]
# pythonic 하게 짜보자!
L = input("숫자를 여러개 입력해주세요. e.g. 3, 4, ...: ").split(',')
[int(i) for i in L]
>숫자를 여러개 입력해주세요. e.g. 3, 4, ...: 1, 5, 7
[1, 5, 7]
# 이와 같은 표현을 list comprehension이라고 한다.
# 파이썬이 지향하는 코드의 방식/양식
# L에 원소 하나하나를 숫자로 바꾼 값으로 갖고 있는 리스트!
# [(리스트 원소에 대한 표현) for i in ~~~]
[int(i) for i in input("숫자를 여러개 입력해주세요. e.g. 3, 4, ...: ").split(',')]
>숫자를 여러개 입력해주세요. e.g. 3, 4, ...: 1, 5, 7, 10
[1, 5, 7, 10]
# 오른쪽이 다 돌고나면 데이터가 된다!
L3 = [int(i) for i in input("숫자를 여러개 입력해주세요. e.g. 3, 4, ...: ").split(',')]
L3
>숫자를 여러개 입력해주세요. e.g. 3, 4, ...: 1,5,3,9,11
[1, 5, 3, 9, 11]
# 딕셔너리에서도 사용 가능
{k:v for k,v in [(1, 2), [3, 4]]}
>{1: 2, 3: 4}
# 아래와 같이 활용 가능!
coffees = ['아메리카노', '카페라떼', '카페모카', '바닐라라떼', '핸드드립', '콜드브루']
prices = [4100, 4600, 4600, 5100, 6000, 5000]
menu = {coffee:price for coffee, price in zip(coffees, prices)}
menu
>{'아메리카노': 4100,
'카페라떼': 4600,
'카페모카': 4600,
'바닐라라떼': 5100,
'핸드드립': 6000,
'콜드브루': 5000}
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/017.gif)
긴 글 읽어주셔서 감사합니다 :)
'AI > [부트캠프] 데이터 사이언티스트 과정' 카테고리의 다른 글
[Megabyte School : AI 데이터 사이언티스트 취업 완성 과정] Day 10. (0) | 2022.09.02 |
---|---|
[Megabyte School : AI 데이터 사이언티스트 취업 완성 과정] Day 9. (0) | 2022.09.01 |
[Megabyte School : AI 데이터 사이언티스트 취업 완성 과정] Day 7. (0) | 2022.08.30 |
[Megabyte School : AI 데이터 사이언티스트 취업 완성 과정] Day 6. (0) | 2022.08.29 |
[Megabyte School : AI 데이터 사이언티스트 취업 완성 과정] Day 5. (0) | 2022.08.26 |