2015-09-15 11 views
8

私はパンダの使用をシミュレートして、常に変化するファイルにアクセスしようとしています。pandasのストリーミングデータ

私は1つのファイルにcsvファイルを読み込み、それに行を追加してから、ランダムな時間スリープして一括入力をシミュレートします。

import pandas as pd 
from time import sleep 
import random 

df2 = pd.DataFrame(data = [['test','trial']], index=None) 

while True: 
    df = pd.read_csv('data.csv', header=None) 
    df.append(df2) 
    df.to_csv('data.csv', index=False) 
    sleep(random.uniform(0.025,0.3)) 

2番目のファイルがデータフレームの形状を出力することによって、データの変化をチェックしている:

import pandas as pd 

while True: 
    df = pd.read_csv('data.csv', header=None, names=['Name','DATE']) 
    print(df.shape) 

私はDFの正しい形状を取得していながら、それに問題があり、そこにされていますそれが出力されている特定の時間は(0x2)です。

すなわち:

... 
(10x2) 
(10x2) 
... 
(10x2) 
(0x2) 
(11x2) 
(11x2) 
... 

これは、形状が一部なくとの間の各変化(データフレームに追加するファイル)で発生しました。

これは、最初のスクリプトがファイルを開いてデータを追加するときに発生し、2番目のスクリプトはそれにアクセスできないため、データ損失が発生することになります(0x2)。

ストリームに直接アクセスすることはできません。出力ファイルのみにアクセスすることはできません。それとも他の解決策がありますか?

編集

この目的は、「オンザフライ」だけ新しいデータをロードする(私はそれを行うコードを持っている)と分析を行うことです。分析の一部には、出力/秒、グラフ(ストリームプロットと同様)、その他の数値計算はほとんどありません。

最大の問題は、私がcsvファイルのみにアクセスできることと、損失や遅延なしにデータを分析できるようにする必要があることです。

+0

基本的に目標は何ですか?ファイルの変更をチェックするウォッチドッグのようなものが、より良いアプローチかもしれませんか? –

+1

ロックを実装して、一度に1つのプロセスだけがファイルを開くことができるようにすることもできます.UNIXにはさまざまな方法があります。http://stackoverflow.com/questions/29520587/checking-running-python-script-within-the- python-script/29522672#29522672 1つのプロセスの読み込みと他の書き込みはおそらくあなたのデータを失うことはありませんが、変更をテストするためにデータを使用している場合、不正な出力が発生します –

+0

ウォッチドッグは面白いツールのようです。私は詳細を説明するために私の質問を編集しました。 – Leb

答えて

2

スクリプトの1つがファイルを読み込み、もう一方はファイルに書き込もうとしています。両方のスクリプトが同時にファイルにアクセスすることはできません。 Padraic氏のように、Cunningham氏はコメントで、この問題を解決するためのロックファイルを実装できると述べています。

文書herelockfileと呼ばれるちょうどよいことをするpythonパッケージがあります。ここで

が実装ロックファイルパッケージを使用して最初のスクリプトです:

import pandas as pd 
from time import sleep 
import random 
from lockfile import FileLock 

df2 = pd.DataFrame(data = [['test','trial']], index=None) 
lock = FileLock('data.lock') 

while True: 
    with lock: 
     df = pd.read_csv('data.csv', header=None) 
     df.append(df2) 
     df.to_csv('data.csv', index=False) 
    sleep(random.uniform(0.025,0.3)) 

ここでは、実装ロックファイルパッケージと2番目のスクリプトです:

import pandas as pd 
from time import sleep 
from lockfile import FileLock 

lock = FileLock('data.lock') 

while True: 
    with lock: 
     df = pd.read_csv('data.csv', header=None, names=['Name','DATE']) 
    print(df.shape) 
    sleep(0.100) 

私ができるように、私は100ミリ秒の待ち時間を追加しましたコンソールへの出力を遅くします。

これらのスクリプトは、 "data.csv"ファイルにアクセスする前に "data.lock"というファイルを作成し、 "data.csv"ファイルにアクセスした後で "data.lock"ファイルを削除します。どちらのスクリプトでも、 "data.lock"ファイルが存在する場合、スクリプトは "data.lock"ファイルが存在しなくなるまで待機します。

+0

最初のスクリプトが常に更新されているファイルのシミュレーションであるため、これは機能しません。実際には、私はファイルを読んでいるところでしか第2のスクリプトを変更/編集できません – Leb

1

シミュレーションスクリプトは、data.csvファイルを読み書きします。あるスクリプトが書き込み専用としてファイルを開き、もう一方のファイルが読み取り専用としてファイルを開くと、同時に読み書きできます。これにより

は心の中で、私は次のようにファイルを書き込むため、あなたのシミュレーションスクリプトを変更:Pythonで

from time import sleep 
import random 

while(True): 
    with open("data.csv", 'a') as fp: 
     fp.write(','.join(['0','1'])) 
     fp.write('\n') 
    sleep(0.010) 

、「」手段は書き込み専用として追加してファイルを開きます。 'a +'を使用すると、読み書きアクセスが追加されます。ファイルを書き込むコードは書き込み専用としてファイルを開き、ファイルを読み込んでいるスクリプトはファイルに書き込まないでください。それ以外の場合は、別のソリューションを実装する必要があります。

ここで言及した問題なしに2番目のスクリプトを使用して読むことができるはずです。