Genfromtxt 를 사용한 데이터 가져오기

NumPyBeginner
지금 연습하기

소개

이 실습에서는 numpy.genfromtxt 함수를 사용하여 텍스트 파일에서 표 형식 데이터를 가져오는 방법을 배웁니다. NumPy (Numerical Python) 는 Python 에서 과학 컴퓨팅을 위한 기본 라이브러리로, 수치 데이터를 다루는 강력한 데이터 구조와 함수를 제공합니다. NumPy 의 핵심 데이터 구조는 NumPy 배열이며, 이는 대규모 데이터셋을 빠르고 메모리 효율적으로 저장하고 조작하는 방법입니다.

numpy.genfromtxt 함수는 Python 데이터 분석의 초석으로, 구조화된 데이터를 읽어 NumPy 배열로 변환할 수 있게 해줍니다. 기본 가져오기부터 시작하여 헤더, 다른 열 구분 기호, 누락된 값, 특정 데이터 열 선택과 같은 일반적인 실제 시나리오를 처리하기 위한 옵션을 점진적으로 추가할 것입니다. 모든 작업은 WebIDE 에서 Python 스크립트를 작성하고 실행하여 수행됩니다.

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 96%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

genfromtxt 를 사용한 기본 데이터 로딩

먼저 환경에 익숙해져 봅시다. 왼쪽에 있는 파일 탐색기에서 main.pymy_data.csv 두 개의 파일을 볼 수 있습니다. my_data.csv에서 데이터를 로드하기 위해 main.py에 Python 코드를 작성할 것입니다.

numpy.genfromtxt 함수의 가장 기본적인 사용법은 하나의 인수를 필요로 합니다. 바로 데이터 소스의 경로입니다. 기본 설정으로 데이터 파일을 로드해 보겠습니다.

main.py 파일을 열고 다음 코드를 추가하세요:

import numpy as np  ## NumPy 를 가져와 편의를 위해 'np'라는 별칭을 부여합니다.

## CSV 파일에서 데이터 로드
## 상대 경로는 유효성 검사를 실패하게 하므로, 실습에서는 절대 경로를 사용하세요.
data = np.genfromtxt('/home/labex/project/my_data.csv')

## 결과 배열 출력
print(data)

이제 파일을 저장하고 IDE 하단의 터미널에서 실행하세요.

python main.py

다음과 같은 출력을 볼 수 있습니다:

[nan nan nan nan]

이 결과는 놀라울 수 있습니다. 결과는 nan (Not a Number) 값으로 이루어진 배열입니다. NaN은 정의되지 않거나 표현할 수 없는 수치 결과를 나타내는 특별한 부동 소수점 값으로, NumPy 가 값을 숫자로 제대로 변환할 수 없음을 나타내는 방식입니다. 이는 genfromtxt가 기본적으로 줄을 공백으로 분리하고 모든 것을 부동 소수점 숫자로 해석하려고 하기 때문에 발생합니다. 저희 my_data.csv 파일은 쉼표를 구분 기호로 사용하고 숫자 이외의 헤더 줄을 포함하고 있어 기본 가져오기가 실패합니다. 다음 단계에서 이를 수정할 것입니다.

구분 기호 및 헤더 건너뛰기 지정

my_data.csv 파일을 올바르게 파싱하려면 genfromtxt에 두 가지를 알려줘야 합니다.

  1. 데이터가 쉼표로 구분된다는 점.
  2. 첫 번째 줄은 헤더이므로 무시해야 한다는 점.

이는 delimiterskip_header 인수를 사용하여 달성할 수 있습니다.

  • delimiter=',': 이 함수에 값을 구분하기 위해 쉼표를 사용하도록 지시합니다.
  • skip_header=1: 이 함수에 파일의 첫 번째 줄을 무시하도록 지시합니다.

main.py 파일을 업데이트된 코드로 수정하세요:

import numpy as np  ## NumPy 라이브러리 가져오기

## 구분 기호 지정 및 헤더 건너뛰기를 통해 데이터 로드
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1)

## 결과 배열 출력
print(data)

파일을 저장하고 터미널에서 다시 실행하세요:

python main.py

이제 출력이 훨씬 보기 좋아졌습니다:

[[ 1.   22.5  45. ]
 [ 2.   23.1  48. ]
 [ 3.    nan  46. ]
 [ 4.   23.5  52. ]]

보시다시피 데이터는 이제 2D 배열(2 차원 배열) 로 구조화되었습니다. 테이블이나 스프레드시트처럼 행과 열이 있다고 생각하면 됩니다. 저희 배열은 4 개의 행 (각 센서 판독값마다 하나씩) 과 3 개의 열 (센서 ID, 온도, 습도) 을 가지고 있습니다. 숫자는 float(소수점 값을 나타낼 수 있는 부동 소수점 숫자, 예: 22.5) 으로 올바르게 파싱되었습니다. 하지만 세 번째 줄의 nan에 주목하세요. 이는 저희 원본 파일에 누락된 온도 판독값을 나타내기 위해 NA라는 텍스트를 포함하고 있으며, genfromtxt는 이를 숫자로 인식하지 않기 때문입니다. 다음 단계에서 이를 처리할 것입니다.

