2015-09-15 18 views
8

Sürekli değişen dosyalara erişmek için pandaların kullanımını simüle etmeye çalışıyorum.Pandalar için akış verileri df

Csv dosyasını okutan bir dosyam var, ona bir satır ekleyip yığın girişini simüle etmek için rastgele bir süre uyumaya devam ediyorum.

import pandas as pd 

while True: 
    df = pd.read_csv('data.csv', header=None, names=['Name','DATE']) 
    print(df.shape) 
df doğru şeklini alıyorum ederken bununla sorundur

vardır:

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)) 

İkinci dosya dataframe şeklini çıkışı yaparak verilerdeki değişim için kontrol ediyor (0x2) çıktığında belirli zamanlar.

yani .:

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

Bu meydana bazı de değil şeklin her değişiklik (dosya dataframe ekleyerek) arasında.

Bunu bilmek, ilk komut veri eklemek için dosyayı açarken ve ikinci komut dosyasına erişemediğinde, bu nedenle (0x2), bu herhangi bir veri kaybına neden olur mu?

Akıma doğrudan erişemiyorum, sadece çıktı dosyası. Yoksa başka olası çözümler var mı?

Düzenleme bu amacı "anında" analiz (Bunu yapan bir kod var) sadece yeni verileri yüklemek ve yapılacak olan

. Analizlerden bazıları, çıktı/sn, grafikleme (akış grafiğine benzer) ve diğer birkaç sayısal hesaplamayı içerecektir.

En büyük sorun, yalnızca csv dosyasına erişebilmem ve veriyi kayıp veya gecikme olmadan geldiği şekilde analiz edebilmem gerektiğidir.

+0

Esas amaç nedir? Dosyadaki değişiklikleri kontrol etmek için bekçi köpeği gibi bir şey daha iyi bir yaklaşım olabilir mi? –

+1

Ayrıca bir kilidi yalnızca bir işlemin dosyayı açabilmesi için uygulayabilirsiniz, unix'in bunu yapmanın çeşitli yolları vardır http://stackoverflow.com/questions/29520587/checking-running-python-script-within-the- piton-script/29522672 # 29522672. Bir işlem okuma ve diğer yazma muhtemelen size herhangi bir veri kaybetmek olmaz ama değişiklikler için test etmek için veri kullanıyorsanız –

+0

watchdog kullanmak için değil, ama kullanmak için ilginç bir araç gibi görünüyor. Daha fazla açıklama yapmak için sorumu düzenledim. – Leb

cevap

2

Scriptlerden biri dosyayı okurken diğeri dosyaya yazmaya çalışıyor. Her iki betik de dosyaya aynı anda erişemez. Padraic Cunningham gibi, yorumlarda bu sorunu çözmek için bir kilit dosyası uygulayabileceğinizi söylüyor.

here belgeleriyle birlikte lockfile adlı işlemi gerçekleştirecek bir python paketi var. İşte

uygulanan lockfile paketi ile ilk betik: Burada

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)) 

uygulanan lockfile paketi ile ikinci komut dosyası size: Ben elimden böylece 100ms bir bekleme eklendi

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) 

çıkışı konsola yavaşlatır.

Bu betikler, "data.csv" dosyasına erişmeden önce "data.lock" adlı bir dosya oluşturacak ve "data.csv" dosyasına eriştikten sonra "data.lock" dosyasını silecektir. Her iki komut dosyasında, "data.lock" varsa, komut dosyası "data.lock" dosyası artık mevcut olana kadar bekleyecektir.

+0

Bu, işe yaramaz çünkü ilk komut, sürekli olarak güncelleştirilmekte olan dosyanın simülasyonudur. Aslında sadece dosyayı okuduğum ikinci senaryoyu değiştirebilir/düzenleyebilirim – Leb

1

Simülasyon komut dosyanız, data.csv dosyasına okur ve yazar.Bir betik dosyayı sadece yazım olarak açarsa ve diğeri dosyayı salt okunur olarak açarsa, eşzamanlı olarak okuyabilir ve yazabilirsiniz. Bu düşünceyle

, aşağıdaki dosyayı yazma için simülasyon senaryoyu değiştirdi:

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) 

python'da, bir dosya açılırken 'a' aracı sadece yazma olarak ekleyin. 'A +' kullanımı okuma ve yazma erişimi ile eklenir. Dosyayı yazan kodun sadece dosyayı salt-yazma olarak açtığından ve dosyayı okuyan betiğinizin asla dosyaya yazmayı denememesi gerektiğinden emin olmalısınız. Aksi takdirde, başka bir çözümü uygulamanız gerekecektir.

Şimdi, ikinci komut dosyasını kullanarak bahsettiğiniz sorun olmadan okunabilmeniz gerekir.