코야온니의 티스토리 :)
[패스트캠퍼스] BDA 부트캠프 학습일지_3주차 본문
3주차 (0703-0707)
패스트캠퍼스 데이터 분석 부트캠프
데이터 분석을 위한 핵심 Tool Python ( 온라인 강의 1 - 초격자 데이터 사이언스)
프로그래밍
컴퓨터에게 일을 시키는 과정
구성 요소
1. 코드: 프로그래밍 언어의 문법 / 의미론 (* 잘못 쓰면 실행 X)
2. 컴퓨터: 코드를 수행함.
- CPU (연산 담당) → instruction cycle을 계속 돌며 프로그램 실행
- Memory (데이터, 프로그램)
- I/O Device
파이썬
특징
- 프로그래밍 언어의 일종
- 인터프리터 기반: 컴파일러 기반과 달리 코드를 짧게 line by line 실행 가능 ∴ 느리지만 유연함
- 데이터 분석 / 프로토타입 개발에 유리
- PyPI라는 오픈소스 라이브러리 → 확장성 우수함
데이터 타입
사람이 사용하는 데이터를 컴퓨터가 이해 가능하게 규격화한 것 ( 데이터를 담을 수 있는 그릇 역할 )
→ 컴퓨터가 이해, 소통 및 계산 가능
종류
int (정수), float (실수), str (문자열), list (변경 가능 데이터 그룹), tuple (변경 불가능 데이터 그룹), set (집합), dict (찾을 수 있는 값 key-그에 해당하는 정의 value의 store 방식)
파이썬 주요 함수
공통적인 특징
: 사용에 주의해야 됨 → : 이후의 statement는 그 조건에 걸리는 걸 정의하며 Block을 나눌 수 있음
1) IF 함수
조건에 따라 명령을 수행하는 statement (조건문)
∴ 조건문을 이용하는 것 = 의사결정을 하는 것
if condition :
<statement>
<statement>
...
elif condition :
<statement>
...
else :
<statement>
...
* 주의점: 조건에 빠지는 게 없는지 체크 (ex/ list의 처음과 끝의 원소를 indexing 함) - edge case에서 자주 에러남
2) for, while 함수
조건에 따라 반복 작업을 수행하는 statement (반복문)
프로그래밍에서 중요한 것: 조건과 반복 ∴ 단순 X / 의도한 *어떤* 작업을 반복하게 할지 고안해야 됨
조건문 + 반복문 설계 → 프로그램의 logic 구성
for: 횟수에 따른 반복 수행 (특정 횟수 지정 or sequence를 반복)
for iterator in iterable_object: ''' iterator: 변수, iterable_object: 시퀀스
<statement>
<statement>
...
while: 조건에 따른 반복 수행 (조건이 만족하는 동안 수행)
while condition:
<statement>
<statement>
...
3) 함수
input (parameter: a,b, ...)를 받아 output을 돌려주는 하나의 기능을 하는 코드 묶음
def function1 (a, b) :
something = ...
<statement>
<statement>
...
return something '''끝을 의미
result = function1 (3,5) '''function call (정의된 함수를 사용해 code block 내의 코드를 실행하는 것)
함수 만드는 법
- 기존 코드를 설계할 때부터 함수로 작성
- 재구조화 (refactoring): 기능을 하는 코드 만들고, 잘 실행되는 것을 확인한 후 보충해감
* 중요: 어떤 input으로 어떤 output을 낼지 잘 세팅해야 됨
함수의 구조화 ↑ → 가독성↑, 유지보수하기 쉬워짐 (재사용성 향상) → 코드의 생산성 향상
파이썬 주요 개념
1) I/O
Input: 데이터 입력 (함수 사용) '''stdin
→ Output: 출력 결과 '''stdout
a = input ("숫자를 하나 입력하세요 : ")
print (a)
>>> 숫자를 하나 입력하세요 : 5
>>> '5'
file 형태의 input: 읽기 위해 file I/O (스토리지-프로그램 사이 I/O) 처리 필요함
with open( "data/a.txt", 'r' ) as f:
data = f.readlines ()
- with open() 함수로 코드가 존재하는 같은 경로 안의 폴더에서 텍스트 파일을 쉽게 불러올 수 있음
- mode: 'r', 'w', 'a' → read, write, append (뒤에 데이터 추가)
- 데이터 타입에 따라 필요한 라이브러리 달라짐
* 주의점: file 크면 성능 저하 가능함
2) OOP
Object-Oriented Programming (객체 기반으로 프로그래밍을 만드는 방법론)
매커니즘
1. 객체 ---추상화---> Class // 2. Class ---구체화---> 객체
- Object(객체): 실제 사물 하나하나
- Class: 사물들이 공유하는 속성 (variable: class를 기술하는 정보를 나타내는 변수, method: 특징을 설명하는 기능)
- 개념의 추상화: 구현하고자 하는 대상에 대하여 불분명한 형태 (형태O / 구체적X)로 개념들을 프로그램에 옮기는 것
- 개념의 구체화: Class를 하나하나 개별인 사물, 객체를 만드는 것
다양한 특징
1. 상속: superclass의 모든 개념을 subclass가 이어받아 class variable / method도 그대로 받아서 구현함
∴ 하위에서 필요한 것만 추가, 수정할 것만 수정
2. 다형성: 상속받으면 기능을 다르게 구현 가능.
즉, Class의 하나의 기능을 나타내는 개념이 상속되어 subclass로 구현시 다양한 결과 나옴
3. 은닉화, 추상화: Class 내부의 variable, method 보지 않아도 기능을 사용하는데 문제 없음 ∴ 재사용성 ↑
장점
- 생산성 ↑ : 데이터와 기능을 모두 갖추는 Class를 잘 설계하면 재사용 가능
- 자연적인 모델링 : 일상의 개념을 그대로 구현
- 재사용성 ↑ : 상속으로 재사용성 극대화
- 유지보수 용이성 ↑ : Class가 다르게 구현돼 다른 기능에 영향 ↓
∴ 파이썬은 open-source library를 손쉽게 이용할 수 있음
3) Class
OOP에서 구현하려는 개념을 추상화한 코드 템플릿으로, 구현 대상의 특성과 기능을 명확히 정의해야 됨
생성자( constructor )를 이용해서 객체 형태로 찍어낼 수 있음.
class Human (superclass): '''Human : 상속 받을 class명
def __init__ (self, name, weight): '''Constructor 구현, 객체는 self라는 변수를 가짐(자기 자신을 구분 O)
self.name = name
self.weight = weight ''' 불러온 객체의 이름 및 무게
...
def gain_weight (self, a, b):
tmp_weight = self.weight + a
<statement>
...
return tmp_weight
>>> object1= Human("kim", 70)
>>> object1.name
>>> "kim"
>>> object1.gain_weight(5,7)
>>> 75 '''twp = self (70) + a(5) = 75
파이썬 라이브러리
Numpy / Pandas → 데이터 전처리, Seaborn, Matplotlib, Pyplot → 데이터 시각화
# 없는 라이브러리 설치 가능
!pip install '라이브러리명'
# 자주 사용하는 라이브러리 별칭(alias) 설정
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
1) Numpy
Numpy란? 최적화된 C code 구현하여 파이썬 한계를 개선하는 라이브러리 (np.어쩌구)
Numpy 중요한 이유:
- 수치 연산: 파이썬은 실수값 연산에 오류 많아 머신러닝에서 성능 저하로 이어짐 → Numpy는 수치적 안정성 보장
- 벡터 연산: 한 데이터 타입 사용하여 N개의 실수로 이루어진 벡터값 연산 가능 → 빠른 처리 가능
** 데이터 분석은 벡터 연산이므로 Numpy 중요
Numpy array : Numpy의 기본적인 자료 구조 ( 여러 숫자를 다루기 위한 구조 )
- List와 비슷하나 세부적으로 다름
- 차이점:
- 선언 이후 크기 변경 불가능
- ** 모든 원소의 데이터 타입(float, int) 동일 ( 연산 고정된다고 보장 O ∴ 고려 사항이 빠짐 )
- 공통점: 인덱싱으로 원소 접근, 생성 이후 update 가능
- 특징
원소 크기 조절 → 크기에 따라 수치 범위 정해짐 ( 메모리 크기↓ - 수치 범위↑ 사이 적절한 값 찾아야 함)
(ex/ np.int8 : 수치 표현 8bits → 2^8개 → -128~127 / np.float32 : 실수 표현 32 bits )
2) Pandas
Pandas란? DataFrame 형태로 되어 정형 데이터 분석에 최적화된 라이브러리 (pd.어쩌구)
- 장점
- 정형 데이터의 효율적 표현 O ( 데이터 조작 : indexing, filtering, reshaping, concatenation, read, writing )
- 테이블 형태의 정제된 데이터 존재 ( 분석 O )
- html, csv, sql, xlsx 등의 정형 데이터가 모두 DataFrame 통일 → 다양한 데이터 통합 관리 가능
- 벡터 연산에 최적화 (Numpy와 연관됨) → 대용량에도 성능 우수
- 엑셀의 연산 기능 거의 다 제공 O
Pandas DataFrame : Pandas의 기본적인 자료 구조
표 (컬럼, 로우) → 2차원 테이블 구조 ( Series: 컬럼 하나, 로우 하나 → 1차원 구조도 가능 )
객체 변수: index (행), columns (열), values (값)
- Relational DB와 호환 가능
- 한 칼럼을 기준으로 모든 원소의 데이터 타입 동일
- Numpy array를 상위 호환하는 개념 ( 내부 구현체로 Numpy 사용 → universal function 사용 가능 )
3) 시각화 라이브러리
1. Seaborn matplotlib을 기반으로 matplotlib의 개념을 확장한 통계적 데이터 시각화 라이브러리
- numpy, pandas 등 파이썬 라이브러리의 시각화를 중점 + DataFrame 직접적 지원 → matplotlib보다 편하게 데이터 분석 시각화 가능
- 다양한 기본 plot (lineplot, boxplot, jointplot, pairplot) → 빠른 통계 분석 가능 ( 특히, EDA )
2. matplotlib MATLAB의 기능 → 파이썬
- 파이썬의 시각화 라이브러리
- figure에 component (위의 파란 글씨) 추가하여 그래프 완성
- pyplot 이용 (빠르게) 또는 OOP-style (데테일하게) 이용
3. Pyplot
장점: 깔끔함, 코드에 있는 값들 바로 사용 가능
단점: 엑셀 그래프 대비 수정하기 어려움
# 불러오는 방법
import matplotlib.pyplot as plt
or
import matplotlib as mpl
# 실행 방법
plt.figure() ''' 도화지 깔고
plt.plot( [0,1,2,3,4], [1,2,4,8,16] ) ''' 리스트를 기준으로 하는 선 그리고
plt.show() ''' plot 보여주는 코드임.
# 실제 파이썬 구현 예시
#1. sample data 만들고 막대그래프 그리기
x=["americano", 'cafe latte', 'vanilla latte', 'cold brew', 'flat white']
y=[1463, 301, 866, 905, 274]
plt.figure(figsize=(8, 6)) #()사이에서 옵션 조정 가능함
# 모든 component는 plt.figure 이후, plt.show 이전에 추가해야 됨
plt.grid(alpha=0.3, color='black', linewidth=0.5) # 격자 추가
plt. title('Coffe Sales', fontsize=14, loc='left') # 차트 제목 추가
plt.xlabel('Menu') # x축 제목 추가
plt.ylabel('Sales') # y축 제목 추가
plt.ylim(0,2000) # 최소, 최대값 범위 추가
plt.yticks([num for num in range(0,1600,200)]) # 눈금 추가
plt.bar(x,y, color='lightcoral', label='Sales')
plt.plot([100,200,400,800,1600], label='Average')
plt.legend(loc='best') # label=''와 같이 사용하여 라벨 표시
plt.show()
#2. sample data 만들고 Scatterplot 그리기
import numpy as np
x=np.random.random(100)
y=np.random.random(100)
plt.figure(figsize=(6,6))
plt.scatter(x,y, color='orange', marker='<', s=15, alpha=0.3)
plt.show()
#3. Subplot으로 여러 plot 그리기
plt.figure()
plt.subplot(1,2,1)
plt.plot([0.1,0.3,0.5])
plt.subplot(3,2,2)
plt.plot([0.6,0.3,0.4])
plt.subplot(3,2,4)
plt.bar([1,2,3],[3,2,1])
plt.subplot(3,2,6)
plt.scatter([1,2,3,4,5],[5,3,4,2,4])
plt.show()
#4. DataFrame으로 plotting
import pandas as pd
x=["americano", 'cafe latte', 'vanilla latte', 'cold brew', 'flat white']
y=[1463, 301, 866, 905, 274]
df=pd.DataFrame({"Menu":x,"Count":y})
df.plot(kind='barh', x='Menu', y='Count')
or df
데이터 분석을 위한 핵심 Tool Python ( 온라인 강의 2 - 직장인을 위한~)
파이썬 기초 문법
사칙연산
- 더하기 + , 빼기 -
- 나눗셈 / , 곱하기 *
- 몫 // , 나머지 % ( 몫, 나머지 한번에: result = divmod(10, 3) 이라면 result[0] → 3, result[1] → 1 )
- 거듭제곱 ** ( 2**2 → 4 )
조건문
a = 10
if a > 1 :
print('a 는 1보다 큽니다!')
>>> a 는 1보다 큽니다!
반복문
# for문
for a in [1,2,3]:
print(a)
>>> 1 2 3
# while문
a = 0
while a < 3:
a = a + 1
print(a)
>>> 1 2 3
함수
def와 return을 사용한 함수 선언
def sum(a, b):
c = a + b
return c
sum(1, 2) ''' 위에서 선언한 함수 실행
>>> 3
자료형의 종류
숫자형(int, float), 문자열(str), 참/거짓(bool), 리스트(list), 튜플(tuple), 딕셔너리(dict), 집합(set)
→ 변수 : 자료형의 값을 담는 그릇 ( 변수 이름: 알파벳+숫자/언더바 ex/ var_2 등 )
- 종류
1. 숫자형: 숫자(Number) 형태로 이루어진 자료형
항목 | 항목Python 표현 예시 |
정수형 (int) | 100, -100, 123, -123, 0 |
실수형 (float) | 100.5, -100.5, 10e3, 10e5 |
복소수 | 1 + 2j, 10j, -10j |
8 진수 | 0o25, 0o34 |
16 진수 | 0xFF, 0x2A |
강제 지정 가능 :
a = int(1.0)
print(a)
>>> 1
a = float(-1)
print(a)
>>> -1.0
2. 문자형: 문자(String) 형태로 이루어진 자료형
큰따옴표 "" 와 작은 따옴표 '' 를 활용해서 문자열을 만들 수 있음
#1. 여러줄 표현
c = """Life is too short,
You need Python
My life would be so long!
"""
#2. 문자열 안에 따옴표
c = "Life is too short, You need 'Python'"
#3. 문자열 더하기
head = "Python"
tail = " is fun!"
head + tail
>>> Python is fun!
#4. 문자열 슬라이싱
c = "Life is too short, You need Python"
c[0]
>>> L
c[-2]
>>> o
c[0:4]
>>> Life
#5. 문자열 나누기
split_c = c.split(' ') ''' 공백 기준으로 나누어짐
split_c
>>> ['Life', 'is', 'too', 'short,', 'You', 'need', 'Python']
split_c[0]
>>> Life
3. 논리형: 참/거짓(Boolean) 형태의 자료형
- True, False 조건과, 아무것도 없다는 뜻인 None 타입
- Python 에서는
- 1 값: True
- 0과 None 값: False
a = True
if a:
print('True!')
>>> True! ''' a=False라면 출력 시 아무 값도 나오지 않음
4. 리스트형: 요소(값)의 모음 형태의 자료형입니다
- 묶고 싶은 요소(값)들을 대괄호 ([ ]) 를 사용하여 감싸주어 만듦
- 리스트명 = [요소1, 요소2, 요소3, ...] ex/ a = [1, 2, 3, 4]
- Python 의 모든 자료형을 리스트의 요소로 담을 수 O
a = [1,2,3]
#1. 리스트 더하기
b = [4,5,6]
a + b
>>> [1, 2, 3, 4, 5, 6]
#2. 리스트 값 바꾸기
a[0] = 4
a
>>> [4, 2, 3]
#3. 리스트 요소 추가
a.append(4)
a
>>> [1, 2, 3, 4]
#3. 리스트 요소 제거
a.remove(4)
a
>>> [1, 2, 3]
#4. 리스트 요소 삽입
a.insert(1,4)
a
>>> [1, 4, 2, 3]
#5. 리스트 정렬
a.sort(reverse=True) ''' reverse: 내림차순
a
>>> [3, 2, 1]
#6, 리스트 위치 반환
a.index(2) ''' 2가 어느 인덱스에 존재?
>>> 1
#7. 리스트 개수 세기
a = [1,1,2,3]
a.count(1)
>>> 2
#8. 리스트 길이 파악
len(a)
>>> 3
4. 튜플형
- 리스트형과 거의 비슷하지만, 변수를 읽기 전용( 삭제, 수정 불가능 ) 으로 만들고 싶을 때 사용합
- 묶고 싶은 요소(값)들을 괄호 (( )) 를 사용하여 감싸주어 만듦
- 튜플명 = (요소1, 요소2, 요소3, ...) ex/ a = (1, 2, 3, 4)
5. 딕셔너리형: 키(Key) - 값(Value) 쌍 모음 사전 형태의 자료형
- 리스트나 튜플과 다르게 순서가 없음
- 빠르게 값을 찾을 수 있음
- 키와 값 쌍들을 중괄호 ({ }) 를 사용하여 감싸주어 만듦
- 딕셔너리명 = {'Key1': Value1, 'Key2': Value2, ...} ex/ a = {'a' : 1, 'b' : 2 }
- 키(Key) 는 문자형/튜플, 값(Value) 은 모든 자료형을 담을 수 있음
a = {'Bulldog': 'dog', 'Munchkin' : 'cat'}
#1. 키 검색
a.keys()
>>> dict_keys(['Bulldog', 'Munchkin'])
#2. 값 검색
a['Bulldog']
>>> dog
#3. 값 추가
a['Poodle'] = 'dog'
a
>>> {'Bulldog': 'dog', 'Munchkin': 'cat', 'Poodle': 'dog'}
#4. 값 변경
a['Bulldog'] = 'cat'
a
>>> {'Bulldog': 'cat', 'Munchkin': 'cat', 'Poodle': 'dog'}
#5. 요소 삭제
del a['Bulldog']
a
>>> {'Munchkin': 'cat', 'Poodle': 'dog'}
#6. 모두 삭제
a.clear()
a
>>> {}
6. 집합형: 순서가 없고, 중복이 허용되지 않는 자료형입니다
- 묶고 싶은 요소들을 중괄호 ({ }) 를 사용하여 감싸주어 만듦
- 집합명 = {요소1, 요소2, 요소3, ...} ex/ a = {1, 2, 3}
b = {'H', 'E', 'L', 'L', 'O'}
b
>>>
{'E', 'H', 'L', 'O'}
#1. 집합 표현 가능
a = {1,2,3,4,5}
b = {4,5,6,7,8}
# 교집합
a & b
>>> {4, 5}
# 합집합
a | b
>>> {1, 2, 3, 4, 5, 6, 7, 8}
# 차집합
a - b
>>> {1, 2, 3}
#2. 다른 자료형으로 변환 가능
a = {1,2,3,4,5}
print(type(a))
a = list(a)
print(type(a))
>>> <class 'set'>
<class 'list'>
제어문과 함수
1. 조건문
- 조건에 따라 참과 거짓을 판단하는 문장
- 비교 연산자를 기준으로 참/거짓을 판단 → 조건문 안에 있는 동작문을 순차적으로 실행
- 비교 연산자: >, <, >=, <=, ==, !=
- 논리 연산자: A and B, A or B, not A (A, B: 비교 연산자를 사용한 조건문)
- 그 밖의 연산자: A in / not in " 리스트 / 튜플 / 문자열 "
# if, elif, else 문
#1. 비교 연산자
sleepy = True # 조건문
if sleepy == True:
print("커피를 마신다") # 동작문 A
else:
print("차를 마신다") # 동작문 B
>>> 커피를 마신다
#2. in 연산자
status = ['happy', 'angry', 'sleepy']
if 'sleepy' in status:
print("커피를 마신다")
elif 'sad' in status:
print("술을 마신다")
else:
print("차를 마신다")
>>> 커피를 마신다
2. 반복문
- 조건문이 거짓이될 때 까지 반복을 명령하는 구문
- for 문: 변수를 받아 반복 / while 문: 일정 조건까지 반복
# while문
sleepy = True
awake_point = 3 # 잠이 깨는 시점
num_coffee = 0
while sleepy==True: # 조건 1 : 잠이 오면, 아래 실행
num_coffee = num_coffee + 1
print('커피를 {} 잔 마셨습니다!'.format(num_coffee))
if num_coffee >= awake_point: # 조건 2 : 잠이 깨는 시점이 되면, 아래 실행
sleepy = False
print('더이상 잠이 오지 않습니다')
if num_coffee >= max_coffee: # 조건 3 : 커피가 떨어지면, 아래 실행
print('커피가 다 떨어졌습니다')
break
>>> 커피를 1 잔 마셨습니다!
커피를 2 잔 마셨습니다!
커피를 3 잔 마셨습니다!
더이상 잠이 오지 않습니다
# for 문
drink = ['커피', '차', '물']
for item in drink:
print('{} 을(를) 마셨습니다!'.format(item))
if item=='차':
break
>>> 커피 을(를) 마셨습니다!
차 을(를) 마셨습니다!
3. 함수
- 입력 값을 받아서 일정한 처리를 진행하고 출력값을 반환하는 장치
- 반복되는 작업을 묶어서 재사용 할 수 있도록 해주기 때문에 매우 중요
- 기본 문법
- def 함수명(입력인수):
return 출력인수
- def 함수명(입력인수):
def drink_beverage(drink):
for item in drink:
print('{} 을(를) 마셨습니다!'.format(item))
drink_beverage(['커피', '차', '물']) ''' 함수 사용 1
drink_beverage(['콜라', '사이다', '우유']) ''' 함수 사용 2
>>> 커피 을(를) 마셨습니다!
차 을(를) 마셨습니다!
물 을(를) 마셨습니다!
콜라 을(를) 마셨습니다!
사이다 을(를) 마셨습니다!
우유 을(를) 마셨습니다!
# return 추가하여 출력값 활용하기
return len(drink), drink[-1]
num_drink, last_drink = drink_beverage(['커피', '차', '물'])
print('총 {} 잔 마셨습니다'.format(num_drink))
print('마지막으로 {} 을(를) 마셨습니다'.format(last_drink))
>>> 총 3 잔 마셨습니다
마지막으로 물 을(를) 마셨습니다
입력과 출력
1. 입력: input()
favorite = input('당신이 가장 좋아하는 것은 무엇입니까?')
2. 출력: print()
print('{ }와 { }는 빠릅니다'.format(favorite, '비행기'))
or print( f'{favorite}는 빠릅니다')
.format( 변수 ) or f'{ 변수 }를 통해 { }안에 변수의 값을 출력할 수 있음
3. 파일 읽고 쓰기
- 파일 생성하기
- open 을 사용해 새 파일을 만들 수 있음 → open 이후 반드시 close
- 파일 열기 모드
- r : 읽기 모드 (수정 불가)
- w : 쓰기 모드
- a : 추가 모드 (파일의 마지막에 내용 추가)
f = open('new_file.txt', 'w')
f.close()
- 파일 쓰기
f = open('new_file.txt', 'w')
for i in range(1, 11):
f.write('{}번째 줄입니다\n'.format(i))
f.close()
- 파일 읽기
f = open('new_file.txt', 'r')
for line in f.readlines():
print(line)
f.close()
>>> 1번째 줄입니다
2번째 줄입니다
...
10번째 줄입니다
파이썬 고급 기능
1. List Comprehension
- 리스트를 빠르고 쉽게 생성할 수 있음
- 기본 문법
- 리스트형 = [변수 for 변수 in [변수1, 변수2, 변수3, ...]]
- 리스트형 = [변수 for 변수 in [변수1, 변수2, 변수3, ...] if 조건문 ]
new_list = [elem for elem in range(10) if (elem % 2) == 1]
new_list
>>> [1, 3, 5, 7, 9]
2. 예외 처리
- 오류가 발생할 때 오류를 무시하거나, 오류 유형에 따라 이후 조치를 추가해 주는 기능
- 기본 문법
- try문: 우선적으로 실행할 구문 ...
- except문 : 오류 발생 시 실행할 구문 ...
def error_function(input):
for i in range(10):
try:
result = input / i
print(result)
#1. 오류 무시
except:
pass
error_function(10) >>> 10/0 이라는 오류는 무시하고, 10/1부터 실시됨.
#2. 예상되는 예외만 지정하여 처리
except ZeroDivisionError: # 0으로 나누었을 때 발생하는 에러만 무시
pass
error_function('10') >>> 1번 방법과 달리 문자열을 넣어 발생하는 오류도 감지할 수 있음.
3. 프로그램 모듈화
- 작성한 Python 코드를 실제 동작할 수 있는 프로그램처럼 만드는 방법
- 모듈화된 코드 → 다른 외부 장치에서도 import / 실행 가능
- 기본 모듈화 과정
- 프로그램 내용이 담긴 main() 함수를 만들어 줍니다
- if __name__=="__main__": 구문을 코드 가장 하단에 추가해 줍니다
- main() 함수를 추가된 구문에 들여쓰기를 맞춰서 실행될 수 있도록 합니다
- .py 파일을 만들어 주고, 프로그램 내용을 붙여넣습니다
- .py 파일을 실행합니다
# 모듈화 샘플 코드 (1~3 과정)
def main():
item = input('당신이 가장 좋아하는 것은 무엇입니까?')
print('저도 {} 을(를) 참 좋아합니다!'.format(item))
if __name__=="__main__":
main()
# module_sample.py 파일 만든 이후 프로그램 실행 (4~5 과정)
!python module_sample.py
Numpy
데이터 슬라이싱과 정렬
1. 배열 생성하기
# 리스트 → numpy 변환
mylist = [[1,2,3], [4,5,6]]
np.array(mylist)
# 데이터 타입 지정
np.array([1,2,3], dtype=int / float )
# 자체 생성 함수
np.ones((3,3)) >>> [ 1,1,1 ] * 3
np.zeros((3,3)) >>> [ 1,1,1 ] * 3
np.eye(3,3) >>> [ 1,0,0 ] , [ 0,1,0 ] , [ 0,0,1 ]
np.full((3,3), 10) >>> [ 10,10,10 ] * 3
np.random.rand(3,3) >>> [ 랜덤값,랜덤값, 랜덤값 ] * 3
# 등간격 배열 생성
np.arange(2, 10, 2) >>> array([2, 4, 6, 8]) ''' 2부터 10 미만까지, 2 간격
np.linspace(1, 10, 5) >>> array([ 1. , 3.25, 5.5 , 7.75, 10. ]) ''' 1~10 사이의 5개의 값
2. 슬라이싱
- arr[ 행(row) 인덱스, 열(column) 인덱스, ... N축 인덱스]
arr = np.array([[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12],
[13, 14, 15, 16]])
arr[0] or arr[0,:] >>> array([1, 2, 3, 4]) ''' 1행 슬라이싱
arr[:,0] >>> array([ 1, 5, 9, 13]) ''' 1열 슬라이싱
arr[0:2, 1:3] >>> array([[2, 3], [6, 7]]) ''' 1,2행, 2,3열 슬라이싱
3. 인덱싱
# Fancy 인덱싱 ( 지정 Index 위치만, 리스트 [ ] 로 지정 )
arr[[0,2,3],:] ''' 1, 2, 4행 인덱싱
arr[:,[0,1,2]] ''' 1, 2, 3열 인덱싱
arr[[0,1],[0,1]] ''' 1,2행, 1,2열 인덱싱 (겹치는 부분만)
# Boolean 인덱싱 ( 조건을 만족하는 값만 )
bool = np.array([[True, True, True, True],
[False, False, False, False],
[True, True, True, True],
[False, False, False, False]])
arr[bool] >>> array([ 1, 2, 3, 4, 9, 10, 11, 12])
arr[arr>10] >>> array([11, 12, 13, 14, 15, 16])
4. 유용한 Numpy 함수
# 최소값, 최대값 print(np.min(arr), np.max(arr)) >>> 1 16
# 최소값, 최대값 인덱스 print(np.argmin(arr), np.argmax(arr)) >>> 0 15
# 전체 합, 평균 print(np.sum(arr), np.mean(arr)) >>> 136 8.5
# 특정 값 인덱스 np.where(arr==5) >>> (array([1]), array([0]))
5. 배열 차원 변환 * 변환하려는 차원과 크기가 맞지 않지 않으면 에러 발생!
# 1차원 -> 2차원 변환
arr1 = np.arange(10)
arr2 = arr1.reshape(2,5) or arr2 = arr1.reshape(2,-1)
>>> array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
# 2차원 -> 1차원 변환
arr1 = arr2.reshape(1,-1)
>>> array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
6. 정렬
# 1차원 정렬
arr = np.array([10,2,3,4,6,5,7,8,1,9])
np.sort(arr) >>> array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) ''' 오름차순
np.sort(arr)[::-1] >>> array([10, 9, 8, 7, 6, 5, 4, 3, 2, 1]) ''' 내림차순
# N 차원 정렬
arr = np.array([[11, 9, 11, 12],
[8, 9, 5, 7],
[3, 1, 2, 4],
[14, 16, 13, 15]])
#1. 행 방향 (위에서 아래로)
np.sort(arr, axis=0) >>> array([[ 3, 1, 2, 4], [ 8, 9, 5, 7], [11, 9, 11, 12], [14, 16, 13, 15]])
np.sort(arr, axis=0)[::-1] >>> array([[14, 16, 13, 15], [11, 9, 11, 12], [ 8, 9, 5, 7], [ 3, 1, 2, 4]])
#2. 열방향 (왼쪽에서 오른쪽으로)
np.sort(arr, axis=1) >>> array([[ 9, 11, 11, 12], [ 5, 7, 8, 9], [ 1, 2, 3, 4], [13, 14, 15, 16]])
np.sort(arr, axis=1)[::-1] >>> array([[13, 14, 15, 16], [ 1, 2, 3, 4], [ 5, 7, 8, 9], [ 9, 11, 11, 12]])
Matrix 연산과 성능
- 대부분의 정형 데이터 세트는 행렬 형태로 이루어짐
- 행렬 연산: 딥러닝 분석에서 가장 자주 쓰이는 연산 중 하나
- Python 을 이용한 행렬 연산은 Numpy 가 가장 성능이 좋음
1. 행렬의 덧셈과 뺄셈: 연산되는 두 행렬의 차원이 같아야 함
arr1 + arr2
arr1 - arr2
2. 행렬의 곱셈과 나눗셈
- Element-wise 연산 : 연산되는 두 행렬의 차원이 같아야 함
arr1 * arr2
arr1 / arr2
- * 내적 연산(Dot Product) : 연산되는 앞행렬(열)과 뒤행렬(행) 차원이 같아야 함.
arr1 = np.array([[1, 2, 3, 4],
[5, 6, 7, 8]]) ''' 2*4
arr2 = np.array([[1, 2],
[5, 6],
[9, 10],
[13, 14]]) ''' 4*2
np.dot(arr1, arr2)
>>> array([[ 90, 100],
[202, 228]])
3. 행렬 집계 함수
합계(np.sum), 최대(np.max), 최소(np.min), 평균(np.mean), 표준편차(np.std)
- np.sum(arr, axis=0) : 행방향
- np.sum(arr, axis=1) : 열방향
4. Broadcasting 연산
저 차원 배열의 연산 → 고차원 배열로 확장
arr3d = np.array([[[0,1],[2,3],[4,5],[6,7]], [[8,9],[10,11],[12,13],[14,15]], [[16,17],[18,19],[20,21],[22,23]]])
arr2d = np.array([[0,1],[2,3],[4,5],[6,7]])
#1. 고차원으로 맞춰서 연산
arr3d + arr2d
>>>
array([[[ 0, 2], [ 4, 6], [ 8, 10], [12, 14]], [[ 8, 10], [12, 14], [16, 18], [20, 22]], [[16, 18], [20, 22], [24, 26], [28, 30]]])
#2. 단일 값 브로드캐스팅도 가능
arr2d + 10
arr2d * 10
arr2d / 10
>>> 각 값에 10을 더하고, 곱하고, 나눈 값이 출력
'데이터 분석 부트 캠프 > 학습 일지' 카테고리의 다른 글
[패스트캠퍼스] BDA 부트캠프 학습일지_7주차 (0) | 2023.08.04 |
---|---|
[패스트캠퍼스] BDA 부트캠프 학습일지_6주차 (0) | 2023.07.28 |
[패스트캠퍼스] BDA 부트캠프 학습일지_4주차 (0) | 2023.07.13 |
[패스트캠퍼스] BDA 부트캠프 학습일지_2주차 (0) | 2023.06.27 |
[패스트캠퍼스] BDA 부트캠프 학습일지_1주차 (0) | 2023.06.23 |