Numpy
다양한 수학 연산들을 리스트로 계산하게 되면 메모리 효율적이지 않고 파이썬은 인터프리터 언어이기 때문에 처리속도에 문제가 있습니다. 이러한 문제로 적절한 패키지의 활용이 필요한데 여기서 numpy가 쓰입니다.
numpy는 array연산의 사실상의 표준으로 리스트에 비해 빠르고 메모리 효율적입니다. 또한 반복문 없이 데이터 배열에 대한 처리를 지원합니다.
일반적으로 속도는 for loop < list comprehension < numpy이며 100,000,000 번의 loop를 돌 때, 약 4배 이상의 성능 차이를 보입니다. C로 구현되어 있어 파이썬의 가장 큰 특징인 dynamic typing을 포기한 대신 성능을 확보했습니다. 단, Concatenate처럼 계산이 아닌 할당에서는 연산 속도의 이점이 없습니다.
ndarray
numpy는 np.array 함수를 활용해서 배열을 생성하는데, 이때 생성된 객체를 ndarray라고 부릅니다. 리스트는 여러가지 데이터 타입이 들어갈 수 있지만 numpy는 하나의 데이터 타입만 배열에 넣을 수 있습니다. 또한 리스트와 달리 dynamic typing을 지원하지 않습니다.
numpy array는 메모리 공간에 데이터 값이 차례대로 할당됩니다. List는 값 자체가 아니라 주소값을 리스트에 저장하게 되어 한 번 더 들어가야 값을 찾을 수 있기 때문에 변형은 쉬우나 numpy와 비교해서 메모리 접근성이 떨어집니다.
| 명령어 | 특징 |
| shape | numpy array의 dimension 구성을 반환 |
| dtype | array 전체의 데이터 type을 반환 |
| ndim | number of dimensions |
| size | data 개수 |
| nbytes | ndarray object의 메모리 크기 반환 |
Rank에 따라 불리는 이름은 다음과 같습니다.
| Rank | Name | Example |
| 0 | scalar | 7 |
| 1 | vector | [10,10] |
| 2 | matrix | [[10,10],[15,15]] |
| 3 | 3-tensor | [[[1,5,9],[2,6,10]],[[3,7,11],[4,8,12]]] |
| n | n-tensor |
Handling shape
| 명령어 | 특징 |
| reshape | array의 shape 크기를 변경, element의 갯수는 동일. -1을 넣어주면 size를 기반으로 row, column 등의 개수를 조정함 |
| flatten | 다차원 array를 1차원 array로 변환 |
Indexing & Slicing
- indexing: list와 달리 이차원 배열에서 [0,0] 표기법을 제공합니다. matrix의 경우 앞은 row, 뒤는 column을 의미합니다.
- slicing: list와 달리 행과 열 부분을 나눠서 slicing이 가능합니다. 이는 matrix의 부분 집합을 추출할 때 유용합니다.
a = np.array([[1, 2, 3, 4, 5],[6, 7, 8, 9, 10]], int)
a[:,2:] # 전체 Row의 2열 이상
a[1,1:3] # 1Row의 1열~2열
a[1:3]# 1 Row ~ 2 Row의 전체
creation function
| 명령어 | 특징 |
| arange | array의 범위를 지정하여 해당 값의 리스트를 생성하는 명령어, step은 float도 가능 |
| zeros | 0으로 가득찬 ndarray 생성 |
| ones | 1로 가득찬 ndarray 생성 |
| empty | shape만 주어지고 비어있는 ndarray 생성(Memory initialization 되지 않음) |
| something_like | zeros_like, ones_like, empty_like가 있으며 기존의 ndarray와 크기가 동일한 ndarray를 반환 |
| identity | 단위행렬 생성 |
| eye | 대각선이 1인 행렬(k값이 시작, index 변경 가능) |
| diag | 대각행렬의 값을 추출(k값이 시작, index 변경 가능) |
| np.random.uniform | 균등 분포로 부터 random sampling으로 array를 생성 |
| np.random.normal | 정규 분포로 부터 random sampling으로 array를 생성 |
operations functions
- axis
모든 operation function을 실행할 때 기준이 되는 dimension 축 입니다. axis는 1차원부터 가장 먼저 생긴 축의 값이 제일 크고 새로 생기는 축의 값이 가장 작습니다. 3차원의 경우 열이 2, 행이 1, 채널이 0이 됩니다.
| 명령어 | 특징 |
| sum | ndarray의 element들의 합, list의 sum과 동일 |
| vstack | vertical stack으로, vertical로 numpy array를 합치는 함수 |
| hstack | horizonal stack으로, horizonal로numpy array를 합치는 함수 |
| concatenate | numpy array를 합치는 함수. axis를 통해 hstack, vstack이 정해짐 |
| 수학 함수 | mean, std등 다양한 수학 함수 사용 가능 |
Array operations
numpy는 array간의 기본적인 사칙 연산을 지원하며 array간 shape이 같을 때 일어나는 연산을 Element-wise operations라고 합니다. dot 함수를 사용해 dot product를 연산하며 transpose 또는 T attribute를 사용하면 전치행렬을 만들 수 있습니다. Shape이 다른 배열 간 연산을 지원하는 기능을 broadcasting이라고 하며 scalar-vector간 연산 외에도 vector-matrix 간의 연산도 지원합니다.
Comparisons
numpy는 배열의 크기가 동일할 때 element간 비교의 결과를 Boolean type으로 반환합니다.
| 명령어 | 특징 |
| all | 모두 다 조건에 만족하면 True |
| any | 하나라도 조건에 만족하면 True |
| logical_and | 둘다 True면 True |
| logical_not | True는 False, False는 True |
| logical_or | 둘 중 하나라도 True면 True |
| np.where(조건, True값, False값) | 조건이 맞으면 True, 조건이 틀리면 False. 조건이 맞는 index 값을 반환하기도 함. |
| isnan | null 값인지 확인 |
| isfinite | 유한숫자인지 확인 |
| argmax/min | array 내 최대/최소값의 index를 반환(axis 기반의 반환도 가능) |
| argsort | array 내 각 값들이 몇번째로 작은지 인덱스를 반환해줌 |
boolean, fancy index
- boolean index: 특정 조건에 따른 값을 배열 형태로 추출합니다. comparison operation 함수들도 모두 사용가능하며 조건이 True인 index의 element만 추출합니다. boolean list를 사용하며 원래의 array와 boolean index의 shape이 같아야 합니다.
- fancy index: numpy는 array(반드시 integer로 선언)를 index value로 사용해서 값 추출합니다. matrix 형태의 데이터에도 가능합니다. integer list를 사용하며 shape이 같을 필요는 없지만 범위를 벗어나면 안됩니다.
a = np.array([2, 4, 6, 8], float)
b = np.array([0, 0, 1, 3, 2, 1], int)
a[b] # braket index, b 배열의 값을 index로 하여 a의 값들을 추출
# array([2., 2., 4., 8., 6., 4.])
a.take(b) # braket index와 같은 효과
Pandas
pandas는 구조화된 데이터의 처리를 지원하는 Python 라이브러리이며 panel data의 줄인 말입니다. 고성능 array 계산 라이브러리인 numpy와 통합하여, 강력한 스프레드시트 처리 기능을 제공합니다. 인덱싱, 연산용 함수, 전처리 함수 등을 제공하며 데이터 처리 및 통계 분석을 위해서 사용합니다.