결측값 처리

실제 데이터셋은 종종 불완전합니다. genfromtxtmissing_valuesfilling_values 인수를 사용하여 이를 깔끔하게 처리하는 방법을 제공합니다.

  • missing_values: 누락된 데이터로 해석되어야 하는 문자열 또는 문자열 목록입니다.
  • filling_values: 누락된 항목을 대체할 값입니다.

저희 데이터에서 누락된 값은 NA로 표현됩니다. genfromtxtNA를 누락된 값으로 인식하고 쉽게 식별할 수 있도록 -99로 바꾸도록 지시해 보겠습니다.

main.py 파일을 다음과 같이 업데이트하세요:

import numpy as np  ## NumPy 라이브러리 가져오기

## 누락된 값 처리
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1,
                     missing_values='NA', filling_values=-99)

## 결과 배열 출력
print(data)

파일을 저장하고 실행하세요:

python main.py

이제 출력에는 누락된 값이 대체된 완전한 숫자 배열이 표시됩니다:

[[  1.    22.5   45.  ]
 [  2.    23.1   48.  ]
 [  3.   -99.    46.  ]
 [  4.    23.5   52.  ]]

이제 저희 데이터는 깔끔하고 완전히 숫자화되어 계산 준비가 되었습니다.

열 선택 및 데이터 타입 설정

때로는 데이터의 일부만 필요할 때가 있습니다. usecols 인수를 사용하면 가져올 열을 지정할 수 있습니다. 이 인수는 열 인덱스 (0 부터 시작) 의 튜플(값의 변경 불가능한 시퀀스, 예: (1, 2)) 을 받습니다. 예를 들어, usecols=(1, 2)는 "열 1 과 2 만 가져오기"를 의미합니다.

또한 dtype 인수를 사용하여 가져온 모든 데이터에 대해 특정 데이터 타입(data type) 을 강제할 수 있습니다. 프로그래밍에서 데이터 타입은 값이 저장되는 방식과 해당 값에 대해 수행할 수 있는 연산을 결정합니다. 예를 들어, dtype=int는 모든 값을 정수 (whole numbers) 로 변환하고, dtype=float는 소수점 숫자 (decimals) 로 유지하도록 보장하며, dtype=str은 텍스트로 취급합니다. dtype=int는 소수점 부분을 잘라냅니다 (22.5 는 22 가 됩니다).

스크립트를 수정하여 Temperature(열 1) 와 Humidity(열 2) 만 가져오고 이들이 부동 소수점 숫자로 처리되도록 하겠습니다.

main.py를 마지막으로 업데이트하세요:

import numpy as np  ## NumPy 라이브러리 가져오기

## 특정 열 선택 및 데이터 타입 설정
data = np.genfromtxt('/home/labex/project/my_data.csv', delimiter=',', skip_header=1,
                     missing_values='NA', filling_values=0,
                     usecols=(1, 2), dtype=float)

## 결과 배열 출력
print(data)

참고: 이 예시에서는 filling_values0으로 변경했습니다.

파일을 저장하고 터미널에서 실행하세요:

python main.py

최종 출력은 온도 및 습도 데이터만 포함하는 2D 배열이 됩니다:

[[22.5 45. ]
 [23.1 48. ]
 [ 0.  46. ]
 [23.5 52. ]]

관련 열만 선택하고 모든 데이터 불일치를 처리하여 데이터셋을 성공적으로 가져오고 정리했습니다.

요약

이 실습에서는 numpy.genfromtxt를 효과적으로 사용하여 텍스트 파일에서 NumPy 배열로 데이터를 가져오는 방법을 배웠습니다. 실제 데이터 문제를 처리하기 위한 몇 가지 주요 인수를 사용하는 연습을 했습니다:

  • delimiter: 열이 분리되는 방식을 지정합니다.
  • skip_header: 데이터 파일의 헤더 줄을 무시합니다.
  • missing_values: 누락된 데이터를 나타내는 사용자 지정 문자열을 식별합니다.
  • filling_values: 누락된 데이터를 특정 값으로 대체합니다.
  • usecols: 열의 특정 하위 집합만 가져옵니다.
  • dtype: 결과 배열의 데이터 타입을 제어합니다.

genfromtxt를 숙달하는 것은 Python 및 NumPy 를 사용하는 모든 데이터 과학자 또는 엔지니어에게 기본적인 기술입니다.