본문 바로가기
FastCampus X Upstage AI 부트캠프/과제 및 일반글

fastcampusxUpstage AI 3기 EDA블로그

by tankwoong 2024. 4. 29.
반응형
  1. 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"]

 

반응형