5/14 Today I Learned

boks·2024년 5월 14일
post-thumbnail

📖 학습한 내용

  • encoding
  • Numpy
  • Pandas

📖 핵심내용

📌 encoding

현재 시스템의 인코딩을 확인하기

import sys
sys.stdin.encoding

-> cp949 이므로 파일을 저장하거나 열어볼때, 기본적으로 인코더가 cp949 작동한다.
따라서 인코더가 이와 다르다면, 문자가 깨지는데 이때 인코더를 지정해야한다.

파일 열기 및 저장에서의 인코딩

  • 파일을 저장할때 지정한 인코딩으로 열어야 문자가 깨지지 않는다.

예시

  • utf-8, euc-kr
# utf-8 형식으로 파일 작성
with open("test/test1.txt", 'w', encoding='utf-8') as f:
    f.write(write_text)

# 파일 읽기
with open('test/test1.txt','r', encoding='utf-8') as f:
    load_text = f.read()

# euc-kr 형식으로 파일 작성
with open("test/test2.txt", 'w', encoding='euc-kr') as f:
    f.write(write_text)    
    
# 파일 읽기
with open('test/test2.txt','r', encoding='euc-kr') as f:
    load_text = f.read()

파일 인코딩 형식 찾기

  • 열어보려는 파일이 어떤 인코딩을 사용했는지 확인하기
  • chardet 이용 -> 설치 필요
  • 파일을 바이너리로 읽은 뒤, detect함수 사용

예시

import chardet
# 파일을 바이너리로 읽어보자
with open('test/test1.txt', 'rb') as f: # rb -> 바이너리 형식으로 열기
    data = f.read()
print(data)

# detect 함수로 바이너리의 정보 확인!
print(chardet.detect(data))


-> 인코딩이 utf-8로 되어 있음을 확인!

📌 numpy 튜토리얼

  • 넘파이 공식사이트 - 사용방법

    https://numpy.org/doc/stable/user/absolute_beginners.html

  • 특징
    - c언어로 구현되어 있어서, 느린 파이썬보다 빠르다는 장점이 있다.

    • 다차원 배열 및 행렬 데이터 구조를 다룬다.
    • 빠르고 다차원 구조를 다루기에 과학 및 엔지니어링 분야에 광법위하게 활용된다.

파이썬의 리스트와 넘파이 배열 비교

  • 리스트는 하나의 리스트 안에 여러 종류 자료형 포함 가능
  • 배열은 미리 자료형을 하나로 통일한다면 속도가 빠르다.
  • 배열은 메모리 소모가 적고 최적화 되어있다.

브로드캐스팅

  • 서로 다른 shape의 배열들 간에 산술 연산을 수행할 수 있는 기능

  • 비슷한 위치에 있는 요소끼리 각각 연산을 한다.

  • + - * /
    - 숫자의 경우 각요소의 데이터와 숫자와 연산한다.
    - 배열일 경우 열의 갯수가 맞으면 각각의 요소와 비슷한 요소끼리 연산을 한다.

여러 함수

  • concatenate()
    - concatenate((배열), axis=None)

    • axis = 0 이라면 행의 방향 합치기
    • axis = 1 이라면 열의 방향 합치기
    • 비슷한 방법으로 vstack(), hstack() 이있다.
  • unique()
    - 중복된 값을 찾아 제거하고 배열에서 고유한 값만 반환한다.
    - unique_values, first_indices, counts = np.unique(arr, return_index=True, return_counts=True)

    • 고유한 값의 첫 인덱스를 찾거나, 중복값이 몇번 나오는지 알 수 있다.
  • reshape()
    - 배열의 모양(shape)을 변경하는 데 사용
    • 차월을 늘리거나 줄이거나 할 수 있다.
    • 배열의 요소와 크기가 같아야한다.

이외 자주 쓰는 넘파이 함수 및 키워드

np.array()
np.zeros()
np.ones()
np.arange()
np.linspace()
np.sort()
np.concatenate([], axis=None)
shape
ndim
reshape()
np.newaxis

📌 pandas 튜토리얼