Series
series는 DataFrame 중 하나의 Column에 해당하는 데이터의 모음 object입니다 (column vector를 표현하는 object). 리스트와의 차이는 인덱스를 숫자 뿐만 아니라 문자로도 지정 가능하다는 것입니다. dict type을 Series에 넣으면 key값이 인덱스, value가 값으로 들어갑니다. 인덱스의 이름도 설정이 가능합니다. 기본적으로 series 데이터는 인덱스 기준으로 생성되며 인덱스에 값이 없다면 NaN(null)으로 표현됩니다.
Dataframe
dataframe은 Data Table 전체를 포함하는 object입니다. 데이터 프레임 안의 값에 접근하기 위해서는 인덱스와 컬럼을 모두 알아야 합니다. 또한 컬럼 각각의 데이터 타입이 다를 수 있습니다. 보통 데이터 프레임은 DataFrame 함수로 만들기 보다 CSV나 EXCEL파일을 불러옵니다. column을 선택하면 series가 추출됩니다.
loc, iloc를 사용해 인덱싱 하는데 loc는 index 이름, iloc는 index number를 기준으로 인덱싱합니다. 이외에 T로 transpose, values로 값 출력, to_csv로 csv변환, del 또는 drop으로 column 삭제 등 다양한 핸들링 기법이 사용 가능합니다.
Selection & Drop
df["account"].head(3) # 한 개의 column 선택
df[["account", "street", "state"]].head(3) # 한 개 이상의 column 선택
df[:3] # column 이름 없이 사용하는 index number는 row기준 표시
df["account"][:3] # column 이름과 함께 사용 시 해당 column만 적용
# 인덱싱
df[["name", "street"]][:2] # column과 index number
df.loc[[211829, 320563],["name","street"]] # column과 index name
df.iloc[:2,:2] # column number와 index number
df.drop(1) # index number로 drop
df.drop([0, 1, 2, 3]) # 한 개 이상의 index number로 drop
df.drop("city", axis=1) # axis 지정 축을 기준으로 drop -> column중에 "city"
Dataframe operation
series는 index를 기준으로 연산을 수행하며 겹치는 index가 없을 경우 NaN값으로 반환합니다. 데이터 프레임은 column과 index를 모두 고려하며 계산을 수행합니다. add operation을 쓰면 NaN값을 다른 값(fill_value=값)으로 변환해서 넣어줄 수 있습니다. operation type에는 add, sub, div, mul 등이 있습니다
lambda, map, apply
pandas의 series type의 데이터에도 map 함수 사용가능하며 function 대신 dict, sequence형 자료 등으로 대체도 가능합니다.
map함수의 기능 중 데이터 변환 기능만 담당하는 replace 함수도 존재합니다. 변경사항을 저장하기 위해서는 inplace=True를 작성해 주어야 합니다. apply는 map과 달리 series 전체(column)에 적용하는 함수입니다.
s1.map(lambda x: x**2)
f = lambda x : x.max() - x.min()
df_info.apply(f) # 각 column 별로 결과값 반환
# 내장 연산 함수를 사용할 때도 똑같은 효과를 거둘 수 있음
f = lambda x : -x
df_info.applymap(f) # series 단위가 아닌 element 단위로 함수를 적용. 데이터프레임 모든 값에 적용됨
panda built-in functions
| 함수 | 특징 |
| describe() | Numeric type 데이터의 요약 정보를 반환 |
| unique() | series data의 유일한 값을 list로 반환 |
| sum(axis=) | 기본적인 column(axis=0) 또는 row(axis=1) 값의 연산을 지원 |
| isnull() | column 또는 row 값의 NaN (null) 값의 index를 반환, sum이랑 같이 활용하기도 함 |
| sort_values() | olumn 값을 기준으로 데이터를 sorting (ascending=True : 오름차순) |
| corr, cov, corrwith | 상관계수와 공분산을 구하는 함수 |
Groupby
groupby는 SQL groupby 명령어와 동일하며 split->apply->combine 과정을 거쳐서 연산합니다.

