공부법에 관한 모든 것

[AI lab 학습일지] numpy, pandas 본문

카테고리 없음

[AI lab 학습일지] numpy, pandas

붕옥아이젠 2023. 12. 29. 20:34

데이터 프레임을 다루는 훌륭한 툴인 Pandas의 기초적인 사용법을 배웠다. 우선 판다스 데이터 프레임 객체는 다음과 같은 방식으로 만들수 있다.

# 12x4 행렬에 1부터 36까지의 숫자를 원소를 가지고, index는 0부터 시작하고, coulmns은 순서대로 X1, X2, X3, X4로 하는 DataFrame 생성
np.random.seed()
df = pd.DataFrame(data=np.random.randn(10, 3),
                 columns=['X1', 'X2', 'X3'],
                 index=pd.date_range('2024-01-01', '2024-01-10'))
df

 

설정값으로부터 유추할 수 있듯이 df.index를 출력하면 2024-01-01 ~ 2024-01-10까지 나온다. df.coulmns를 출력하면 x1,x2,x3가 나오고 df.values를 하면 랜덤으로 들어간 값이 나온다.

 

 

특정 column 가져오기

df['x2]

 

특정 column에 2 제곱하기

df['x1']**2

 

전반적인 통계정보를 확인하는 법

df.describe()

 

 

 

데이터 프레임 합치기

concat과 merge
 
# inner : 교집합.
#pd.merge(df1, df2, how='inner', on='A')
pd.merge(df1, df2, how='outer', on='A')
 
# 그냥 합치기 (concatenation)
pd.concat([df1, df2, df3])
 
 
 
 

타이타닉 데이터 조사

titanic.Survived.value_counts(normalize=True)

normalize 옵션은 ratio를 보겠다는 의미이다.

 

# Q2. 여성 승객들의 평균 나이.
female = titanic[titanic.Sex == 'female']  # boolean mask(=filter) --> fancy indexing
np.mean(female.Age)  # female.Age.mean()
 
# DataFrame의 특정 조건에 해당하는 데이터를 뽑는 방법.
# .loc[row에 대한 조건, col에 대한 조건]
female_age = titanic.loc[titanic.Sex == 'female', 'Age']
np.mean(female_age)
 
 
# Q3. 남성 승객들중에서 가장 높은 fare.
male_fare = titanic.loc[titanic.Sex == 'male', 'Fare']
np.max(male_fare)
 
 
# Q4. 이름에 Mrs.가 포함된 사람 찾기 (= 기혼 여성이 몇명인지 찾기)
titanic[titanic.Name.str.contains('Mrs')]
 
 
# Q6. 해당 column의 결측치가 50% 이상인 column을 찾아서 drop하기
drop_cols = titanic.columns[titanic.isnull().mean() >= 0.5] # 각 column별 결측치 비율이 50% 이상인 column.
titanic = titanic.drop(columns=drop_cols) # overwrite
titanic
 
 이때 .mean()은 .sum() / len(data)와 같다. isnull() 값들을 sum()할 수 있는 이유는 bool 자료형이 내부적으로는 숫자이기 떄문이다.(True == 1, False == 0)
 
 

//Numpy (Numerical Python)

- 파이썬의 고성능 과학 계산용 패키지

 

 

특징) 

- list보다 빠르고 메모리 효율적

- 반복문 없이 배열 처리 가능

- 선형대수 연산 지원

- c,cpp, 포트란 등과 통합 가능

comment) python언어 자체가 c로 만들어진 언어이기 때문이다.

 

 

array의 생성)

import numpy as np
ex_array = np.array([1,2,3,4], float)
print(ex_array)

array([1.,2.,3.,4.])

 

 

array의 shape)

원소가 3개인 1차원 array .shape 

>> (3,)

원소가 3개있는 원소가 4개인 2차원 array.shape

>> (4,3)

원소가 2개있는 원소가 3개가 있는 원소가 4개인 3차원 array.shape

>> (2,4,3)

>> 행이 점점 뒤로 밀린다.

 

-size: data의 개수

-ndim: 배열(array)의 차원

 

 

 

reshape) 

- 차원은 다르지만 원소의 개수는 같은 다른 배열로 만들기

예제코드)

import numpy as np
ex_matrix = [[1,2,3,4], [1,2,3,4]]
print(np.array(ex_matrix).reshape(8,))

 

if) row의 갯수를 모르면 -1로 두고 column에 숫자를 넣으면 데이터 개수만큼 알잘딱으로 보정해줌.

위의 예제에서

.reshape(-1,4) 이렇게 해주면 데이터가 8개니깐 컴퓨터가 -1 자리에 2를 넣어줌

 

 

 

flattan)

- 다차원 array를 1차원 array로 변환

.flatten()

 

 

 

slicing)

