[TIL]_2025.03.13 본캠프 25일차 (4): 파이썬 종합반 5주차

JIYUU·2025년 3월 13일

01. 파일 불러오기 및 저장하기

1) 파일 확장자

  • CSV 파일 (.csv)
    • CSV (Comma Separated Values) 은 데이터를 쉼표(,)로 구분하여 저장하는 형식
  • Excel 파일 (.xls, .xlsx)
    • 표 형태로 데이터를 저장하는 Microsoft Excel의 형식
  • JSON 파일 (.json)
    • JSON (JavaScript Object Notation) 은 데이터를 효율적으로 저장하는 간단한 형식
  • 텍스트 파일 (.txt, .dat, 등)
    • 일반 텍스트로 된 데이터를 저장하는 파일

2) 확장자에 따른 파일 불러오는 함수

  • 데이터프레임으로 불러오기: pandas 라이브러리의 read_확장자() 함수를 사용
  • 예시
import pandas as pd
df = pd.read_csv('file.csv')

import pandas as pd
df = pd.read_json('file.json')

import pandas as pd
df = pd.read_csv('file.txt', delimiter='\t')  # 만약 탭으로 구분되어 있다면 delimiter='\t'를 사용합니다.
  • colab 환경에서는 내 컴퓨터에서 사용하는 것이 아니기 때문에 구글 드라이브에 파일을 업로드 후, 파일을 마운트하고 불러와야 함
from google.colab import drive
drive.mount('/content/drive')
root = "/content/drive/MyDrive/파일이나 폴더"

import pandas as pd
df = pd.read_excel(root) # root나 기타 다른 변수로 파일 경로를 만들어서 넣어주면 됨

3) 파일 저장하기

  • .csv 파일, .xls, xlsx 파일
import pandas as pd

data = {
    'Name': ['John', 'Emily', 'Michael'],
    'Age': [30, 25, 35],
    'City': ['New York', 'Los Angeles', 'Chicago']
}

df = pd.DataFrame(data)
excel_file_path = '/content/sample_data/data.csv'
df.to_csv(excel_file_path, index = False) 
# index란 맨 왼쪽에 있는 행 번호들인데 보통은 넣는 경우가 거의 없어서 False

print("csv 파일이 생성되었습니다.")
  • JSON 파일 (.json)
import json

data = {
    'Name': ['John', 'Emily', 'Michael'],
    'Age': [30, 25, 35],
    'City': ['New York', 'Los Angeles', 'Chicago']
}

json_file_path = '/content/sample_data/data.json'

# json 파일을 쓰기모드('w')로 열어서 data를 거기에 덮어씌우게 됩니다.
# with를 사용하면 파일을 열고 자동으로 닫아줌
with open(json_file_path, 'w') as jsonfile:
    json.dump(data, jsonfile, indent=4)
# .dump는 덮어씌우는 메소드

print("JSON 파일이 생성되었습니다.")

02. 패키지(라이브러리) 사용하기

1) 패키지란?

  • 패키지는 관련된 여러 개의 모듈(함수)을 포함하는 디렉토리(하나의 폴더)
  • 패키지 안에는 일반적으로 라이브러리나 다른 패키지가 포함될 수 있음
    ex. numpy와 matplotlib
  • 데이터 분석을 위한 파이썬 패키지들은 데이터 수집, 전처리, 시각화, 모델링, 통계 분석 등 다양한 기능을 제공하며 다양한 작업을 수행하는 데 필수
  • 코드의 재사용성을 높이고, 개발 속도를 빠르게 하며, 코드의 가독성을 향상
  • 다른 개발자들이 작성한 코드를 활용함으로써 자신의 프로젝트를 보다 효율적으로 개발 가능
  • 패키지는 맨 처음 파이썬을 사용할 때 필요한 패키지들을 맨 위에 한번에 불러놓고 사용!
# 아래와 같이 보통은 필요한 패키지를 한번에 다 불러온 다음 코딩을 진행합니다

import pandas as pd
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
import seaborn

