0

処理が必要なデータのサブセットを含む別の書式設定された csv を生成するために、4 GB の RAM しかないマシンで大きな (2 GB) csv ファイルを処理しようとしています (質問しないでください)。ファイルを読み取り、後で出力に必要なデータを照会する HDFstore を作成しています。Termを使用してストアからデータを取得できないことを除いて、すべてが機能します-PLOTが列名ではないというエラーメッセージが返されます。個々の変数は正常に見え、ストアは私が期待するものであり、エラーがどこにあるのかわかりません。(nb パンダ v14 および numpy1.9.0)。これは非常に新しいので、ぎこちないコードをお詫びします。

#wibble wobble -*- coding: utf-8 -*-
# short version
def filesport():
    import pandas as pd
    import numpy as np
    from pandas.io.pytables import Term

    Location = r"CL_short.csv"
    store = pd.HDFStore('blarg.h5')

    maxlines = sum(1 for line in open (Location))
    print maxlines
 #set chunk small for test file   
    chunky=4
    plotty =pd.DataFrame(columns=['PLOT'])
    dfdum=pd.DataFrame(columns=['PLOT', 'mDate', 'D100'])

#read file in chunks to avoid RAM blowing up    
    bucket = pd.read_csv(Location, iterator=True, chunksize=chunky, usecols=   ['PLOT','mDate','D100'])

    for chunk in bucket:
        store.append('wibble', chunk, format='table', data_columns=['PLOT','mDate','D100'], ignore_index=True)

#retrieve plot numbers and select unique items
    plotty = store.select('wibble', "columns = ['PLOT']")
    plotty.drop_duplicates(inplace=True)

#iterate through unique plots to retrieve data and put in dataframe for output
    for index, row in plotty.iterrows():
        dfdum = store.select('wibble', [Term('PLOT', '=', plotty.iloc[index]['PLOT'])])
#process dfdum for output to new csv

    print("successful completion")
filesport()
4

1 に答える 1

0

タンブルウィードを乗り越えてここにたどり着きたいと思っており、同様に大きな .csv ファイルの処理や、データの取得/処理を試みるさまざまな方法に困惑しているユーザー向けの最終リストです。最大の問題は、pytables 用語の構文を正しくすることでした。「A > 20」などを使用できることを示すいくつかの例にもかかわらず、これは私にとってはうまくいきませんでした。Term クエリを含む文字列条件を設定すると、これが機能しました (ドキュメント TBF にあります)。
また、HDF にクエリを実行してストアから直接リスト内の一意のアイテムを取得する方が簡単であることがわかりました。リストを並べ替えて反復処理し、プロットごとにデータ プロットを取得できます。最終的なcsvファイルにプロットを入れ、次にすべてのD100データを日付順にしたかったので、最後にピボットしたことに注意してください。
csv ファイルをチャンクで読み取るということは、ストアから取得した各プロットにヘッダーがあり、これが最終的な csv に書き込まれて混乱を招くことを意味していました。ここで示したものよりも、ヘッダーを 1 つだけ記述するもっと洗練された方法があるはずです。
それは機能し、データを処理して最終的な csv ファイルを生成するのに約 2 時間かかります (最初のファイルは 2GB、3000 万以上の行、100,000 以上の一意のプロットのデータ、マシンには 4GB の RAM がありますが、32 ビットで実行されているため、2.5GB しかありません)の RAM が利用可能でした)。
同様の問題がある場合は頑張ってください。これが役立つことを願っています

#wibble wobble -*- coding: utf-8 -*-

def filesport():
    import pandas as pd
    import numpy as np
    from pandas.io.pytables import Term

    print (pd.__version__)
    print (np.__version__)

    Location = r"conliq_med.csv"
    store = pd.HDFStore('blarg.h5')

    maxlines = sum(1 for line in open (Location))
    print maxlines
    chunky=100000

#read file in chunks to avoid RAM blowing up select only needed columns
    bucket = pd.read_csv(Location, iterator=True, chunksize=chunky, usecols= ['PLOT','mDate','D100'])

    for chunk in bucket:
        store.append('wibble', chunk, format='table', data_columns=['PLOT','mDate','D100'], ignore_index=True)

#retrieve unique plots and sort 
    plotty = store.select_column('wibble', 'PLOT').unique()
    plotty.sort()
#set flag for writing file header
    i=0

#iterate through unique plots to retrieve data and put in dataframe for output
    for item in plotty:
        condition = 'PLOT =' + str(item)
        dfdum = store.select('wibble', [Term(condition)])
        dfdum["mDate"]= pd.to_datetime(dfdum["mDate"], dayfirst=True)
        dfdum.sort(columns=["PLOT", "mDate"], inplace=True)
        dfdum["mDate"] = dfdum["mDate"].map(lambda x: x.strftime("%Y - %m"))
        dfdum=dfdum.pivot("PLOT", "mDate", "D100")

#only print one header to file 
        if i ==0:
             dfdum.to_csv("CL_OP.csv", mode='a')  
             i=1
        else:
             dfdum.to_csv("CL_OP.csv", mode='a', header=False)

    print("successful completion")

filesport()
于 2015-01-31T18:35:26.687 に答える