23

私の問題は、大きな CSV ファイルからのデータを処理するコンテキストにあります。

その列で見つかった値に基づいて列のデータ型を決定 (つまり、推測) する最も効率的な方法を探しています。非常に乱雑なデータを扱っている可能性があります。したがって、アルゴリズムはある程度のエラー耐性を持つ必要があります。

次に例を示します。

arr1 = ['0.83', '-0.26', '-', '0.23', '11.23']               # ==> recognize as float
arr2 = ['1', '11', '-1345.67', '0', '22']                    # ==> regognize as int
arr3 = ['2/7/1985', 'Jul 03 1985, 00:00:00', '', '4/3/2011'] # ==> recognize as date
arr4 = ['Dog', 'Cat', '0.13', 'Mouse']                       # ==> recognize as str

結論: Python パッケージまたはいずれかを検出できるアルゴリズムを探しています。

  • CSV ファイルのスキーマ、またはそれ以上
  • 配列としての個々の列のデータ型

現在文字列として表現されているデータの型を推測する方法も同様の方向に進んでいます。ただし、多くの大きなスプレッドシート (データの由来) を扱っている可能性があるため、パフォーマンスが心配です。

4

5 に答える 5

6

少し考えた後、これが私が自分でアルゴリズムを設計する方法です。

  • パフォーマンス上の理由から: 各列のサンプルを取得します (たとえば、1%)
  • サンプル内の各セルに対して正規表現一致を実行し、データ型をチェックします
  • 度数分布に基づいて列の適切なデータ型を選択します

発生する2つの質問:

  • 十分なサンプルサイズはどれくらいですか? 小さなデータセットの場合? 大規模なデータセットの場合?
  • 頻度分布に基づいてデータ型を選択するのに十分なしきい値はどれくらいですか?
于 2011-07-26T18:16:00.663 に答える
3

正規表現を使用して事前解析を試すことができます。例えば:

import re
pattern = re.compile(r'^-?\d+.{1}\d+$')
data = '123.42'
print pattern.match(data) # ----> object
data2 = 'NOT123.42GONNA31.4HAPPEN'
print pattern.match(data2) # ----> None

このようにして、正規表現の辞書を作成し、一致するものが見つかるまでそれぞれを試すことができます

myregex = {int: r'^-?\d+$', float: r'^\d+.{1}\d+$', ....}

for key, reg in myregex.items():
    to_del = []
    for index, data in enumerate(arr1):
        if re.match(reg,data):
            d = key(data) # You will need to insert data differently depending on function
            ....#---> do something 
            to_del.append(data) # ---> delete this when you can from arr1

先頭の「^」と末尾の「$」を忘れないでください。そうでない場合、正規表現が文字列の一部と一致してオブジェクトを返す可能性があります。

お役に立てれば :)

于 2011-07-26T04:50:33.797 に答える
1

私はc#で同じ問題を解決しました。サンプル セットの作成方法は次のとおりです
。CSV のすべての列について、最も長い値を持つ行と最も短い値を持つ行を選択しました。
次に、最初の 50 行の空でない配列を作成しました。
したがって、私のサンプルには、列の範囲全体をカバーする少なくとも 0 行と最大 50 行がありました。
その後、最も広い定義から最も狭い定義まで解析しようとします。

(値が文字列) の場合、thisType = 文字列;

(値が DateTime) の場合、thisType は DateTime です。

(値が Decimal) の場合、thisType は Decimal です。

(値が整数) の場合、thisType は整数です。

(値がブール値) の場合、thisType はブール値です。

私は C# でTryParseを使用していますが、他の言語でも同様の方法を使用できると確信しています。

于 2012-02-08T15:17:32.113 に答える