2) 다양한 종류의 패키지

  • pandas
    데이터 조작과 분석을 위한 라이브러리로, 데이터를 효과적으로 조작하고 분석할 때

  • numpy
    과학적 계산을 위한 핵심 라이브러리로, 다차원 배열과 행렬 연산을 지원

  • matplotlib
    데이터 시각화를 위한 라이브러리로, 다양한 그래프와 플롯을 생성

import matplotlib.pyplot as plt
plt.plot([1, 2, 3, 4], [1, 4, 9, 16])
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.show()
  • seaborn
    Matplotlib을 기반으로 한 통계용 데이터 시각화 라이브러리로, 보다 간편하고 아름다운 시각화를 제공
import seaborn as sns
import pandas as pd
data_sample = pd.DataFrame({'x':[1, 2, 3, 4], 'y':[1, 4, 9, 16]})
sns.barplot(data=data_sample, x='x', y='y')
  • scikit-learn
    머신 러닝 알고리즘을 사용할 수 있는 라이브러리로, 분류, 회귀, 군집화, 차원 축소 등 다양한 머신 러닝 기법을 제공하여 모델 훈련 및 개발 시에 사용

from sklearn.datasets import load_iris # 내가 가져올 함수를 작성
from sklearn.linear_model import LinearRegression

# Iris 데이터셋 불러오기
iris = load_iris()

# Iris 데이터셋에서 특정 범위의 데이터 슬라이싱하기
X_train = iris.data[:,:-1]  # 데이터 값들 추출
print("학습 데이터:", X_train)
y_train = iris.data[:,-1:]  # 정답값 추출
print("학습 데이터:", y_train)

model = LinearRegression()
model.fit(X_train, y_train)
  • statsmodels
    통계 분석을 위한 라이브러리로, 회귀 분석, 시계열 분석, 비모수 통계 등 다양한 통계 기법을 제공
import statsmodels.api as sm
model = sm.OLS(y_train, X_train)
result = model.fit()
print(result.summary())
  • scipy
    과학기술 및 수학적인 연산을 위한 라이브러리로, 다양한 과학 및 공학 분야에서 활용. 선형대수, 최적화, 신호 처리, 통계 분석 등 다양한 기능을 제공
import numpy as np
from scipy.integrate import quad

# 적분할 함수 정의
def integrand(x):
    return np.exp(-x ** 2)

# 정적분 구간
a = 0
b = np.inf

# 적분 계산
result, error = quad(integrand, a, b)

print("결과:", result)
print("오차:", error)
  • tensorflow ⭐
    Google에서 만든 딥러닝 및 기계 학습을 위한 오픈소스 라이브러리로, 그래프 기반의 계산을 통해 수치 계산을 수행하며, 신경망을 구축하고 학습가능. 딥러닝 필수, 주로 기업에서 사용
import tensorflow as tf

input_size = 3

model = tf.keras.Sequential([
    tf.keras.layers.Dense(10, activation='relu', input_shape=(input_size,)),
    tf.keras.layers.Dense(1)
])
model.compile(optimizer='adam', loss='mse')
  • pytorch
    Facebook에서 개발한 딥러닝을 위한 오픈소스 라이브러리. 동적 계산 그래프를 사용하여 신경망을 구축하고 학습가능. 주로 연구용으로 사용

03. 포맷팅(formatting) 사용하기

1) 포맷팅이란?

  • f-string (가장 직관적이고 편함, python 3.6 이상)
    변수와 문자를 다양하게 많이 출력할 때 사용한다.
    변수에 어떤 값이 들어가든, 보여지는 결과의 형태가 그대로이기 때문에
    숫자로만 결과를 설명하는 것보다 이해하기 쉽다.
x = 10
print(f"변수 x의 값은 {x}입니다.")
  • .format 메소드 활용 (예전 방식)
x = 10
print("변수 x의 값은 {}입니다.".format(x))
  • 숫자는 d, 문자는 s로 포맷팅 (더 예전 방식)
