2

Pythonでこのタスクを実行する方法について質問があります:-

私は次のようなエントリの配列を持っています: [IPAddress, connections, policystatus, activity flag, longitude, latitude] (すべて文字列として)

元。

['172.1.21.26','54','1','2','31.15424','12.54464']
['172.1.21.27','12','2','4','31.15424','12.54464']
['172.1.27.34','40','1','1','-40.15474','-54.21454']
['172.1.2.45','32','1','1','-40.15474','-54.21454']

... 経度と緯度の組み合わせが約 4000 ある約 110000 エントリまで

各ロケーションの平均接続数、平均ポリシー ステータス、平均アクティビティ フラグをカウントしたい

このようなもの:

[longitude,latitude,avgConn,avgPoli,avgActi]
['31.15424','12.54464','33','2','3']
['-40.15474','-54.21454','31','1','1']

... すぐ

そして、それぞれ約110,000エントリのファイルが約195個あります(ビッグデータの問題のようなものです)ファイルは.csvにありますが、それを.txtとして使用してPythonで簡単に操作できます(これが最良のアイデアかどうかはわかりません)

私はまだPythonに慣れていないので、使用する最善のアプローチが何であるかはよくわかりませんが、この問題に関するヘルプやガイダンスを心から感謝しています

前もって感謝します!

4

3 に答える 3

0

いいえ、ファイルが.csvである場合、Pythonには優れたcsvモジュールが付属しているため、テキストとして脅迫しても意味がありません。csv行をに読み込んでdictグループ化することもできますが、適切なデータベースにデータを書き込み、SQLとを使用することをお勧めしAVG()ますGROUP BY。Pythonには、ほとんどのデータベース用のバインディングが付属しています。何もインストールしていない場合は、sqliteモジュールの使用を検討してください。

于 2012-04-21T11:57:21.993 に答える
0

ここではアルゴリズムのみを示します。実際のコードを自分で作成することで、より多くのことを学ぶことができます。

キーをフォームのペアとして、(longitude, latitude)値を for のリストとして、ディクショナリを使用します。[ConnectionSum,policystatusSum,ActivityFlagSum]

  1. エントリを 1 回ループします (エントリの総数Nを数えます)

  2. を。各エントリについて、場所が存在する場合 - conn、policystat、および Activity 値を既存の合計に追加します。

    b. エントリが存在しない場合は、値として [0,0,0] を割り当てます

  3. すべてのファイルに対して 1 と 2 を実行します。

  4. すべてのエントリがスキャンされた後。辞書をループし、リストの各要素を N で割り、それぞれ[ConnectionSum,policystatusSum,ActivityFlagSum]平均値を取得します。
于 2012-04-21T12:15:33.167 に答える
0

場所が同じファイル内 (またはファイル内で互いに近い場所) に制限されている限り、必要なのはストリーム処理パラダイムだけです。たとえば、重複する場所がファイルにのみ表示されることがわかっている場合は、各ファイルを読み取り、平均を計算してからファイルを閉じます。古いデータが範囲外にある限り、ガベージ コレクターがそれを取り除きます。基本的にこれを行います:

def processFile(pathToFile):
    ...

totalResults = ...
for path in filePaths:
    partialResults = processFile(path)
    totalResults = combine...partialResults...with...totalResults

さらに洗練された解決策は、「オンライン」で平均を計算する O(1) メソッドを使用することです。たとえば、5,6,7 を平均している場合は5/1=5.0(5.0*1+6)/2=5.5, . を実行します(5.5*2+7)/3=6。各ステップでは、現在の平均と要素数のみを追跡します。このソリューションは、使用されるメモリの量を最小限に抑え (最終結果のサイズを超えない!)、要素にアクセスする順序は気にしません。次のようになります。CSV モジュールで必要な関数については、 http://docs.python.org/library/csv.htmlを参照してください。

import csv

def allTheRecords():
    for path in filePaths:
        for row in csv.somehow_get_rows(path):
            yield SomeStructure(row)

averages = {}  # dict: keys are tuples (lat,long), values are an arbitrary
               # datastructure, e.g. dict, representing {avgConn,avgPoli,avgActi,num}

for record in allTheRecords():
    position = (record.lat, record.long)
    currentAverage = averages.get(position, default={'avgConn':0, 'avgPoli':0, 'avgActi':0, num:0})
    newAverage = {apply the math I mentioned above}
    averages[position] = newAverage

(「ある場所での平均」という概念は明確に定義されていないことに注意してください。それは明確に定義されていますが、あまり有用ではありません。すべての IP イベントの正確な場所を無限の精度で知っている場合、データセットを圧縮できる唯一の理由は、緯度と経度の精度が有限であるためです. より正確なデータを取得したときにこの問題が発生した場合は、適切な精度に丸めることができます. それは合理的かもしれません. 10 メートル以内に丸めるには、緯度と経度を参照してください。これには、ほんの少しの数学/幾何学が必要です。)

于 2012-04-21T12:16:14.373 に答える