Series

  • 인덱스와 연결된 값이 있다
  • 여러가지 유형을 담을 수 있다.
  • 넘파이의 배열과 비슷하지만, 데이터에 라벨이 지정되어있다.
  • pandas.Series()
  • 인덱스를 정하지 않으면 자동으로 0부터 오름차순으로 배정

DataFrame

  • 표 형식의 데이터를 저장하고 조작하는 데 사용되는 2차원 데이터 구조
  • 행과 열이 있는 테이블 형식의 데이터
  • 각 열들은 Series형으로 이뤄져있다.
  • pandas.DataFrame()
  • 행과 열 인덱스를 정하지 않으면 자동으로 0부터 오름 차순으로 결정
  • 디렉토리 형식으로 만들 수 있다. 키값은 컬럼의 인덱스, 벨류는 값으로 배정이 가능하다.
  • 로우 컬럼 인덱스 확인
    - 로우 인덱스 확인 데이터프레임객체.index
    • 컬럼 인덱스 확인 데이터프레임객체.columns

자주 쓰이는 여러 함수

  • to_numpy
  • head()
  • tail()
  • describe()
  • T
  • sort_index()
    axis=0 or 1
  • sort_values()

DataFrame indexing과 slicing

  • 데이터프레임객체[컬럼명] : 해당 컬럼 출력

loc : 라벨 기반 인덱싱이다. 행과 열의 라벨을 사용하여 데이터를 선택한다.
at : 라벨 기반 인덱싱이다. 하나의 데이터에 접근할 때 사용한다.
iloc : 정수 위치 기반 인덱싱입니다. 행과 열의 정수 위치를 사용하여 데이터를 선택한다.
iat : 정수 위치 기반 인덱싱이다. 하나의 데이터에 접근할 때 사용한다.

📖 흥미로운 점 / 새로 알게된 점

  • 저번 시간부터 인코딩에서 오류가 안나길래 당연히 기본값이 'utf-8'인줄 알았다. 하지만 확인 자신의 인코딩 기본 값을 확인할 수 있었다. 방법은 아래와 같고 'cp949'가 나왔다.
import sys
sys.stdin.encoding

그래서 좀 번거롭게 encoding='utf-8'을 적어줘야하는 부분이 있었는데, 이것을 아래와 같이 적으면 기본 값이 'utf-8'로 바뀌어서 일일히 적지 않아도 된다.

import io
sys.stdin = io.TextIOWrapper(sys.stdin.buffer, encoding='utf-8')

📖 어려운 부분

  • numpy의 and &, or |. 넘파이는 특이하게 and or 연산자를 쓸 수 없고, & |를 사용한다. 자주 안쓰면 잊어버려서 and나 or을 쓰고나서, 왜 에러나는지 못찾을것 같다. 어렵진 않지만 헷갈린다. 기억해두자

📖 이후 학습 계획

  • pandas
    - merge
    - groupby
  • openCV
    - img 불러오기
    - 동영상 불러오기
    - 이미지 다루기

📖 기타

미니퀴즈

  1. 넘파이

    3의 배수 이면서 5의 배수인 요소 인덱싱
    3의 배수 이거나 5의 배수인 요소 인덱싱

#3의 배수 이면서 5의 배수인 요소 인덱싱
#3의 배수 이거나 5의 배수인 요소 인덱싱
a = np.arange(1,31)

index1 = a[(a%2==0) & (a%5==0)]
index2 = a[(a%2==0) | (a%5==0)]

print(index1)
print(index2)

  1. 판다스

    2013-01-03 ~ 2013-01-05 B와 C 컬럼에있는 값을 선택해보세요.
    2013-01-05, D에 해당하는 값을 선택해보세요

#2013-01-03 ~ 2013-01-05 B와 C 컬럼에있는 값을 선택
df.loc['2013-01-03':'2013-01-05', ['B','C']]

#2013-01-05, D에 해당하는 값을 선택해보세요
df.at['2013-01-05', 'D']

  • 오늘은 크게 그렇게 어렵지 않았다. 예전에 넘파이와 판다스를 예습해서 그런 것 같다.
    하지만 아주 익숙하지는 않다. 많이 써보고 많이 고쳐보자. 넘파이와 판다스는 아주 중요한 패키지니깐 잘 익혀둬야겠다.
profile
설계엔지니어의 변신

0개의 댓글