x = 10
print("변수 x의 값은 %d입니다." % (x))

04. 리스트 컴프리헨션 ⭐

1) 리스트 컴프리헨션이란?

  • 파이썬에서 리스트를 간결하게 생성하는 방법으로, 반복문이나 조건문을 사용하여 리스트를 생성할 때 사용한다.
  • 데이터 처리 및 변환에 유용하다.
  • 기본 구조
    • 표현식 : 각 항목에 대한 계산, 변환 등
    • 항목 : 반복되는 값
    • iterable : 반복 가능한 객체
    • if 조건문은 선택 사항이나, 조건이 True인 경우에만 리스트에 추가
# 기본적인 구조
[표현식 for 항목 in iterable if 조건문]

2) 리스트 컴프리헨션 예시

# 예시: 1부터 10까지의 숫자를 제곱한 리스트 생성
squares = [x**2 for x in range(1, 11)]
print(squares)  # 출력: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

# 예시: 리스트에서 짝수만 선택하여 제곱한 리스트 생성
even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
print(even_squares)  # 출력: [4, 16, 36, 64, 100]

# 예시: 문자열 리스트에서 각 문자열의 길이를 저장한 리스트 생성
words = ["apple", "banana", "grape", "orange"]
word_lengths = [len(word) for word in words]
print(word_lengths)  # 출력: [5, 6, 5, 6]

# 예시: 리스트 컴프리헨션을 중첩하여 2차원 리스트 생성
matrix = [[i for i in range(1, 4)] for j in range(3)]
print(matrix)  # 출력: [[1, 2, 3], [1, 2, 3], [1, 2, 3]]

05. lambda 사용하기 ⭐

1) lambda(람다)란?

  • 람다 함수(lambda function)는 익명 함수로, 이름 없이 정의되는 간단한 함수
  • 주로 한 줄로 표현되며, 일반적인 함수 정의와는 달리 def 키워드를 사용하지 않고 lambda 키워드를 사용하여 정의
  • 람다 함수는 주로 함수를 매개변수로 전달하는 함수형 프로그래밍에서 유용하게 활용

2) lambda와 함수의 차이점

  • 정의 방식
    • 일반 함수는 def, 람다 함수는 lambda로 정의
  • 구조
    • 일반함수는 여러 줄의 코드로 작성, 람다 함수는 한 줄로 표현 가능
  • 이름
    • 일반 함수는 함수의 이름을 지정하여 호출
    • 람다 함수는 한 번만 사용되거나 임시로 필요한 경우에 사용
  • 사용
    • 일반 함수는 어떤 경우에도 사용가능
    • 람다 함수는 함수를 매개변수로 받거나, 함수를 반환하는 고차 함수, 즉 함수형 프로그래밍에서 사용됨

3) lambda를 쓰는 이유

  • 간결성 : 람다 함수는 코드를 간결하게 만들어준다
  • 익명성 : 이름이 없어, 임시로 필요한 경우에 사용한다. 특히 정렬(sorted), 필터링(filter)과 같은 함수의 매개 변수로 전달할 때 사용
  • 함수형 프로그래밍 : 함수를 값으로 취급하고 다루는 경우 필요하다
  • 가독성 : 간단한 표현식이기 때문에 가독성이 향상되는 경우가 있다

4) lambda 함수의 예시

  • 간단한 덧셈 함수
add = lambda x, y: x + y
print(add(3, 5))  # 출력: 8
  • 제곱 함수
square = lambda x: x ** 2
print(square(4))  # 출력: 16
  • 리스트의 요소 중 짝수만 필터링 (filter 함수 사용)
filter(조건 함수, 반복 가능한 데이터)


numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 출력: [2, 4, 6, 8, 10]
  • 리스트의 각 요소에 대한 제곱 (map 함수 사용)
map(함수, 반복 가능한 데이터)

numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(squared_numbers)  # 출력: [1, 4, 9, 16, 25]

06. glob 사용하기

