2

私は小さなコーディングの問題に遭遇しました。基本的に、次のような.csvファイルからデータを読み取る必要があります。

2011-06-19 17:29:00.000,72,44,56,0.4772,0.3286,0.8497,31.3587,0.3235,0.9147,28.5751,0.3872,0.2803,0,0.2601,0.2073,0.1172,0,0.0,0,5.8922,1,0,0,0,1.2759

ここで、基本的にこのような行で構成されるファイル全体を解析して、numpy配列にする必要があります。これまで、次のようなコードを使用して、それらを大きな文字列型オブジェクトに取り込むことができました。

order_hist = np.loadtxt(filename_input,delimiter=',',dtype={'names': ('Year', 'Mon', 'Day', 'Stock', 'Action', 'Amount'), 'formats': ('i4', 'i4', 'i4', 'S10', 'S10', 'i4')})

このファイルの形式は、現在のところS20データ型のセットで構成されています。基本的に、大きなORDER_HISTデータ型のすべてのデータを各列の配列のセットに抽出する必要があります。日時列を保存する方法がわかりません(今のところ文字列として保持しています)。残りをfloatに変換する必要がありますが、以下のコードでエラーが発生します。

    temparr=float[:len(order_hist)]
    for x in range(len(order_hist['Stock'])): 
        temparr[x]=float(order_hist['Stock'][x]);

誰かが私にすべての列を必要な配列に変換する方法を教えてもらえますか?または、そうするためのリンクに私を導く可能性がありますか?

4

1 に答える 1

5

少年、私はあなたのために御馳走を持っていますか。numpy.genfromtxtにはconvertersパラメーターがあり、ファイルの解析時に各列の関数を指定できます。関数にはCSV文字列値が提供されます。その戻り値は、numpy配列の対応する値になります。

さらに、このdtype = Noneパラメーターはgenfromtxt、各列のタイプについてインテリジェントな推測を行うように指示します。特に、数値列は自動的に適切なdtypeにキャストされます。

たとえば、データファイルに次のものが含まれているとします。

2011-06-19 17:29:00.000,72,44,56

それで

import numpy as np
import datetime as DT

def make_date(datestr):
    return DT.datetime.strptime(datestr, '%Y-%m-%d %H:%M:%S.%f')

arr = np.genfromtxt(filename, delimiter = ',',
                    converters = {'Date':make_date},
                    names =  ('Date', 'Stock', 'Action', 'Amount'),
                    dtype = None)
print(arr)
print(arr.dtype)

収量

(datetime.datetime(2011, 6, 19, 17, 29), 72, 44, 56)
[('Date', '|O4'), ('Stock', '<i4'), ('Action', '<i4'), ('Amount', '<i4')]

実際のcsvファイルにはより多くの列があるため、にさらにアイテムを追加する必要がありますnamesが、それ以外の場合は、例はそのままです。

余分な列をあまり気にしない場合は、次のように綿毛の名前を割り当てることができます。

arr = np.genfromtxt(filename, delimiter=',',
                    converters={'Date': make_date},
                    names=('Date', 'Stock', 'Action', 'Amount') +
                    tuple('col{i}'.format(i=i) for i in range(22)),
                    dtype = None)

収量

(datetime.datetime(2011, 6, 19, 17, 29), 72, 44, 56, 0.4772, 0.3286, 0.8497, 31.3587, 0.3235, 0.9147, 28.5751, 0.3872, 0.2803, 0, 0.2601, 0.2073, 0.1172, 0, 0.0, 0, 5.8922, 1, 0, 0, 0, 1.2759)

また、上に構築され、CSVの解析をさらに高度なレベルに引き上げるpandasモジュールを確認することもできます。これには、パラメーターが日付文字列を自動的に解析するpandas.read_csv関数があります(dateutil使用)。numpyparse_dates = True

パンダを使用すると、csvを次のように解析できます

df = pd.read_csv(filename, parse_dates = [0,1], header = None,
                    names=('Date', 'Stock', 'Action', 'Amount') +
                    tuple('col{i}'.format(i=i) for i in range(22)))

numpy配列ではなく、make_date関数. Just to be clear --pands.read_csvDataFrameを指定する必要がないことに注意してください。returns aDataFrame実際にはあなたの目的にとってより有用かもしれませんが、それは利用して探索するためのまったく新しい方法の世界を備えた別のオブジェクトであることに注意する必要があります。

于 2013-01-24T02:56:10.907 に答える