2017-01-03 8 views
0

によって大きなCSVファイルを凝縮だから私がどのように見えるで働いているcsvファイル:ソート/複数の列

Date Time,   SegmentID, indicatorvalue 
2016-12-01T00:00:00Z 147649  1 
2016-12-01T00:01:00Z 147649  0 
2016-12-01T00:02:00Z 147649  1 
...     ...   ... 
2016-12-01T00:23:00Z 2938733  0 

電気ショック療法。

私が望むのは、すべてのセグメントのリストにそれを凝縮させ、そのセグメントのエントリのうちどれくらいの数がインジケータの値を持つかをパーセンテージ(AM/IP/PM/OP )

例:

segmentID, Time Period, Percentage 
147649  AM   78 
147649  IP   100 
147649  PM   60 
147649  OP   30 
243546  AM   79 
243546  IP   98 
...   ...   ... 

私の試みは、各セグメントのために、それが持っていた後、一度、一日の4回の指標の割合の累計を保つなるように、ループのために設定しました新しいセグメントIDに変更されたことが検出されました。これらの値は文字列に追加されます。

問題は、セグメントIDが順序付けられておらず、同じsegmentIDに対して複数のエントリが存在することです。 SegmentIDでファイルを注文しようとしましたが、ファイルが非常に大量です。別のアプローチに関する提案はありますか?

EDIT:自分のコメントを削除した 誰かが私のコードは、現在、研究のビットの後ので、私は、パンダを使用する必要があることを掲示:

import numpy as np 
import pandas as pd 

df=pd.read_csv("data.csv",sep=",",index_col="Segment ID",usecols=["Segment ID","Date Time","indicatorvalue"]) 
df['Date Time'] = ['AM' if '06' <= x[11:13] < '10' 
    else 'IP' if '10' <= x[11:13] < '16' 
    else 'PM' if '16' <= x[11:13] < '19' 
    else 'OP' if '19' <= x[11:13] or x[11:13] < '06' 
    else 'Error' for x in df['Date Time']] 

は今、私はちょうどで行を凝縮する方法を作業する必要がありますそれらの「指標値」を平均化しながら、「Date Time」および「SegmentID」のエントリを複製します。

+0

どのように大規模ですか? –

+0

約3.5GB、何行が何百万もあるかわからない –

+0

どのくらいのメモリが利用可能で、どれくらいのセグメントが必要ですか? –

答えて

0

のテストを欠いパンダ。私が使用したコードは:

import pandas as pd 

df=pd.read_csv("data.csv",sep=",",usecols=["Segment ID","Date Time","indicator value"]) 

df['Date Time'] = ['AM' if '06' <= x[11:13] < '10' 
    else 'IP' if '10' <= x[11:13] < '16' 
    else 'PM' if '16' <= x[11:13] < '19' 
    else 'OP' if '19' <= x[11:13] or x[11:13] < '06' 
    else 'Error' for x in df['Date Time']] 

grouped = df.groupby(['Segment ID','Date Time']).mean() 

grouped.to_csv('output.csv', sep =',') 

私は十分にパンダをお勧めできません。

0

入力ファイルの構造は、開始時間、セグメントID、およびインジケータの値を与える1分あたり1行であるとします。

セグメントの数が使用可能なメモリと互換性がある場合は、一度に1行ずつ入力ファイルを読み込み、セグメントごとに8つのカウンタ、つまり時間帯とインジケータの値を追加します。つまり、最初のファイルはソートされずに1回だけ読み込まれ、唯一の重要な部分はセグメント数です.DIFファイルが高すぎると、dictではなくsqlite3またはdbmデータベースを使用します。あなたの現在の例では

(とはない CSVである)、コードは次のようになります。

class Segment: 
    labels = ['AM', 'IP', 'PM', 'OP'] 
    def __init__(self, segid): 
     self.id = segid 
     self.values = [ [ 0, 0 ] for i in range(4) ] 
    def add(self, hour, indic): 
     ix = 3 
     if hour >= 6 and hour < 10: ix=0 
     elif hour >= 10 and hour < 16: ix=1 
     elif hour >= 16 and hour < 19: ix = 2 
     self.values[ix][indic] += 1 
    def percent(self, ix): 
     try: 
      return int(.5 + (100 * self.values[ix][1]/
       (self.values[ix][0] + self.values[ix][1]))) 
     except ZeroDivisionError: 
      return 0 

dummy = next(fd) 
splitter = re.compile(' +') 
segments = dict() 
for line in fd: # read and store 
    d, seg, indic = splitter.split(line.strip()) # could be replaced with a csv reader 
    hour = int(d[11:13]) 
    if not seg in segments: 
     segments[seg] = Segment(seg) 
    segments[seg].add(hour, int(indic)) 
for seg in sorted(segments.keys()): # output the stats 
    for ix in range(4): 
     print(seg, Segment.labels[ix], segments[seg].percent(ix)) 

コードの上に、私はと解決策を打ち出すことに成功し、エラーまたは例外条件

関連する問題