1) glob란?

  • glob 함수는 파일 이름의 패턴 매칭을 통해 파일을 검색하고, 일치하는 파일들의 리스트를 반환하여, 파일 시스템에서 파일 이름이나 확장자에 따라 파일을 필터링하는 데 사용.
import glob

# 현재 경로의 모든 파일을 찾기
file_list1 = glob.glob('*')

# 단일 파일 패턴으로 파일을 찾기
file_list2 = glob.glob('drive')

# 디렉토리 안의 모든 파일 찾기
file_list3 = glob.glob('sample_data/*')

# 특정 확장자를 가진 파일만 찾기
file_list4 = glob.glob('sample_data/*.csv')

07. os 사용하기

1) os란?

  • os 모듈은 파일 시스템을 관리하고, 디렉토리를 탐색하고, 파일을 조작하는 운영 체제와 상호 작용하기 위한 함수를 제공

  • 주요 기능

    • 파일 및 디렉토리 관리 : 파일 생성, 이름 변경, 삭제 등
    • 경로 관리 : 절대 경로, 상대 경로, 현재 작업 디렉토리 등의 경로 확인 및 경로 정규화 가능
    • 환경 변수 관리 : 시스템의 환경 변수를 가져오거나 설정 가능
    • 실행 관리 : 외부 프로그램을 실행, 현재 프로세스의 종료 등의 작업 수행 가능

2) os 사용 예시

# 현재 작업 디렉토리 가져오기
import os
cwd = os.getcwd()
print(cwd)

# 디렉토리 생성
import os
os.mkdir('sample_data/new_directory')

# 파일 이름 변경
import os
os.rename('sample_data/new_directory', 'sample_data/new_directory2')

# 파일 삭제
import os
os.remove(file_adress)

import os
os.remove('sample_data/data.csv')

# 파일 목록(경로) 가져오기
import os
files = os.listdir('/content')
print(files)

# 경로 조작
import os
path = os.path.join('/content', 'sample_data', 'mnist_test.csv')
print(path)

08. split 사용하기

1) split이란?

  • 문자열이나 경로를 쪼개기 위해 사용하며, 파일 경로로부터 파일 제목을 추출하는 등의 상황에서 사용

  • 문자열을 공백 기준으로 분할하여 리스트로 변환하기

sentence = "Hello, how are you doing today?"
words = sentence.split()
print(words)  # 출력: ['Hello,', 'how', 'are', 'you', 'doing', 'today?']
  • 특정 구분자를 기준으로 문자열을 분할하여 리스트로 변환하기
data = "apple,banana,grape,orange"
fruits = data.split(',')
print(fruits)  # 출력: ['apple', 'banana', 'grape', 'orange']
  • 리스트의 각 항목을 문자열로 결합하기 (split 메서드는 아니지만 함께 알아두도록 해요!)
words = ['Hello,', 'how', 'are', 'you', 'doing', 'today?']
sentence = ' '.join(words)
print(sentence)  # 출력: Hello, how are you doing today?
  • 리스트의 각 항목을 문자열로 결합하되, 특정 구분자를 사용하여 결합하기
fruits = ['apple', 'banana', 'grape', 'orange']
data = ','.join(fruits)
print(data)  # 출력: apple,banana,grape,orange
  • 여러 줄로 이루어진 문자열을 줄 단위로 분할하여 리스트로 변환하기
text = """First line
Second line
Third line"""
lines = text.split('\n')
print(lines)  # 출력: ['First line', 'Second line', 'Third line']
  • 문자열을 공백으로 분할한 후 특정 개수의 항목만 가져오기
sentence = "Hello, how are you doing today?"
words = sentence.split()
first_three_words = words[:3]
print(first_three_words)  # 출력: ['Hello,', 'how', 'are']
  • 문자열에서 공백을 제거한 후 문자열을 리스트로 변환하기
