알면 유용한 파이썬 문법

Suhyeon Lee·2024년 10월 17일
0

목표

  • 알아두면 유용한 문법들을 다양하게 숙지하고 적제적소에 사용한다.

파일 불러오기 및 저장하기

1) 파일 확장자

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

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

※ 아래 코드들은 예시로 임의의 파일제목을 작성한 것으로 실제로는 없는 파일이라 실행되지 않음에 유의 ※

  • CSV 파일 (.csv)
    • 데이터프레임으로 불러오기: pandas 라이브러리의 read_csv() 함수를 사용
import pandas as pd
df = pd.read_csv('file.csv')
  • Excel 파일 (.xls, .xlsx)
    • 데이터프레임으로 불러오기: pandasread_excel() 함수를 사용
import pandas as pd
df = pd.read_excel('file.xlsx')
  • JSON 파일 (.json)
    • 데이터프레임으로 불러오기: pandasread_json() 함수를 사용
import pandas as pd
df = pd.read_json('file.json')
  • 텍스트 파일 (.txt, .dat, 등)
    • 데이터프레임으로 불러오기: pandasread_csv() 함수를 사용
import pandas as pd
df = pd.read_csv('file.txt', delimiter='\t')  # 만약 탭으로 구분되어 있다면 delimiter='\t'를 사용합니다.

파일 포맷과 불러오는 방법에 대한 이해는 파이썬 데이터 분석가로서의 기본적인 지식 중 하나입니다.
위 예시들은 주로 pandas 라이브러리를 사용하여 데이터를 불러오는 방법을 보여줍니다.

  • pandas
    • 파이썬 데이터 분석에서 매우 효과적으로 사용되는 라이브러리
    • 데이터프레임 형태로 데이터를 다루기에 매우 편리

참고: 내가 가지고 있는 데이터 파일을 구글 Colaboratory에서 읽어들이려면

  • ‘드라이브 마운트’ 코드를 이용하여 내 드라이브로 접근한 다음 내가 읽어들이고 싶은 데이터 파일을 구글 드라이브 중에 원하는 폴더 안에 넣고 그 파일이 위치한 경로를 이용하여 파일을 불러와야 함
  • 한번 나갔다가 혹은 로그아웃 했다가 다시 들어오면 드라이브 마운트가 초기화 되므로 구글 드라이브에 있는 파일에 접근할 때는 실행할 때마다 드라이브 마운트를 해줘야 함
# 데이터 파일을 넣은 구글 드라이브 경로 예시: 강사님 컴퓨터
# 제 구글 드라이브 안에 '스파르타코딩클럽_데이터분석을위한파이썬'이라는 폴더가 있는데
# 그 안에 파일을 넣은 상황 입니다.
# 여러분의 폴더 이름에 맞게 경로를 바꾸어 보세요!
root = "/content/drive/MyDrive/스파르타코딩클럽_데이터분석을위한파이썬"
# 그리고 위 경로에 해당 파일 이름도 함께 이어 붙여서 파일 경로를 하나 완성합니다
file_address = root + "/ssec2403(통계표).xlsx"
# 위에서 지정해 놓은 파일 경로를 활용하여 불러오기만 하면 끝!
import pandas as pd
df = pd.read_excel(file_address)

3) 파일 저장하기

  • CSV 파일 (.csv)
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)

print("csv 파일이 생성되었습니다.")
  • Excel 파일 (.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.xlsx'
df.to_excel(excel_file_path, index = False)

print("Excel 파일이 생성되었습니다.")
  • 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 파일을 쓰기모드로 열어서 data를 거기에 덮어씌우게 됩니다.
with open(json_file_path, 'w') as jsonfile:
    json.dump(data, jsonfile, indent=4)

print("JSON 파일이 생성되었습니다.")
  • 텍스트 파일 (.txt, .dat, 등)
data = {
    'Name': ['John', 'Emily', 'Michael'],
    'Age': [30, 25, 35],
    'City': ['New York', 'Los Angeles', 'Chicago']
}

text_file_path = '/content/sample_data/data.txt'

with open(text_file_path, 'w') as textfile:
    for key, item in data.items():
        textfile.write(str(key) + " : " + str(item) + '\n')

print("텍스트 파일이 생성되었습니다.")

패키지(라이브러리)

1) 패키지란?

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

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

2) 다양한 종류의 패키지

  • 패키지들은 각각 고유한 기능과 장점을 가지고 있으며, 데이터 분석 및 머신 러닝, 딥러닝 작업을 위해 널리 사용됨
  • 데이터 분석 프로젝트나 머신 러닝/딥러닝 모델 구축 시에는 데이터의 특성과 목표에 맞게 적절한 패키지를 선택하여 활용하는 것이 중요