위의 그림과 같이 할 수 있으며 한 개 이상의 column을 묶을 수 있습니다. Groupby 명령의 결과물도 결국은 dataframe입니다.
두 개의 column으로 groupby를 할 경우, index가 두 개 생성되는데 이를 Hierarchical index라 부릅니다. 이를 unstack() 명령어를 통해서 묶인 데이터를 matrix 형태로 풀어주기도 하며 reset_index()로 groupby를 풀어주기도 합니다. 또한 swaplevel을 통해 index level을 변경할 수 있으며 sortlevel을 통해 level에 따라 index를 정렬할 수 있습니다.
# index level을 기준으로 기본 연산 수행 가능
h_index.sum(level=0)
h_index.sum(level=1)
groupby에 의해 split된 상태를 grouped 상태라고 합니다. 이때, tuple의 형태로 그룹의 key값과 value값이 추출됩니다. get_group을 통해서는 특정 key값을 가진 그룹의 정보만 추출이 가능합니다.
- 추출된 group 정보에는 세 가지 유형의 apply가 가능합니다.
- Aggregation: 요약된 통계정보를 추출해 줌
- Transformation: 해당 정보를 변환해 줌. aggregation과 달리 key값 별로 요약된 정보가 아니며 개별 데이터의 변환을 지원
- Filteration: 특정 정보를 제거하여 보여주는 필터링 기능
#aggregation
grouped.agg(sum)
grouped.agg([sum, max])
grouped.describe()
#transformation
score = lambda x: (x.max())
grouped.transform(score)
score = lambda x: (x - x.mean()) / x.std()
grouped.transform(score)
#filter
df.groupby('Team').filter(lambda x : len(x) >= 3)
Pivot table, Crosstab
Pivot table은 index 축은 groupby와 동일하며 column에 추가로 labeling 값을 추가하여 Value에 numeric type 값을 aggregation 하는 형태입니다.
# pivot table
df_phone.pivot_table(["duration"],
index=[df_phone.month, df_phone.item],
columns=df_phone.network, aggfunc="sum", fill_value =0)
Crosstab은 두 칼럼에 교차 빈도, 비율, 덧셈 등을 구할 때 사용합니다. Pivot table의 특수한 형태이며 User-Item Rating Matrix 등을 만들 때 사용 가능합니다. 네트워크 형태의 데이터를 표현할 때 crosstab을 사용하면 편합니다.
pd.crosstab(index=df_movie.critic, columns=df_movie.title, values=df_movie.rating,
aggfunc="first").fillna(0)
Merge & Concat
Merge는 SQL의 merge(join)와 같은 기능을 가지고 있으며, 두 개의 데이터를 하나로 합칠 때 사용합니다.
# subject_id 기준으로 merge
pd.merge(df_a, df_b, on='subject_id')
# on은 양쪽에 모두 해당 컬럼이 있어야 함.
# 두 dataframe의 column 이름이 다를때 left_on, right_om을 사용합니다.
pd.merge(df_a, df_b, on='subject_id', how='left') # 왼쪽 df를 기준으로 합치며 오른쪽 df에 없는 값은 NaN값으로 나옴
pd.merge(df_a, df_b, on='subject_id', how='right') # 오른쪽 df를 기준으로 합치며 왼쪽 df에 없는 값은 NaN값으로 나옴
pd.merge(df_a, df_b, on='subject_id', how='outer') # 양쪽을 다 살리며 빈 공간은 NaN값으로 처리
pd.merge(df_a, df_b, on='subject_id', how='inner') # 교집합
Concat은 같은 형태의 데이터를 붙이는 연산 작업입니다. 위아래로 concat시에는 같은 컬럼을 가지고 있어야하며 append도 동일하게 동작합니다. axis=1을 해주면 옆으로 붙여줍니다.
Persistence
Data loading 시 db connection 기능을 이용하여 Database에서 dataframe을 가져올 수 있습니다. 이때 sqlite3 라이브러리를 활용합니다.
import sqlite3
# db 연결
conn = sqlite3.connect("db명.db")
cur = conn.cursor()
cur.execute("select * from airlines limit 5;")
results = cur.fetchall()
results
# df 생성
df_airplanes = pd.read_sql_query("select * from airlines;", conn)
df_airports = pd.read_sql_query("select * from airports;", conn)
df_routes = pd.read_sql_query("select * from routes;", conn)
# 엑셀 추출
writer = pd.ExcelWriter('경로/df_routes.xlsx', engine='xlsxwriter') # 엔진으로 xlsxwriter 또는 openpyxls 사용
df_routes.to_excel(writer, sheet_name='Sheet1')
# 가장 일반적인 python 파일 persistence
# to_pickle, read_pickle 함수 사용
df_routes.to_pickle('경로/df_routes.pickle')'Naver Boostcamp AI Tech > Level 1' 카테고리의 다른 글
| < Boostcamp > Convolutional Neural Network (0) | 2023.12.27 |
|---|---|
| < Boostcamp > Optimization (0) | 2023.12.27 |
| < Boostcamp > Python 3 (0) | 2023.12.27 |
| < Boostcamp > 딥러닝 기초 (0) | 2023.12.27 |
| < Boostcamp > AI Math 3 (0) | 2023.12.27 |