text = "   Hello   how   are   you   "
cleaned_text = text.strip()
words = cleaned_text.split()
print(words)  # 출력: ['Hello', 'how', 'are', 'you']
  • split가 실전에서 사용되는 예시1 : 데이터 불러올때 경로 처리할때 split 사용
    • file_path라는 문자열 변수에 데이터의 경로를 저장하고,
    • split() 함수를 사용하여 문자열을 / 기준으로 분할
    • rsplit() 함수를 사용하여 오른쪽에서부터 최대 1회만 분할하도록 설정하여 파일명과 디렉토리로 나눈다.
    • 분할된 결과를 각각 directory와 filename 변수에 할당하여 출력

09. 클래스 배우기

1) 클래스란?

  • 파이썬 클래스(Class)는 객체 지향 프로그래밍(OOP)의 중요한 개념 중 하나
  • 객체 지향 프로그래밍은 현실 세계의 사물을 모델링하여 프로그래밍하는 방법으로, 이를 통해 코드의 재사용성과 유지보수성을 향상 가능
    클래스는 대문자 카멜 케이스 혹은 파스칼케이스로 작성한다. (대문자로 시작 + 대문자로 시작)
  • 클래스(Class)의 기본 구조
# 아래의 초기값은 반드시 맨 처음에 작성되어야 한다
class ClassName:
    def __init__(self, parameter1, parameter2):
        self.attribute1 = parameter1
        self.attribute2 = parameter2
# self라는 클래스 자기 자신을 나타내는 매개변수는 반드시 작성

    def method1(self, parameter1, parameter2):
    # 메서드 내용 작성
        pass
    • __init__ : 클래스 생성자 메소드, 객체가 생성될 때 호출하여 초기화 작업을 수행
    • 클래스 내부 메소드들은 클래스의 동작을 정의하는 함수
    • 메소드의 첫번째 매개 변수로 self는 무조건 반드시 사용해야한다. 이것은 해당 메소드가 속한 객체를 가리킨다.
  • 클래스와 객체(Object)의 관계
    • 클래스는 객체를 만들기 위한 틀 또는 설계도이며 객체는 이러한 클래스를 이용하여 생성된다.
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 객체 생성
person1 = Person("Alice", 30)
person2 = Person("Bob", 25)
  • 클래스의 다형성(Polymorphism)
    같은 이름의 메서드가 서로 다른 클래스에서 다른 기능을 수행하도록 하는 개념
class Animal:
    def sound(self):
        print("Some generic sound")

class Dog(Animal):
    def sound(self):
        print("Woof")

class Cat(Animal):
    def sound(self):
        print("Meow")

# 다형성 활용
animals = [Dog(), Cat()]
for animal in animals:
    animal.sound()

2) 클래스와 함수의 차이점

  • 공통점 : 클래스와 함수는 모두 파이썬에서 코드를 조직화하고 재사용성을 높이는 데 사용

  • 함수(Function)

    • 함수는 일련의 작업을 수행하는 블록
    • 함수는 일반적으로 입력(매개변수)을 받아들이고 그에 따른 결과를 반환합
    • 함수는 특정한 작업을 수행하는 독립적인 코드 블록으로, 재사용성을 높이고 코드의 가독성을 개선
    • 함수는 클래스와 상관없이 독립적으로 정의
  • 클래스(Class)
    • 클래스는 데이터와 해당 데이터를 처리하는 메서드(함수)를 함께 묶어놓은 것
    • 클래스는 객체 지향 프로그래밍의 핵심 개념으로, 데이터와 데이터를 다루는 코드를 함께 묶어 객체를 생성
    • 클래스는 객체의 상태(속성)와 행위(메서드)를 정의하고 이를 캡슐화하여 객체를 생성 가능
    • 클래스는 상속을 통해 기존 클래스를 확장하고 다형성을 지원하여 유연한 코드 구조를 구현 가능
    • 클래스는 여러 객체를 생성하고 관리함으로써 코드의 구조를 향상시키고 재사용성 증가

