- NumPy (Numerical Python) => 수치 계산을 위한 배열 처리에 중점 :
- NumPy는 파이썬의 과학 및 수치 계산을 위한 핵심 라이브러리 중 하나
- 다차원 배열을 다루는데 사용됩니다. 이러한 배열은 동일한 타입의 데이터를 포함하며, 연속된 메모리에 저장되어 빠른 연산을 지원
- 빠른 속도와 효율적인 메모리 사용이 특징이며, 선형 대수, 통계, 푸리에 변환 등의 연산을 지원
- 파이썬의 기본 리스트보다 훨씬 더 효율적으로 데이터를 다룰 수 있음
특징:
1.모든 원소의 dtype이 같다.
2. 연산의 의미가 조금 다르다(broadcasting)
3. 대용량 array인 경우에 for문을 직접 사용하는 것보다 내부적으로 정의된 연산을 사용하는 것이 더 빠르다.
4. 생성 후에 크기 변경이 불가능하다.
Numpy Array creation
import numpy as np
# 파이썬 리스트 선언
data = [1,2,3,4]
# 파이썬 2차원 리스트(행렬) 선언
data2 = [[1,2],
[3,4]]
# 파이썬 list를 numpy array로 변환합니다.
# numpy array를 만드는 방식의 대부분은 파이썬 리스트를 np.array로 변환하는 방식입니다.
np.array(data)
# 2차원 리스트를 np.array로 만듭니다.
arr2 = np.array(data2) # data2라는 리스트를 numpy array로 만들어라.
arr2.shape
# 0부터 9까지 숫자를 자동으로 생성한 array
np.arange(10).shape
np.zeros(shape=(5,3,4))
np.linspace(0,1,100)
np.random.randn(5,3) #표준형 정규분포로 해줌
Reshaping array
# 3 x 3 행렬을 만들어봅시다.
x = np.zeros(shape=(5,3,4))
x = np.zeros(shape=(32,3,224,224))
# 224 x224 img가 3(RGB)의 channel을 가지고 있는 이미지가 32개
# reshape을 이용하여 만들어봅시다.
x = np.arange(1,10).reshape(9,1)
x = np.arange(1,121).reshape(6,-1)
Concatenation of arrays
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
# arr1 + arr2 = ?
arr1+ arr2
# arr1와 arr2를 합칩니다
# stacking vertically
np.vstack([arr1, arr2])
np.hstack([arr1,arr2])
Array Arithmetic (like vector) --> Universal Function
# v1 = (1, 2, 3), v2 = (4, 5, 6) 벡터 2개 생성하기.
v1 = np.array((1,2,3))
v2 = np.array((4,5,6))
# 리스트로 더하기 연산해보기
v1 + v2
# vector subtraction
v1-v2
# (not vector operation) elementwise multiplication
v1*v2
# (not vector operation) elementwise division
v1/v2
# dot product
v1@v2
Broadcast and Universal Function
- 서로 크기가 다른 numpy array를 연산할 때, 자동으로 연산을 전파(broadcast)해주는 기능. 행렬곱 연산을 할 때 편리하다.
arr1 = np.array([1,2,3])
arr2 = np.array([[-1,-1,-1],
[1, 1, 1]])
arr2.reshape(3,2) #안됨
- Universal Function :
broadcast 기능을 확장해서, numpy array의 모든 원소에 동일한 함수를 반복문으로 적용한 것과 같은 효과를 내는 기능
# f = lambda x : 1/x
# arr1 / 1 ##
1/ arr1
def reverse_num(x):
return 1/x
for i in range(len(arr1)):
arr1[i] = reverse_num(arr1[i])
Numpy Methods
numpy에서 사용되는 여러가지 함수들을 사용해봅시다.
# 표준정규분포에서 random sampling을 한 원소를 가지는 5x3 행렬을 만든다.
#pseudo-random
np.random.seed(42) #random을 고정
mat1 = np.random.rand(5,3)
mat1
# mat1에 절대값 씌우기
np.abs(mat1)
# mat1 제곱하기
np.square(mat1)
# mat1의 제곱근 구하기
np.sqrt(mat1)
np.sqrt(mat1.astype('complex'))
Pandas:=>데이터 조작 및 분석을 위한 라이브러리, 표 형식의 데이터를 처리하는 데 특화
- Pandas는 데이터 조작 및 분석을 위한 라이브러리로, 표 형식의 데이터를 처리하는 데 특화
- 데이터 프레임(DataFrame)과 시리즈(Series)라는 두 가지 핵심 데이터 구조를 제공
- 데이터를 읽고, 필터링하고, 변환하고, 집계하는 데 사용됩니다. SQL과 유사한 연산을 수행
- 결측치 처리, 데이터 조인, 그룹화, 시계열 데이터 처리 등 다양한 기능을 제공하여 데이터 분석 작업을 용이
### 1. Pandas DataFrame and Operations
!pip install pandas==1.5.3 #numpy와 호환을 위해 버전을 맞춰줌
import pandas as pd
import numpy as np
pd.__version__
DataFrame은 2차원 테이블이고, 테이블의 한 줄(행/열)을 Series라고 합니다.
Series의 모임이 곧, DataFrame이 됩니다.
# 12x4 행렬에 1부터 36까지의 숫자를 원소를 가지고, index는 0부터 시작하고, coulmns은 순서대로 X1, X2, X3, X4로 하는 DataFrame 생성
df = pd.DataFrame(data= np.random.randn(12,4),
index=np.arange(12),
columns=['X1','X2','X3','X4'])
# dataframe index
df.index
# dataframe columns
df.columns
# dataframe values
df.values#DataFrame의 데이터를 np.array로 가져옴
# 특정 column을 가져오기
df['X1']
# X1 column에 2 더하기
df['X1']+2
### 2.2. Dataframe 기초 method
# dataframe의 맨 위 다섯줄을 보여주는 head()
df.head()
# 10줄
df.head(10)
# dataframe에 대한 전체적인 요약정보를 보여줍니다. index, columns, null/not-null/dtype/memory usage가 표시됩니다.
df.info()
#non-null count: 각 column별 데이터 개수.
#dtype: 각 column별 data type
# dataframe에 대한 전체적인 통계정보를 보여줍니다.
df.describe()
# X2 column를 기준으로 내림차순 정렬
#row가 최소단위
df.sort_values(by='X2', ascending=False)
### 2.3. Fancy Indexing !
- 데이터를 filtering <=> Search !
- 전체 데이터에서 원하는 일부의 데이터를 찾아오는 방법 !
# pandas dataframe은 column 이름을 이용하여 기본적인 Indexing이 가능합니다.
# X1 column을 indexing
df['X1']
# dataframe에서 slicing을 이용하면 row 단위로 잘려나옵니다.
# 앞에서 3줄을 slicing 합니다.
df[0:3]
# df에서 index value를 기준으로 indexing도 가능합니다. (여전히 row 단위)
df.loc[2]
# df.loc는 특정값을 기준으로 indexing합니다. (key - value)
df.loc[2,'X1']
# dataframe에 조건식을 적용해주면 조건에 만족하는지 여부를 알려주는 "mask"가 생깁니다.
# Q. df에서 X3 column에 있는 원소들중에 3의 배수만 출력해주세요!
df.loc[[0,3,5], ['X1','X4']] ##재배열 가능. indexing할 때 입력한 순서대로 데이터를 가져옴
# 2차원 리스트 indexing과 같은 원리가 되었습니다.
# integer-location based indexing
mask = df['X3']>0
df[mask]
df[mask]['X3']
##df.loc[row에 대한 조건식, col에 대한 조건식]
df.loc[mask,'X3'] #pandas의 출력하는 방식
# iloc로 2차원 indexing을 하게되면, row 기준으로 index 3,4를 가져오고 column 기준으로 0, 1을 가져옵니다.
# L = [[1,2,3],
# [4,5,6]]
# arr = np.array(L)
# arr[1,1]
df.iloc[[3,4],[0,1]]
# Q. 2차원 indexing에 뒤에가 : 면 어떤 의미일까요?
df.iloc[:,3] #X4 column
df.iloc[0,:] #row 0
## 2.3. 여러 DataFrame 합치기
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3'],
'C': ['C0', 'C1', 'C2', 'C3'],
'D': ['D0', 'D1', 'D2', 'D3']},
index=[0, 1, 2, 3])
df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'],
'B': ['B4', 'B5', 'B6', 'B7'],
'C': ['C4', 'C5', 'C6', 'C7'],
'D': ['D4', 'D5', 'D6', 'D7']},
index=[4, 5, 6, 7])
df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'],
'B': ['B8', 'B9', 'B10', 'B11'],
'C': ['C8', 'C9', 'C10', 'C11'],
'D': ['D8', 'D9', 'D10', 'D11']},
index=[8, 9, 10, 11])
# SQL과 같이 join operation을 사용할 수 있다.
#위-아래로 합치기(concat)
df2.reset_index(drop=True, inplace=True)
df3.reset_index(drop=True, inplace=True)
pd.concat([df1,df2,df3])
pd.concat([df1,df2,df3], axis=0) #column을 기준으로 합침
pd.concat([df1,df2,df3], axis=1) #index를 기준으로 합침
# df2.reset_index(drop=True, inplace=True) #drop은 view 원본에 바꾸고자하면
#merge
pd.merge(left=df1, right=df2, on='A' ,how='inner')
#A inner join B --> table A와 table B의 특정 column에서 겹치는 값들을 기준으로 두 테이블을 합치는 연산
#Q1
mask = titanic.Sex == 'female'
np.mean(titanic.loc[titanic.Sex == 'female','Age'])
titanic.loc[mask, 'Age'].mean()
#Q2
#1등석에 탑승한 승객 중 최대 욕므을 낸 사람의 이름을 찾아주세요.
mask = titanic.Pclass ==1
temp = titanic.loc[mask, ['Name','Fare']]
temp.loc[temp.Fare == temp.Fare.max(),"Name"]