베하~ 안녕하세요! 현상수배범입니다. 이번 시간에는 Python의 라이브러리인 Pandas와 Numpy에 대해서 알아보도록 하겠습니다.
Python의 pandas와 numpy 라이브러리는 데이터 분석과 관련된 다양한 작업을 수행할 수 있게 해줍니다. 둘 다 오픈 소스이며, 데이터 처리, 변형, 분석을 위한 다양한 기능을 제공합니다. 다음은 이 두 라이브러리의 주요 특징 및 비교입니다.
Pandas
Pandas는 Python에서 데이터 분석을 위한 고수준의 라이브러리입니다. Pandas의 핵심 구조는 Series와 DataFrame입니다.
- 특징
Series: 1차원 배열과 유사한 구조로, 인덱스를 가지고 있습니다.
DataFrame: 2차원 테이블로, 열마다 다른 타입의 데이터를 가질 수 있습니다.
Pandas는 CSV, Excel, SQL 등 다양한 데이터 소스를 읽을 수 있으며, 누락된 데이터를 처리하거나 데이터를 그룹화하고 집계하는 등 다양한 데이터 분석 기능을 제공합니다.
Numpy
Numpy는 다차원 배열을 효율적으로 처리할 수 있는 라이브러리입니다. Numpy 배열은 동일한 타입의 데이터만 가질 수 있습니다.
Numpy는 수학적 연산, 통계, 선형 대수, 푸리에 변환 등 다양한 수학 함수와 연산을 제공합니다. Numpy는 성능을 최적화하기 위해 C로 구현되어 있어, 대규모 데이터를 처리할 때 효율적입니다.
Pandas & Numpy 비교
구분 | Numpy | Pandas |
용도 | 수치 데이터 처리 선형 대수, 통계 등의 수학 연산에 최적화 |
표 형식의 데이터 처리 데이터 정제, 변형, 분석 등에 사용 |
데이터 구조 | 다차원 배열 배열 내의 모든 원소는 동일한 데이터 타입을 가짐 |
DataFrame & Series 각 열은 다른 데이터 타입을 가질 수 있음 |
성능 | C로 구현되어 빠른 성능을 보입니다 | Numpy를 기반으로 하며, 성능이 중요한 연산에서는 Numpy와 비슷한 성능을 보입니다. |
사용법 | 복잡한 수학적 연산과 대규모 배열 연산에 적합 | 데이터 분석과 관련된 다양한 고수준 작업에 적합 |
예제 - 1 (Pandas & Numpy 실행 시간 비교)
Pandas에서 처리하는데 오래 걸리는 일부 연산들은 Numpy로 변환하여 더 빠르게 처리할 수 있습니다. 매우 큰 데이터셋에 대한 수학적 연산을 수행할 때 Numpy를 사용하면 좋습니다. 아래는 Pandas의 DataFrame에 있는 데이터를 Numpy 배열로 변환하여 연산을 수행하는 예제입니다. Pandas의 수행 속도와 Numpy의 수행 속도를 비교해보록 하겠습니다.
import pandas as pd
import numpy as np
import time
# 큰 데이터 프레임 생성
size = 10**6
data = {'A': np.random.randn(size),
'B': np.random.randn(size)}
df = pd.DataFrame(data)
# Pandas로 평균 계산
start_time = time.time()
mean_a_pandas = df['A'].mean()
mean_b_pandas = df['B'].mean()
elapsed_time_pandas = time.time() - start_time
# Numpy로 평균 계산
start_time = time.time()
mean_a_numpy = np.mean(df['A'].to_numpy())
mean_b_numpy = np.mean(df['B'].to_numpy())
elapsed_time_numpy = time.time() - start_time
elapsed_time_pandas, elapsed_time_numpy
RESULT
(0.03557753562927246, 0.005472660064697266)
위 예시를 통해 Numpy가 Pandas의 연산 속도보다 더 빠르다는 것을 확인할 수 있습니다. Numpy 연산의 경우 Numba라는 데코레이터를 사용하여 Python 함수를 컴파일 하고, 실행 속도를 더욱 향상할 수 있습니다.
예제 - 2 (Numpy & Numpy+Numba 실행 시간 비교)
아래에서는 Numpy와 Numba를 동시에 사용하는 예제입니다.
import time
import numba
import numpy as np
# 데이터 크기 설정
size = 10**6
arr = np.random.rand(size)
# 순수 Python 함수 정의
def calculate_with_previous_row_python(arr):
for i in range(1, len(arr)):
arr[i] += arr[i-1]
return arr
# Numba 함수 정의
@numba.jit(nopython=True)
def calculate_with_previous_row_numba(arr):
for i in range(1, len(arr)):
arr[i] += arr[i-1]
return arr
# 순수 Python 함수의 실행 시간 측정
start_time = time.time()
calculate_with_previous_row_python(arr.copy()) # arr.copy()를 사용하여 원본 배열 보존
python_time = time.time() - start_time
# Numba 함수의 실행 시간 측정
start_time = time.time()
calculate_with_previous_row_numba(arr.copy()) # arr.copy()를 사용하여 원본 배열 보존
numba_time = time.time() - start_time
python_time, numba_time
RESULT
(0.44783663749694824, 1.0414602756500244)
Numba를 적용한 함수의 실행시간은 RESULT에서 오른쪽을 나타냅니다. Numpy만을 사용한 함수보다 오히려 시간이 더 긴 것을 확인할 수 있는데, 이는 Numba의 JIT 컴파일러가 함수를 처음 실행할 때 오버헤드를 발생시키기 때문일 수 있습니다. 따라서 numba가 적용된 함수를 여러번 실행하고, 평균 시간을 측정해보도록 하겠습니다.
# Numba 함수의 여러 번 실행하여 평균 실행 시간 측정
numba_times = []
iterations = 10
for _ in range(iterations):
start_time = time.time()
calculate_with_previous_row_numba(arr.copy()) # arr.copy()를 사용하여 원본 배열 보존
numba_times.append(time.time() - start_time)
average_numba_time = sum(numba_times) / iterations
average_numba_time
RESULT
0.003577423095703125
보시는 바와 같이, Numpy만을 사용한 함수는 수행 시간에 0.4478...sec가 걸린 반면, numba가 적용된 함수는 0.0035...sec으로 기존보다 훨씬 빨리 실행되는 것을 확인할 수 있습니다. Pandas에서 수학적 연산을 적용할 때, 실행 시간이 오래 걸린다면, 해당 DF를 Numpy로 변환하고 Numba를 적용한다면 더욱 빠른 실행 속도를 얻을 수 있을 것으로 생각됩니다.
'Programming > Python' 카테고리의 다른 글
Python에서의 메모리 관리와 가비지 컬렉션 (0) | 2023.10.27 |
---|---|
Python에서의 비동기 프로그래밍 (0) | 2023.10.12 |
Streamlit - Kaggle DALYs 데이터 분석 & 시각화 - 3 (0) | 2023.09.15 |
Streamlit - Kaggle DALYs 데이터 분석 & 시각화 - 2 (0) | 2023.08.31 |
[Python] 예외 처리 (try, exept, else, finally) (1) | 2023.08.21 |
댓글