3) 클래스의 속성과 메서드

  • 클래스(Class)는 객체(Object)를 생성하기 위한 템플릿이며, 메서드(Method)와 속성(Attribute)을 가진다.

  • 메서드와 속성은 클래스의 행동과 상태를 정의하는 데 사용

  • 메서드(Method)

    • 클래스 내부에 정의된 함수
    • 메서드는 클래스에 속한 함수이며, 특정 작업을 수행하거나 클래스의 상태를 변경하는 역할
    • 메서드는 일반적으로 클래스의 인스턴스(instance)에서 호출되며, 해당 인스턴스의 상태에 따라 동작
    • 일반적으로 self 매개변수를 첫 번째 매개변수로 사용하여 메서드가 속한 인스턴스를 참조
class Car:
    def __init__(self, brand):
        self.brand = brand
    
    def start_engine(self):
        print(f"{self.brand}의 엔진을 가동합니다.")

# Car 클래스의 인스턴스 생성
my_car = Car("Toyota")

# start_engine() 메서드 호출
my_car.start_engine()  # 출력: Toyota의 엔진을 가동합니다.
  • 속성(Attribute)
    • 클래스나 클래스의 인스턴스에 속한 변수
    • 속성은 클래스나 인스턴스의 상태를 나타낸다. 즉, 객체의 데이터를 저장
    • 각 인스턴스마다 고유한 값이 가질 수 있는 인스턴스 속성과 클래스에 속한 공유 속성(static attribute)이 있다
class Dog:

    def __init__(self, name):
        self.name = name  # 인스턴스 속성

# Dog 클래스의 인스턴스 생성
my_dog = Dog("Buddy")
print(my_dog.name)      # 출력: Buddy

4) 클래스가 데이터 분석에서 사용되는 예시

  • 데이터 구조화
    • 클래스를 사용하여 데이터를 구조화하고 데이터 타입을 정의 가능
    • 예를 들어, 주식 데이터를 다룰 때 각 주식을 객체로 표현하고 해당 주식의 종목명, 가격, 거래량 등을 속성으로 정의할 수 있다
class Stock:
    def __init__(self, symbol, price, volume):
        self.symbol = symbol
        self.price = price
        self.volume = volume

# 객체 생성
stock1 = Stock("AAPL", 150.25, 100000)
stock2 = Stock("GOOG", 2800.75, 50000)
  • 데이터 전처리 모듈화
    • 클래스를 사용하여 데이터 전처리 단계를 모듈화하고 재사용 가능한 코드로 만들 수 있다.
    • 예를 들어, 데이터 정규화, 결측치 처리, 이상치 제거 등의 작업을 클래스의 메서드로 구현하여 쉽게 사용할 수 있다.
raw_data = [1,2,4,5,6,87,2,253654]

class DataPreprocessor:
    def __init__(self, data):
        self.data = data

    def normalize_data(self):
        # 데이터 정규화 메소드 작업 수행
        pass

    def handle_missing_values(self):
        # 결측치 처리 메소드 작업 수행
        pass

    def remove_outliers(self):
        # 이상치 제거 메소드 작업 수행
        pass

# 데이터 전처리 객체 생성
preprocessor = DataPreprocessor(raw_data)
preprocessor.normalize_data()
preprocessor.handle_missing_values()
preprocessor.remove_outliers()
  • 모델링과 분석 작업
    • 데이터 분석에서 사용되는 모델링 작업도 클래스를 활용하여 구현 가능
    • 예를 들어, 선형 회귀 모델, 분류 모델, 군집화 모델 등을 클래스로 정의하여 모델의 학습, 예측, 평가 등을 각각의 메서드로 구현 가능
class LinearRegressionModel:
    def __init__(self, data):
        self.data = data

    def train(self):
        # 선형 회귀 모델 학습
        pass

    def predict(self, new_data):
        # 새로운 데이터에 대한 예측 수행
        pass

    def evaluate(self):
        # 모델 평가 수행
        pass

# 선형 회귀 모델 객체 생성
lr_model = LinearRegressionModel(training_data)
lr_model.train()
predictions = lr_model.predict(new_data)
evaluation_result = lr_model.evaluate()

10. 불리언 인덱싱

