ポイント: このチュートリアルでは、StringIOパッケージを使用して区切りテキストデータをNumPy配列に読み込む方法を説明し、データインポートに必要なコードとパラメータを含めます。
- CSVデータをNumPy配列にインポートするためのStringIOの使用を示します。
- 実用的な例、コードスニペットを提供し、欠損値とデータ型の処理について議論します。
,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
これでこのチュートリアルは終了です。
関連する読み物
Pandasガイド
これらの投稿は私自身の意見であり、BMCの立場、戦略、または意見を必ずしも代表するものではありません。