네이버부스트코스 - 인공지능 기초 다지기

 

arrange)

- array의 범위를 지정하여 값의 list를 생성하는 명령어

import numpy as np

print(np.arange(30))
"""
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 24 25 26 27 28 29]
"""
print(np.arange(0,5,0.5))
"""
[0.  0.5 1.  1.5 2.  2.5 3.  3.5 4.  4.5]
"""
print(np.arange(30).reshape(5,6))
"""
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]
 [24 25 26 27 28 29]]
"""

 

 

 

zeros,ones)

- 0 혹은 1로 배열을 채워줌.

array = np.ones((2,5))
print(array)
"""
[[1. 1. 1. 1. 1.]
 [1. 1. 1. 1. 1.]]
 """

 

 

한 축에 있는 원소만 더하는 법)

test_array = np.arange(1,13).reshape(3,4)
print(test_array.sum(axis=1))
#1+2+3+4 = 10
#5+6+7+8 = 26
#9+10+11+12 = 42

>> sum 함수에 axis를 지정해주면 된다.

새로 만들어진 축이 무조건 0임 (<< 이거 중요)

만약에 2차원이면 column이 인덱스 0이고

만약에 3차원이면 height가 인덱스 0이 되고 나머지는 한칸씩 밀림

 

 

 

수학 연산자 사용하는 법)

form) np.수학 연산자

i.e) np.sqrt(test_numpy) #sqrt: 루트

 

 

 

배열 합치는 법)

a = np.array([[1,2,3]])
b = np.array([[4,5,6]])
print(np.concatenate(   (a,b),   axis = 0))
"""
[[1 2 3]
 [4 5 6]]
"""

 

 

배열 연산)

+

-

x

>> 배열의 크기가 같으면 같은 위치에 있는 원소끼리 연산을 지원해줌.

 

일반적인 선형대수에 쓰이는 배열 간의 곱(Dot product)

>> test_a.dot(test_b)

이렇게 해주면 됨.

 

 

 

배열의 크기가 다른 배열간의 연산)

- broadcasting

matrix_ex = np.array([[1,2,3],[4,5,6]], float)
scalar = 3
print( matrix_ex + scalar ) 

"""
[[4. 5. 6.]
 [7. 8. 9.]]
"""

모든 원소에 3씩 더해짐.

 

 

배열에 조건식 걸기)

i.e_1)

a = np.arange(10)
print(a > 5)
>> [False False False False False False  True  True  True  True]
print(np.any(a>5)) #a중에 5보다 큰 녀석이 있느냐?
>> True

 

 

배열 속 원소의 인덱스 번호 찾기)

a = np.arange(10)
print(np.where(a>5))
# (array([6, 7, 8, 9], dtype=int64),) 
>> 인덱스 6,7,8,9번에 있는 원소들이 5보다 크다는 것을 알 수 있다.

 

 

 

최댓값 최솟값 찾기)

a = np.array([1,2,4,5,8,78,23,3])
print(np.argmax(a), np.argmin(a))
#5 0
>> 가장 큰 값의 인덱스 번호, 가장 작은 값의 인덱스 번호 호출

cf) 축을 기준으로 찾을 수 있다.

 

 

 

boolen index)

- 특정 조건에 맞는 원소들을 배열 형태로 따로 추출할 수 있다.

test_array = np.array([1,2,4,5,8,78,23,3])
print(test_array[test_array > 3])
#[ 4  5  8 78 23]
>> - True(3보다 큰)인 index의 원소들만 추출했다.

cf) 이런 것도 가능하다.

a = np.array([1,2,3,4,5,6,7])
b = a > 5
print(b.astype(np.int64))
"""
[0 0 0 0 0 1 1]
"""

 

 

 

fancy index)

- array를 index value로 사용할 수 있다.

a = np.array([2, 4, 6, 8], float)
b = np.array([0, 0, 1, 3, 2, 1], int)   #반드시 integer로 선언
print(a.take(b))
#[2. 2. 4. 8. 6. 4.]

- 다차원 배열에도 사용가능하다.

a = np.array([[2, 4], [6, 8]], float)
b = np.array([0, 0], int)   #반드시 integer로 선언
c = np.array([0,1], int)
print(a[b,c])
#[2. 4.]

 

 

numpy 파일 저장, 불러오기)

a = np.array([[2, 4], [6, 8]], float)
np.save("npy_test", arr=a)
b = np.load(file="npy_test.npy")

cf).npy는 파이썬의 기본적인 파일 저장 방식인 pickle을 그대로 사용한 것이다.(이진 파일임.)

 

comment) where, brodcasing, argmin, argmax, fancy index, boolen index등등이 있다는 걸 기억만 하고 디테일한 요소는 검색을 통해 찾아가면서 해도 된다.