1) 불리언 인덱싱이란?

  • 불리언 인덱싱(Boolean indexing)은 조건에 따라 요소를 선택하는 방법 중 하나
  • 파이썬에서는 NumPy를 사용하여 불리언 인덱싱을 수행할 수 있고 Pandas에서 데이터를 조건에 맞게 선택할 때 많이 사용
import numpy as np

# 배열 생성
arr = np.array([1, 2, 3, 4, 5])

# 불리언 배열 생성 (조건에 따라 True 또는 False 값을 갖는 배열)
condition = np.array([True, False, True, False, True])

# 불리언 인덱싱을 사용하여 조건에 맞는 요소 선택
result = arr[condition]

# 결과 출력
print("Result using boolean indexing:", result)  # 출력: [1 3 5]

# 불리언 인덱싱을 사용하여 배열에서 짝수인 요소만 선택
evens = arr[arr % 2 == 0]

# 결과 출력
print("Even numbers using boolean indexing:", evens)  # 출력: [2 4]
  • 먼저, 배열 arr과 조건을 담은 불리언 배열 condition을 생성해준다.
  • 그런 다음 불리언 인덱싱을 사용하여 조건에 따라 요소를 선택하고 마지막으로 선택된 요소를 출력하게 된다.
  • 불리언 인덱싱은 데이터 필터링 및 선택에 매우 유용하며, 데이터 분석에서 자주 사용됨

11. 데코레이션 사용하기

1) 데코레이션이란?

  • 데코레이터(Decorator)는 파이썬에서 함수나 메서드의 기능을 확장하거나 수정하는 강력한 도구로 함수나 메서드를 인자로 받아 해당 함수나 메서드를 변경하거나 래핑하는 함수

  • 즉, 기존의 함수를 따로 수정하지 않고도 추가 기능을 넣고 싶을 때 사용

  • 데코레이션은 따로 함수 내부의 구조를 바꾸지 않고 함수 외부에 간단한 명령어를 작성하여 작동이 된다.

  • 사용 예시 1

def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper

@my_decorator
def say_hello():
    print("Hello!")

say_hello()
# 출력 : 
#'Something is happening before the function is called.' 
#'Hello!' 
#'Something is happening after the function is called.'
  • 사용 예시 2 - 텐서플로우(tensorflow)의 @tf.function
    계산량이 적은 작은 연산이 많이 있는 딥러닝 연산을 수행하거나 데이터 연산을 수행할 때 텐서플로우 연산을 사용하는 경우 훨씬 빠른 성능을 제공
import tensorflow as tf

# 계산량이 적은 경우 - 더 빠름
@tf.function  # The decorator converts `add` into a `Function`.
def add(a, b):
  return a + b

add(tf.ones([2, 2]), tf.ones([2, 2]))  #  [[2., 2.], [2., 2.]]

# 계산량이 큰 경우 - 큰 차이 없음 
import timeit
conv_layer = tf.keras.layers.Conv2D(100, 3)

@tf.function
def conv_fn(image):
  return conv_layer(image)

image = tf.zeros([1, 200, 200, 100])

print("Eager conv:", timeit.timeit(lambda: conv_layer(image), number=10))
print("Function conv:", timeit.timeit(lambda: conv_fn(image), number=10))
print("Note how there's not much difference in performance for convolutions")

