Genfromtxt を使用したデータのインポート

NumPyBeginner
オンラインで実践に進む

はじめに

この実験(Lab)では、テキストファイルから表形式のデータを numpy.genfromtxt 関数を使用してインポートする方法を学びます。NumPy(Numerical Python)は、Python における科学計算の基本的なライブラリであり、数値データを扱うための強力なデータ構造と関数を提供します。そのコアとなるデータ構造はNumPy 配列です。これは、大規模なデータセットを高速かつメモリ効率よく格納および操作するための方法です。

numpy.genfromtxt 関数は、Python でのデータ分析の基盤であり、構造化されたデータを読み込み、NumPy 配列に変換することを可能にします。基本的なインポートから始め、ヘッダー、異なる列区切り文字、欠損値、特定のデータ列の選択といった、現実世界の一般的なシナリオに対応するためのオプションを段階的に追加していきます。すべての操作は、WebIDE で Python スクリプトを作成して実行することによって行われます。

genfromtxt による基本的なデータ読み込み

まず、環境に慣れましょう。左側のファイルエクスプローラーには、main.pymy_data.csv の 2 つのファイルが表示されます。my_data.csv からデータを読み込むために、main.py に Python コードを記述します。

numpy.genfromtxt 関数の最も基本的な使い方は、1 つの引数、つまりデータソースへのパスを必要とします。デフォルト設定でデータファイルを読み込んでみましょう。

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 に 2 つのことを伝える必要があります。

  1. データはカンマで区切られていること。
  2. 最初の行はヘッダーであり、無視されるべきであること。

これらは delimiter および skip_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. ]]

ご覧のとおり、データは現在 2 次元配列(二次元配列)として構造化されています。これはテーブルやスプレッドシートのように行と列があると考えてください。この配列には 4 つの行(各センサー読み取り値に対応)と 3 つの列(センサーID、温度、湿度)があります。数値は float(小数点値、例えば 22.5 のような)として正しく解析されています。しかし、3 行目の nan に注意してください。これは、ソースファイルに欠損した温度読み取り値を表すためにテキスト NA が含まれており、genfromtxt がそれを数値として認識しないためです。次のステップでこれを対処します。

欠損値の処理

現実世界のデータセットはしばしば不完全です。genfromtxt は、missing_values および filling_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 引数を使用して、インポートされるすべてのデータに特定の データ型 を強制することができます。プログラミングにおいて、データ型は値がどのように格納され、どのような操作が可能かを決定します。例えば、dtype=int はすべての値を整数(小数点のない数値)に変換し、dtype=float はそれらを浮動小数点数(小数点のある数値)として維持し、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

最終的な出力は、温度と湿度データのみを含む 2 次元配列になります。

[[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 を扱うすべてのデータサイエンティストまたはエンジニアにとって基本的なスキルです。