pandas

  • 데이터 조작과 분석을 위한 라이브러리
  • 데이터를 효과적으로 조작하고 분석할 수 있도록 도와줌
import pandas as pd
df = pd.read_excel(file_address)
print(df)

numpy

  • 과학적 계산을 위한 핵심 라이브러리
  • 다차원 배열과 행렬 연산을 지원
    • 다차원 → 표로 예를 들면 column이 많다는 뜻
import numpy as np
arr = np.array([1, 2, 3, 4, 5])
print(arr.mean())

matploblib

  • 데이터 시각화를 위한 라이브러리
  • 다양한 그래프와 플롯을 생성
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)

from sklearn.datasets import iris 관련
: 원래는 아래와 같이 써야 하는데 귀찮으니까 짧게 줄여 함수 자체를 바로 가져온 것

import sklearn

sklearn.datasets.load_iris()



### statsmodels
- 통계 분석을 위한 라이브러리
- 회귀 분석, 시계열 분석, 비모수 통계 등 다양한 통계 기법을 제공

```python
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 ★

  • 딥러닝 및 기계 학습을 위한 오픈소스 라이브러리(구글에서 개발)
  • 그래프 기반의 계산을 통해 수치 계산을 수행하며, 신경망을 구축하고 학습할 수 있음
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')

keras는 tensorflow와 통합되었습니다.

pytorch ★

  • 딥러닝을 위한 오픈소스 라이브러리(Facebook(현 meta)에서 개발)
  • 동적 계산 그래프를 사용하여 신경망을 구축하고 학습
import torch
import torch.nn as nn
class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.fc2 = nn.Linear(hidden_size, output_size)
    def forward(self, x):
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        return x

포맷팅(formatting)

  • 문자와 변수를 함께 출력할 때 위와 같이 콤마(,)와 함께 써도 되지만 포맷팅(formatting)이라는 문법을 사용해볼 수 있음
    • 포맷팅 문법도 여러 개가 있는데 그 중 요즘 많이 사용하는 f-string을 활용하는 방법 익혀두기

f-string 포맷팅

  • 문자열 맨 앞에 f를 집어 넣고 내가 놓고자 하는 변수의 위치에 중괄호{}를 사용하여 변수와 함께 기입
x = 10
print(f"변수 x의 값은 {x}입니다.")
  • 코드가 아주 직관적으로 바뀌며 변수와 문자가 다양하게 많이 출력해야 하는 상황에서 훨씬 편리하게 사용 가능
  • 여러 번 콤마를 찍을 필요도 없고 더 깔끔함

format 함수

  • 파이썬 내장함수인 format() 사용
x = 10
print("변수 x의 값은 {}입니다.".format(x))
  • 변수의 위치에 중괄호{}를 넣는 건 f-string 방법과 동일
  • 문자열 맨 뒤에 온점(.)을 찍고 format() 함수를 사용하며 그 함수에 변수를 집어 넣음

% 포맷팅

  • 옛날 방식의 포맷팅
  • % 문자를 사용해 원하는 형식으로 포맷팅
    • '% + 자료형 종류' % 값
x = 10
print("변수 x의 값은 %d입니다." % (x))
  • 변수를 넣을 위치에 %라는 새로운 기호를 쓸 뿐만 아니라 어느 타입의 변수를 넣을 것인지(숫자는 d, 문자는 s)도 써 주어야 함
자료형문자
정수%d
실수%f
문자열%s
8진수%o
16진수%x
%%%
  • 뿐만 아니라, 문자열 맨 끝에 %를 작성한 다음 괄호()안에 변수를 작성해줘야 함

예시

name = "Alice"
age = 25

# %를 사용한 형식 지정
print("이름: %s, 나이: %d세" % (name, age))

# format() 메서드를 사용한 형식 지정
print("이름: {}, 나이: {}세".format(name, age))

# f-string을 사용한 형식 지정 (Python 3.6 이상)
print(f"이름: {name}, 나이: {age}세")

2) 실전 예시 1

데이터 분석 결과물 출력

  • 분석 결과를 설명과 함께 출력하는 코드
# 데이터 분석 결과
num_records = 1000
avg_age = 35.6
median_income = 50000

# 출력 포맷 지정
output_string = f"총 {num_records}명의 레코드가 분석되었습니다. 평균 나이는 {avg_age}세이며, 중위 소득은 {median_income}입니다."

# 결과 출력
print(output_string)

3) 실전 예시 2

AI 모델의 정확도 출력

  • AI모델의 결과가 accuracy라는 변수에 담겨졌다고 가정하고 그 결과를 출력해보기
# 딥러닝 모델의 정확도
accuracy = 0.8765 # 지금은 숫자가 바로 들어갔지만 실전에선 AI의 모델의 결과들을 가지고 따로 계산해서 얻어냅니다.

# 출력 포맷 지정
output_string = f"모델의 정확도는 {accuracy}입니다."

# 결과 출력
print(output_string)

리스트 컴프리헨션

1) List Comprehension

  • 파이썬의 강력한 기능 중 하나로, 데이터 처리 및 변환에 유용하게 활용
  • 리스트를 간결하게 생성하는 방법 중 하나
    • 코드를 더 간결하고 가독성 있게 만듦
  • 보통 반복문과 조건문을 사용하여 리스트를 생성할 때 사용
# 기본적인 구조
[표현식 for 항목 in iterable if 조건문]
  • 표현식: 각 항목에 대한 계산이나 변환을 의미
  • 항목: 반복되는 값
  • iterable: 반복 가능한 객체

2) 예제

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

List Comprehension 없이 풀면 이렇게 됨

squares = []
for i in range(1, 11):
	squares.append(i**2)
print(squares)
# 예시: 리스트에서 짝수만 선택하여 제곱한 리스트 생성
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]]
  • if 조건문은 선택적으로 사용될 수 있으며, 조건이 참일 때만 해당 항목을 결과 리스트에 추가
  • 리스트 컴프리헨션은 루프문과 비교했을 때 코드가 간결하고 가독성이 좋으며, 데이터 처리 및 변환 작업을 더 효율적으로 수행할 수 있도록 도움

lambda

1) 람다 함수(lambda function)란?

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

2) lambda와 함수의 차이점

정의 방식

  • 일반함수
    • def 키워드를 사용하여 명시적으로 함수를 정의
  • 람다함수
    • lambda 키워드를 사용하여 익명 함수를 간단히 정의

구조

  • 일반함수
    • 여러 줄의 코드 블록을 가질 수 있음
  • 람다함수
    • 주로 한 줄로 표현되는 간단한 표현식만을 포함

이름

  • 일반함수
    • 함수의 이름을 지정하여 호출 가능
  • 람다함수
    • 이름이 없기 때문에 한 번만 사용되거나 임시로 필요한 경우에 사용

사용

  • 일반함수
    • 어떤 경우에도 사용할 수 있음
  • 람다함수
    • 주로 함수를 매개변수로 받거나 함수를 반환하는 고차 함수, 즉 함수형 프로그래밍에서 사용

3) lambda를 쓰는 이유

  • 람다 함수는 코드를 간결하게 만들어주고 함수형 프로그래밍에서 유용한 도구로 활용되지만 모든 상황에 적합한 것은 아님
  • 복잡한 기능을 가진 함수나 여러 줄의 코드가 필요한 경우에는 일반 함수를 사용하는 것이 좋음

간결성

  • 코드를 더 간결하게 만들어 줌
  • 특히 간단한 연산이나 조작이 필요한 경우에 유용

익명성

  • 이름이 없기 때문에 임시로 필요한 경우에 사용할 수 있음
  • 정렬이나 필터링과 같은 함수의 매개변수로 전달할 때 많이 사용

함수형 프로그래밍

  • 함수를 매개변수로 받는 고차 함수를 작성하거나 함수를 반환하는 경우에 람다 함수가 효과적으로 사용됨
  • 함수를 값으로 취급하고 함수를 다루는 함수형 프로그래밍 패러다임에서 람다 함수가 필요함

가독성

  • 간단한 표현식을 사용하여 코드를 작성하므로 가독성이 향상될 수 있음
  • 특히 함수가 짧고 명확한 경우 유용

4) 예시

  • 람다 함수는 간단한 함수를 정의하고자 할 때 특히 유용
  • 과도하게 사용하면 코드의 가독성을 해치므로 적절히 활용하는 것이 좋음
    • 하지만! 간단한 수식을 사용하는 경우 아주 유용하기 때문에 데이터 분석 관점에서는 알아두면 좋은 문법임

간단한 덧셈 함수

add = lambda x, y: x + y
print(add(3, 5))  # 출력: 8

제곱 함수

square = lambda x: x ** 2
print(square(4))  # 출력: 16

리스트의 요소 중 짝수만 필터링

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]

filter() 함수

  • 여러 개의 데이터로부터 조건을 충족하는 데이터만 추출할 때 사용하는 내장함수
filter(조건 함수, 반복 가능한 데이터)

리스트의 각 요소에 대한 제곱

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

map() 함수

  • 여러 개의 값을 받아서 각각의 값에 함수를 적용한 결과를 반환하는 내장함수
map(함수, 반복 가능한 데이터)

glob

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')
  • glob 함수를 사용하면 특정 패턴에 맞는 파일을 간단하게 찾을 수 있음
  • 파일 시스템에서 파일을 검색하고 처리하는 데 유용

폴더(디렉토리)에 대한 유용한 개념

  • 폴더를 구분할때는 ‘/’기호를 사용
  • 파일명을 입력해줄 때 반드시 확장자도 함께 입력
  • 일치하는 파일이나 디렉토리의 패턴을 나타낼 때 와일드카드 문자를 사용
    • 와일드카드 문자
      • 주로 파일이나 디렉토리의 이름을 검색하거나 일괄적으로 처리할 때 유용하게 사용
      • * : 0개 이상의 모든 문자와 일치
        e.g. *.txt : 해당 디렉토리에서 텍스트파일 모두 해당
      • 그밖의 와일드카드 문자로 ?, [], {} 등이 있음
        []: 대괄호 안에 포함된 문자 중 하나와 일치
        {}: 중괄호 안에 포함된 문자열 중 하나와 일치

os

1) os 모듈?

  • 운영 체제와 상호 작용하기 위한 다양한 함수들을 제공
  • 파일 시스템을 관리하고, 디렉토리를 탐색하고, 파일을 조작하는 데 사용

주요 기능

  • 파일 및 디렉토리 관리
    • 파일 생성, 이름 변경, 삭제 등의 작업을 수행
    • 디렉토리 생성, 탐색, 삭제 등의 작업을 수행
  • 경로 관리
    • 절대 경로, 상대 경로, 현재 작업 디렉토리 등의 경로를 관리
    • 경로 구성 요소를 조작하고, 경로를 연결하고, 경로를 정규화
  • 환경 변수 관리
    • 시스템의 환경 변수를 가져오거나 설정
  • 실행 관리
    • 외부 프로그램을 실행하거나, 현재 프로세스의 종료 등의 작업을 수행

2) 사용 예시 ☆

파일 및 디렉토리 관리

현재 작업 디렉토리 가져오기

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)

split

1) split란?

  • 리스트의 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']

2) 사용 예시 ★

# 데이터의 경로를 문자열로 표현
file_path = "/usr/local/data/sample.txt"

# split() 함수를 사용하여 디렉토리와 파일명으로 분할
directory, filename = file_path.rsplit('/', 1)
print("디렉토리:", directory)  # 출력: 디렉토리: /usr/local/data
print("파일명:", filename)    # 출력: 파일명: sample.txt
  • file_path라는 문자열 변수에 데이터의 경로를 저장하고, split() 함수를 사용하여 문자열을 / 기준으로 분할
  • 이때, rsplit() 함수를 사용하여 오른쪽에서부터 최대 1회만 분할하도록 설정하여 파일명과 디렉토리로 나눌 수 있음
  • 분할된 결과를 각각 directoryfilename 변수에 할당하여 출력

→ 데이터의 경로를 문자열로 표현하고, split() 함수를 활용하여 필요한 정보를 추출

클래스 배우기

1) 클래스(Class)란?

  • 객체 지향 프로그래밍(OOP)의 중요한 개념 중 하나
    • 객체 지향 프로그래밍?
      • 현실 세계의 사물을 모델링하여 프로그래밍하는 방법
      • 이를 통해 코드의 재사용성과 유지보수성을 향상시킬 수 있음

기본 구조

class ClassName:
    def __init__(self, parameter1, parameter2):
        self.attribute1 = parameter1
        self.attribute2 = parameter2

    def method1(self, parameter1, parameter2):
    # 메서드 내용 작성
        pass
  • __init__ 메서드
    • 클래스의 생성자로, 객체가 생성될 때 호출되며 초기화 작업을 수행
  • 클래스 내부의 메서드들
    • 클래스의 동작을 정의하는 함수
  • 메서드의 첫 번째 매개변수로 self를 반드시 사용해야 함
    • 이는 해당 메서드가 속한 객체를 가리킴

클래스와 객체(Object)의 관계

  • 클래스는 객체를 만들기 위한 틀 또는 설계도
    • 객체는 이러한 클래스를 이용하여 생성됨
# Person 클래스를 정의 → 클래스를 사용하여 여러 사람 객체를 생성
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()

→ Animal 클래스의 sound 메서드를 각각의 하위 클래스인 Dog와 Cat에서 재정의하여 다른 동작을 수행

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

  • 클래스와 함수는 모두 파이썬에서 코드를 조직화하고 재사용성을 높이는 데 사용
  • 목적사용 방법에서 차이가 있음

함수(Function)

  • 일련의 작업을 수행하는 블록
  • 일반적으로 입력(매개변수)을 받아들이고 그에 따른 결과를 반환
  • 특정한 작업을 수행하는 독립적인 코드 블록
  • 재사용성을 높이고 코드의 가독성을 개선
  • 클래스와 상관없이 독립적으로 정의될 수 있음

클래스(Class)

  • 데이터와 해당 데이터를 처리하는 메서드(함수)를 함께 묶어놓은 것
  • 객체 지향 프로그래밍의 핵심 개념
  • 데이터와 데이터를 다루는 코드를 함께 묶어 객체를 생성할 수 있게 함
  • 객체의 상태(속성)와 행위(메서드)를 정의하고 이를 캡슐화하여 객체를 생성하고 다룰 수 있게 함
  • 상속을 통해 기존 클래스를 확장하고 다형성을 지원하여 유연한 코드 구조를 구현
    • 상속(inheritance)
      • 물려주는 클래스(Parent Class, Super class)의 내용(속성과 메소드)을 물려받는 클래스(Child class, sub class)가 가지게 되는 것
      • 자식클래스를 선언할때 소괄호로 부모클래스를 포함시키면 자식클래스에서는 부모클래스의 속성과 메소드는 기재하지 않아도 포함이 됨
  • 여러 객체를 생성하고 관리함으로써 코드의 구조를 향상시키고 재사용성을 높임

왜 클래스를 사용해야 하는가?

  • 코드의 구조화
    • 클래스를 사용하면 관련 있는 데이터와 동작을 묶어서 구조화할 수 있음
    • 코드의 가독성을 높이고 유지보수를 용이하게 함
  • 재사용성
    • 클래스는 객체 지향 프로그래밍의 핵심이며, 이를 통해 코드를 재사용
    • 클래스를 사용하면 비슷한 동작을 하는 여러 객체를 생성할 수 있음
  • 상속과 다형성
    • 클래스는 상속을 통해 기존 클래스를 확장하고 다형성을 지원하여 유연하고 확장 가능한 코드를 작성
  • 캡슐화
    • 클래스는 데이터와 해당 데이터를 처리하는 코드를 함께 묶어 캡슐화
    • 데이터의 무결성을 보장하고 외부로부터의 접근을 제어

캡슐화 (Encapsulation)

  • 객체의 상태를 외부에서 직접적으로 접근하지 못하도록 보호하는 것
  • 파이썬에서는 멤버 변수와 멤버 메서드의 이름 앞에 언더스코어(_)를 붙여서 접근 제어를 구현
class BankAccount:
	def __init__(self, name, balance):
    	self._name = name
        self._balance = balance
    def deposit(self, amount):
    	self._balance += amount
    def withdraw(self, amount):
    	if self._balance >= amount:
        	self._balance -= amount
        else:
        	print("Insufficient balance")
	def get_balance(self):
    	return self._balance
    def get_name(self):
    	return self._name

: 위의 코드에서 BankAccount 클래스는 은행 계좌를 나타내는 클래스입니다. 멤버 변수인 _name과 _balance는 언더스코어(_)를 붙여서 접근 제어를 구현하면 클래스 외부에서는 직접적으로 멤버 변수에 접근할 수 없으며, 멤버 메서드를 통해서만 값을 읽거나 변경할 수 있습니다.

account = BankAccount("John", 1000)
account.deposit(500)
account.withdraw(200)
print("Account name:", account.get_name())
print("Account balance:", account.get_balance())

위의 코드에서는 account 객체의 get_name() 메소드와 get_balance() 메서드를 호출해서 각각 계좌의 소유자와 잔액을 출력합니다. ※ 이때, 멤버 변수인 _name_balance는 직접적으로 접근하지 않는데, 이것이 바로 캡슐화임(객체의 내부 구현을 숨기고 인터페이스를 제공)

  • 캡슐화를 너무 강하게 적용하면 객체의 내부 구현을 완전히 숨기기 때문에 디버깅이 어려워지고, 유연성이 떨어질 수 있습니다. 따라서, 적절한 수준에서 캡슐화를 적용하는 것이 중요합니다.
  • 또한, 언더스코어(_)를 붙인 멤버 변수와 멤버 메서드는 외부에서 접근 가능하지만, 이름 앞뒤에 더블 언더스코어(__)를 붙인 멤버 변수와 멤버 메서드는 파이썬에서 특별한 의미를 갖는 매직 메서드를 나타내기 때문에, 접근을 제한하기 위해서는 언더스코어(_)를 사용하는 것이 좋습니다.
  • 객체 지향 설계
    • 객체 지향 프로그래밍은 현실 세계의 개념을 모델링하여 프로그래밍하는 방법
    • 클래스를 사용하면 현실 세계의 개념을 코드로 옮겨 쉽게 이해하고 관리할 수 있음

🡆 따라서 데이터 분석과 같이 복잡한 작업을 수행하는 경우 클래스를 사용하여 코드를 구조화하고 객체 지향적으로 설계하는 것이 좋음

🡆 클래스를 사용하면 유연하고 확장 가능한 코드를 작성할 수 있으며, 이는 데이터 분석 작업의 효율성과 유지보수성을 향상시킴

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

  • 클래스(Class)
    • 객체(Object)를 생성하기 위한 템플릿
    • 메서드(Method)와 속성(Attribute)을 가짐
  • 메서드(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) 데이터 분석에서 사용되는 예시

  • 주로 데이터의 구조화, 모델링, 분석 작업의 모듈화, 코드의 재사용성 등을 위해 클래스를 활용
  • 클래스를 사용하여 데이터를 구조화하고 처리하면 코드의 가독성과 유지보수성을 향상시킬 수 있으며, 모델링 작업을 모듈화하여 코드를 재사용할 수 있음

데이터 구조화

  • 클래스를 사용하여 데이터를 구조화하고 데이터 타입을 정의
    e.g. 주식 데이터를 다룰 때 각 주식을 객체로 표현하고 해당 주식의 종목명, 가격, 거래량 등을 속성으로 정의
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)

데이터 전처리 모듈화

  • 데이터 분석에서 데이터 전처리는 중요한 과정
  • 클래스를 사용하여 데이터 전처리 단계를 모듈화하고 재사용 가능한 코드로 만들 수 있음
    e.g. 데이터 정규화, 결측치 처리, 이상치 제거 등의 작업을 클래스의 메서드로 구현
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()

모델링과 분석 작업

  • 데이터 분석에서 사용되는 모델링 작업도 클래스를 활용하여 구현 가능
    e.g. 선형 회귀 모델, 분류 모델, 군집화 모델 등을 클래스로 정의하여 모델의 학습, 예측, 평가 등을 각각의 메서드로 구현
    • 클래스를 만들어 머신러닝 모델을 사용할 수 있음
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()

불리언 인덱싱

불리언 인덱싱(Boolean indexing)이란?

  • 조건에 따라 요소를 선택하는 방법 중 하나
  • 주어진 조건에 따라 배열이나 리스트에서 요소를 선택할 수 있게 해주는 강력한 도구
  • 데이터 필터링 및 선택에 매우 유용하며, 데이터 분석에서 자주 사용
  • 파이썬에서는 NumPy를 사용하여 불리언 인덱싱을 수행할 수 있고 Pandas에서 데이터를 조건에 맞게 선택할 때 많이 사용

예시: NumPy를 사용한 불리언 인덱싱의 개념과 코드

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]
  • NumPy를 사용하여 불리언 인덱싱을 수행하는 방법
    • 배열 arr과 조건을 담은 불리언 배열 condition을 생성
    • 불리언 인덱싱을 사용하여 조건에 따라 요소를 선택
    • 선택된 요소를 출력

데코레이션

1) 데코레이터(Decorator)란?

  • 파이썬에서 함수나 메서드의 기능을 확장하거나 수정하는 강력한 도구
  • 함수나 메서드를 인자로 받아 해당 함수나 메서드를 변경하거나 래핑하는 함수
    • 이를 통해 코드를 더 간결하고 재사용 가능하게 만들 수 있음
    • 즉, 기존의 함수를 따로 수정하지 않고도 추가 기능을 넣고 싶을 때 사용
  • 데코레이션은 따로 함수 내부의 구조를 바꾸지 않고 함수 외부에 간단한 명령어를 작성하여 작동

구조

def decorator_function(original_function):
    def wrapper_function(**kwargs):
        # 함수 호출 전에 실행되는 코드
        result = original_function(**kwargs)
        # 함수 호출 후에 실행되는 코드
        return result
    return wrapper_function

2) 사용 예시

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()
  • 기존의 say_hello() 라는 함수에 @my_decorator 라는 데코레이터를 입힘
  • 이러한 데코레이터를 한번 만들어 두면 어떤 함수든 따로 수정하지 않아도 간단하게 데코레이터만 추가하여 데코레이터에 명시한 작업들을 수행할 수 있음

텐서플로우(tensorflow) @tf.function

  • 딥러닝 라이브러리로 유명한 텐서플로우(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")

우리가 A → B → C 순로 작업하는 일을 3번 해야 한다고 해봅시다. 이런 경우 무작정 이 순서로 일을 하기보다는 순서를 다시 정리하여 A → A → A 한번, B → B → B 한번, C → C → C 한번 이렇게 일을 하는 것이 똑같은 양의 일을 하더라도 훨씬 효율적일 것입니다. 파이썬에서 그래프 연산을 한다는 것은 연산의 순서를 명확하게 정리함으로써 최적화 하는 과정입니다!
따라서 계산량이 적은데 많이 해야 한다면 효과적일 수 있겠지만, 계산량 자체가 크다면 그래프를 만드는게 오래 걸려 (일은 안하고 A,B,C 순서 정리하느라 시간 다 보내는 것과 같음) 순서를 정리하는 것이 그다지 효과적이지 않을 것입니다.

참고: 파이썬의 즉시 실행모드와 그래프 모드

  • 즉시 실행 모드 (Eager Execution)
    • 파이썬 코드를 순차적으로 실행하면서 연산을 즉시 평가하는 방식
    • 각각의 연산은 실행될 때마다 결과가 즉시 반환되어 사용자가 바로 확인할 수 있음
    • 파이썬의 일반적인 제어 흐름과 함께 사용되며, 디버깅 및 코드 작성이 용이
    • TensorFlow 2.0부터는 즉시 실행 모드가 기본적으로 활성화되어 있음
  • 그래프 모드 (Graph Mode)
    • 파이썬 코드를 그래프로 변환하고, 이를 최적화한 후에 실행하는 방식
    • 먼저 그래프를 정의하고, 그래프를 실행하기 위해 세션을 통해 입력을 제공
    • 그래프는 연산의 순서와 의존성을 명확하게 표현하므로, 병렬 실행과 하드웨어 가속화에 최적화
    • ensorFlow 1.x에서는 주로 그래프 모드를 사용했으나, TensorFlow 2.0부터는 즉시 실행 모드가 기본으로 제공되어 그래프 모드를 명시적으로 사용하지 않아도 됨
  • 차이점
    • 즉시 실행 모드는 파이썬 코드를 사용하여 연산을 즉시 평가하고 결과를 반환하는 반면 그래프 모드는 그래프를 먼저 정의하고 세션을 통해 실행해야 함
    • 즉시 실행 모드는 디버깅과 코드 작성이 용이하지만, 그래프 모드는 병렬 실행과 하드웨어 가속화에 최적화되어 있음
    • 즉시 실행 모드는 각각의 연산을 바로 평가하기 때문에 코드를 작성하고 실행하는 데에 편리한 반면에, 그래프 모드는 전체 그래프를 먼저 정의하고 실행해야 하므로 초기 설정이 더 복잡할 수 있음
    • 그래프 모드는 동일한 그래프를 여러번 실행할 때 재사용할 수 있어서 효율적인 반복 작업에 유용

파이썬 에러 대처법

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 (구문 오류)

  • 에러 메시지
    • 코드 문법에 오류가 있음
  • 대처법
    • 코드의 문법을 확인하고 괄호, 따옴표, 콜론 등을 올바르게 사용했는지 확인
    • 코드 블록의 들여쓰기 확인

잘못된 코드 예시

print("Hello World'

에러 메시지

SyntaxError: EOL while scanning string literal

(2) IndentationError (들여쓰기 오류)

  • 에러 메시지
    • 코드 블록의 들여쓰기가 잘못되었음
  • 대처법
    • 들여쓰기를 일관되게 맞추기
    • 보통 스페이스 4개 또는 탭을 사용

잘못된 코드 예시

def my_function():
print("Hello World!")

에러 메시지

IndentationError: expected an indented block

(3) NameError (이름 오류)

  • 에러 메시지
    • 정의되지 않은 변수나 함수를 사용
  • 대처법
    • 사용된 변수나 함수가 정의되었는지 확인
    • 오탈자나 변수명의 대소문자를 확인
    • 정의되지 않은 변수나 함수를 정의

잘못된 코드 예시

# 위에 my_variable에 대한 변수에 대해 따로 언급한 것이 없는 상황
print(my_variable)

에러 메시지

NameError: name 'my_variable' is not defined

(4) TypeError (타입 오류)

  • 에러 메시지
    • 데이터 타입이 일치하지 않는 연산이나 함수 호출을 시도
  • 대처법
    • 연산이나 함수 호출에서 사용되는 데이터 타입을 확인
    • 필요한 형 변환을 수행
      • e.g. 문자열과 숫자를 연산할 때는 문자열을 숫자로 변환해야 함

잘못된 코드 예시

result = "10" + 20

에러 메시지

TypeError: can only concatenate str (not "int") to str

(5) IndexError (인덱스 오류)

  • 에러 메시지
    • 리스트나 튜플에서 존재하지 않는 인덱스를 접근하려고 할 때
  • 대처법
    • 인덱스 범위 확인
    • 존재하지 않는 인덱스에 접근하는 것을 피하기
    • 리스트 슬라이싱을 사용하여 안전하게 데이터에 접근하기
      • my_list[start:stop:step]
        start를 입력하지 않으면 0을 입력한 것과 같음
        stop을 입력하지 않으면 리스트의 길이 (len(my_list))를 입력한 것과 같음
        step을 입력하지 않으면 1을 입력한 것과 같음

잘못된 코드 예시

my_list = [1, 2, 3]
print(my_list[3])

에러 메시지

IndexError: list index out of range

(6) KeyError (키 오류)

  • 에러 메시지
    • 딕셔너리에서 존재하지 않는 키를 사용하려고 할 때
  • 대처법
    • 사용되는 키가 딕셔너리에 존재하는지 확인
    • 딕셔너리에 존재하지 않는 키를 사용하지 않도록 주의

잘못된 코드 예시

my_dict = {"a": 1, "b": 2}
print(my_dict["c"])

에러 메시지

KeyError: 'c'

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

  • 에러 메시지
    • 파일을 찾을 수 없을 때
  • 대처법
    • 파일 경로를 올바르게 지정했는지 확인
    • 파일이 존재하는지, 경로가 정확한지 확인

잘못된 코드 예시

with open("nonexistent_file.txt", "r") as file:
    contents = file.read()

에러 메시지

FileNotFoundError: [Errno 2] No such file or directory: 'nonexistent_file.txt'

3) 위의 예시에도 없는 문제라면?

  • 무조건 구글링!
    • 특히, 에러에 대한 세부정보만 검색해 봐도 그에 대한 해결책이 아주 많이 나옴
      • 다들 많이 한 실수라는 의미겠지요
    • 만약 세부정보를 검색했는데 나오지 않았다는 것은 흔한 에러가 아니라는 것
      • 최대한 에러타입 보도 추측해서 찾기
    • 혹은 찾았더라도 너무 어려운 내용이거나 이해하기 힘들때도 있음
      • 튜터님에게 질문

Quiz

파일 불러오기

  • ‘01. 파일 불러오기 및 저장하기’의 ‘3)파일 저장하기’에서 저장 했던 파일들을 불러오세요!
    🡆
import pandas as pd
df = pd.read_csv('/content/sample_data/data.csv')

import pandas as pd
df = pd.read_excel('/content/sample_data/data.xlsx')

import pandas as pd
df = pd.read_json('/content/sample_data/data.json')

import pandas as pd
df = pd.read_csv('/content/sample_data/data.txt')

각자마다 알맞은 경로를 설정하시면 됩니다! 경로는 각자 다를 수 있습니다

리스트 캄프리헨션

  • 다음 코드의 출력은 무엇입니까? (코드를 치지 않고 예측해보세요!)
squares = [x**2 for x in range(1, 6)]
print(squares)

a) [1, 4, 9, 16, 25]
b) [1, 3, 5, 7, 9]
c) [1, 2, 3, 4, 5]
d) [2, 4, 6, 8, 10]

🡆 a

패키지

  • 파이썬에서 패키지의 역할은 무엇입니까?
    a) 프로그램의 실행 속도를 향상시키기 위해 사용됩니다.
    b) 코드의 재사용성을 높이기 위해 사용됩니다.
    c) 데이터베이스 관리를 위해 사용됩니다.
    d) 네트워크 통신을 위해 사용됩니다.

🡆 b

glob

  • 파이썬에서 패키지의 역할은 무엇입니까?
    a) 파일 삭제
    b) 파일 생성
    c) 파일 검색 및 패턴 매칭
    d) 파일 압축하기

🡆 c

클래스

  • 평균 계산기: 아래의 데이터와 클래스 일부분을 수정하여 평균을 계산하는 클래스를 완성하고 실제로 클래스를 선언하여 계산된 결과 까지도 출력해 보세요!
# 데이터는 이것을 사용하세요
data = [2, 4, 6, 8, 10]

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

    def calculation(self):
        # 이 부분을 채워 주세요!

🡆

data = [2, 4, 6, 8, 10]

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

    def calculation(self):
    	return sum(self.data) / len(self.data)

input_data = DataPreprocessor(data)
average = input_data.calculation()

print(f"평균: {average}")

정답:
다양한 경우의 수를 가진 정답이 나올 수 있기 때문에 혹여나 완전 똑같이 코딩하지 않았더라도 취지와 결과만 맞으면 모두 정답이라고 보시면 됩니다.

class DataPreprocessor:
    def __init__(self, data):
        self.data = data
def calculation(self):
    total = sum(self.data)
    length = len(self.data)
    average = total / length
    return average
    

data = [2, 4, 6, 8, 10]

preprocessor = DataPreprocessor(data)
average = preprocessor.calculation()

print("평균:", average)

profile
2 B R 0 2 B

0개의 댓글