StringIOを使用して区切りテキストファイルをNumPyに読み込む

StringIOを使用して区切りテキストファイルをNumPyに読み込む

  • 人工知能(AI)
6分で読めます 更新日 Jan 12, 2021

ポイント: このチュートリアルでは、StringIOパッケージを使用して区切りテキストデータをNumPy配列に読み込む方法を説明し、データインポートに必要なコードとパラメータを含めます。

  • CSVデータをNumPy配列にインポートするためのStringIOの使用を示します。
  • 実用的な例、コードスニペットを提供し、欠損値とデータ型の処理について議論します。

このチュートリアルでは、StringIOパッケージを使用して区切りテキストデータをNumPy配列に読み込む方法を示します。

使用したデータ

この犯罪データを読み込みます:

    ,crime$cluster,Murder,Assault,UrbanPop,Rape
Alabama,4,13.2,236,58,21.2
Alaska,4,10,263,48,44.5
Arizona,4,8.1,294,80,31
Arkansas,3,8.8,190,50,19.5
California,4,9,276,91,40.6
Colorado,3,7.9,204,78,38.7
Connecticut,2,3.3,110,77,11.1
Delaware,4,5.9,238,72,15.8
Florida,4,15.4,335,80,31.9

パラメータ

以下のコードでは、urllibを使用してデータをダウンロードします。その後、np.genfromtxtを使用してNumPy配列にインポートします。以下のパラメータに注意してください:

delimiter="," 列の間の区切り文字。
skip_header=1 ヘッダーには列のヘッダーが含まれており、データではないため、スキップします。
dtype=dtypes

このパラメータは、名前を割り当てられたnumpy dtype(データ型)としてデータを変換するためにタプル(name, dtype)を使用します。

名前を割り当てたくない場合は(dtype1, dtype2, …)を使用します。

型floatを使用します。NumPyはC言語で構築されているため、32ビット整数などの多くのctypesを使用できます。

これは、データを" "に変換するS12をstrとして使用します。U12のUnicodeを使用することもできます。

np.string_やnp.unicode_と書くこともできますが、長さが指定されていないため、これはヌル終端バイトを意味し、文字列ではありません。そのため、空白が返されます。

objectを使用することもできます。

NumPyはこれらの名前を使用します:

·        dtype=[('crime', 'S12'), ('cluster', '<f8'), ('Murder', '<f8'), ('Assault', '<f8'), ('UrbanPop', '<f8'), ('Rape', '<f8')])

·        <記号は、バイト順序を示し、リトルエンディアンまたはビッグエンディアンのいずれかになります。

usecols=(1,5) このパラメータは使用しませんでした。使用していた場合は、最初の列をスキップしていました。

説明されたコード

以下がコードです:

    import urllib
import numpy as np
from io import StringIO
url = "https://raw.githubusercontent.com/werowe/MLexamples/master/crime_data.csv"
file = urllib.request.urlopen(url)
data = ""
for d in file:
data = data + d.decode('utf-8')
dtypes=[('crime',"S12"),
('cluster', float),
('Murder' ,float),
('Assault',float),
('UrbanPop',float),
('Rape',float)]
arr=np.genfromtxt(StringIO(data), delimiter=",", skip_header=1,
dtype=dtypes)

結果は:

    array([(b'Alabama', 4., 13.2, 236., 58., 21.2),
(b'Alaska', 4., 10. , 263., 48., 44.5),

NumPyが文字列列に対してバイト配列を返したことに注意してください。文字列が必要な場合は、Unicodeを使用できます:

    dtypes=[('crime','U25'),
('cluster', '>f'),
('Murder' ,float),
('Assault',float),
('UrbanPop',float),
('Rape',float)]

結果は:

    array([('Alabama', 4., 13.2, 236., 58., 21.2),
('Alaska', 4., 10. , 263., 48., 44.5),

dtypesを省略してNumPyにデータ型を選択させると、文字列列にNaN(欠損データ)が追加されます。また、すべての数値値のデフォルトはfloatです。

    arr=np.genfromtxt(StringIO(data), delimiter=",", skip_header=1)

結果は:

    array([[  nan,   4. ,  13.2, 236. ,  58. ,  21.2],
[  nan,   4. ,  10. , 263. ,  48. ,  44.5],

列に名前を割り当てたため、インデックスの代わりにその名前を参照できます:

    arr['Murder']
    array([13.2, 10. ,  8.1,  8.8,  9. ,  7.9,  3.3,  5.9, 15.4, 17.4,  5.3,
2.6, 10.4,  7.2,  2.2,  6. ,  9.7, 15.4,  2.1, 11.3,  4.4, 12.1,
2.7, 16.1,  9. ,  6. ,  4.3, 12.2,  2.1,  7.4, 11.4, 11.1, 13. ,
0.8,  7.3,  6.6,  4.9,  6.3,  3.4, 14.4,  3.8, 13.2, 12.7,  3.2,
2.2,  8.5,  4. ,  5.7,  2.6,  6.8])

欠損値

NumPyに欠損値のための値として-1を挿入するように指示できます。フロートのデフォルト動作はnp.nanです。整数の場合は-1です。

    Alaska,4,10,263,48,44.5
Arizona,4, ,1,294,80,31

これでこのチュートリアルは終了です。

関連する読み物

これらの投稿は私自身の意見であり、BMCの立場、戦略、または意見を必ずしも代表するものではありません。

人工知能(AI)の関連記事

The Briefを購読する

このオファーに登録することで、あなたはBMCのプライバシーポリシーを読み、同意したことを確認します。

ありがとう

あなたはThe Briefに登録されました
The Briefはメインフレームとエンタープライズオーケストレーション—BMC AMIとControl-M—および、両者に関するアナリストの研究、顧客の展開、イベントをカバーしています。