참고

  • 즉시 실행 모드 (Eager Execution)
    • 즉시 실행 모드는 파이썬 코드를 순차적으로 실행하면서 연산을 즉시 평가하는 방식입니다.
    • 각각의 연산은 실행될 때마다 결과가 즉시 반환되어 사용자가 바로 확인할 수 있습니다.
    • 파이썬의 일반적인 제어 흐름과 함께 사용되며, 디버깅 및 코드 작성이 용이합니다.
    • TensorFlow 2.0부터는 즉시 실행 모드가 기본적으로 활성화되어 있습니다.

  • 그래프 모드 (Graph Mode)
    • 그래프 모드는 파이썬 코드를 그래프로 변환하고, 이를 최적화한 후에 실행하는 방식입니다.
    • 먼저 그래프를 정의하고, 그래프를 실행하기 위해 세션을 통해 입력을 제공해야 합니다.
    • 그래프는 연산의 순서와 의존성을 명확하게 표현하므로, 병렬 실행과 하드웨어 가속화에 최적화되어 있습니다.
    • TensorFlow 1.x에서는 주로 그래프 모드를 사용했으나, TensorFlow 2.0부터는 즉시 실행 모드가 기본으로 제공되어 그래프 모드를 명시적으로 사용하지 않아도 됩니다.

  • 차이점
    • 즉시 실행 모드는 파이썬 코드를 사용하여 연산을 즉시 평가하고 결과를 반환합니다. 반면에, 그래프 모드는 그래프를 먼저 정의하고 세션을 통해 실행해야 합니다.
    • 즉시 실행 모드는 디버깅과 코드 작성이 용이하지만, 그래프 모드는 병렬 실행과 하드웨어 가속화에 최적화되어 있습니다.
    • 즉시 실행 모드는 각각의 연산을 바로 평가하기 때문에 코드를 작성하고 실행하는 데에 편리합니다. 반면에, 그래프 모드는 전체 그래프를 먼저 정의하고 실행해야 하므로 초기 설정이 더 복잡할 수 있습니다.
    • 그래프 모드는 동일한 그래프를 여러번 실행할 때 재사용할 수 있어서 효율적인 반복 작업에 유용합니다.

12. 파이썬 에러 대처법

1) 파이썬 에러 확인하는 법

  • 에러의 예시
Traceback (most recent call last):
    File "codeit.py", line 12, in <module> # 어떤 파일에서 몇번째 줄에 에러가 떴는지를 알려줌
    numbers[right] = temp[left] # 어떤 코드가 잘못 되었는지를 알려줌
TypeError: 'int' object is not subscriptable  # 에러의 종류 : 에러에 대한 세부 정보
  • ‘TypeError’ : 에러의 종류
  • 'int' object is not subscriptable : 정수형을 인덱싱할 때 발생, Squence Type의 데이터가 아닌 정수형의 데이터를 인덱싱 해버리는 코딩 실수를 했음을 추측 가능

2) 대표적인 에러들

1. SyntaxError (구문 오류)

  • 의미 : 코드 문법에 오류가 있음
  • 대처법 : 코드의 문법, 괄호, 따옴표, 콜론, 들여쓰기도 확인

2. IndentationError (들여쓰기 오류)

  • 의미 : 코드 블록의 들여쓰기가 잘못되었다
  • 대처법 : 들여쓰기를 일관되게 수정

3. NameError (이름 오류)

  • 의미 : 정의되지 않은 변수나 함수를 사용할 때 발생
  • 대처법 : 사용된 변수나 함수가 정의되어있는지 확인 (오탈자, 변수명 대소문자 등)

4. TypeError (타입 오류)

  • 의미 : 데이터 타입이 일치하지 않는 연산이나 함수 호출을 시도할 때 발생
  • 대처법 : 연산이나 함수 호출에 사용되는 데이터의 타입을 확인하고 필요한 타입으로 변환한다.

5. IndexError (인덱스 오류)

  • 의미 : 리스트나 튜플에서 존재하지 않는 인덱스로 접근하려 할 때 발생
  • 대처법 : 인덱스 범위 확인

6. KeyError (키 오류)

  • 의미 : 딕셔너리에 존재하지 않는 키를 사용하려 할 때 발생
  • 대처법 : 사용하려는 키가 딕셔너리에 존재하는지 확인

7. FileNotFoundError (파일을 찾을 수 없음 오류)

  • 의미 : 파일을 해당 경로에서 찾을 수 없을 때 발생
  • 대처법 : 파일 경로를 올바르게 지정했는지 확인 (오탈자 등)

3) 위의 예시에 없는 에러의 경우

  • 무조건 구글링을 해본다

0개의 댓글