2013-06-08 8 views
12

मैं सांख्यिकीय प्रसंस्करण के लिए एक पांडस एचडीएफस्टोर में बड़ी मात्रा में http लॉग (80 जीबी +) आयात कर रहा हूं। यहां तक ​​कि एक आयात फ़ाइल के भीतर भी मुझे सामग्री को बैच करने की आवश्यकता होती है क्योंकि मैं इसे लोड करता हूं। मेरी रणनीति अब तक डेटाफ्रेम में पार्स लाइनों को पढ़ने के लिए है, फिर डेटाफ्रेम को एचडीएफस्टोर में स्टोर करें। मेरा लक्ष्य है कि डेटास्टोर में एक ही कुंजी के लिए इंडेक्स कुंजी अद्वितीय है लेकिन प्रत्येक डेटाफ्रेम फिर से अपने स्वयं के इंडेक्स वैल्यू को पुनरारंभ करता है। मैं उम्मीद कर रहा था कि HDFStore.append() में डेटाफ्रेम इंडेक्स मानों को अनदेखा करने के लिए कुछ मैकेनिज्म होगा और बस मेरे एचडीएफस्टोर कुंजी के मौजूदा इंडेक्स वैल्यू में जोड़ना जारी रखें लेकिन इसे नहीं लगता है। मैं डेटाफ्रेम कैसे आयात करूं और एचडीएफस्टोर अपने मौजूदा इंडेक्स वैल्यू को बढ़ाने के दौरान उसमें निहित इंडेक्स वैल्यू को अनदेखा कर सकता हूं? प्रत्येक 10 लाइनों के नीचे नमूना कोड नीचे बैच। स्वाभाविक रूप से असली बात बड़ी होगी।एक पांडस एचडीएफस्टोर को बड़ी मात्रा में डेटा कैसे जोड़ता है और एक प्राकृतिक अद्वितीय सूचकांक प्राप्त करता है?

if hd_file_name: 
     """ 
     HDF5 output file specified. 
     """ 

     hdf_output = pd.HDFStore(hd_file_name, complib='blosc') 
     print hdf_output 

     columns = ['source', 'ip', 'unknown', 'user', 'timestamp', 'http_verb', 'path', 'protocol', 'http_result', 
        'response_size', 'referrer', 'user_agent', 'response_time'] 

     source_name = str(log_file.name.rsplit('/')[-1]) # HDF5 Tables don't play nice with unicode so explicit str(). :(

     batch = [] 

     for count, line in enumerate(log_file,1): 
      data = parse_line(line, rejected_output = reject_output) 

      # Add our source file name to the beginning. 
      data.insert(0, source_name)  
      batch.append(data) 

      if not (count % 10): 
       df = pd.DataFrame(batch, columns = columns) 
       hdf_output.append(KEY_NAME, df) 
       batch = [] 

     if (count % 10): 
      df = pd.DataFrame(batch, columns = columns) 
      hdf_output.append(KEY_NAME, df) 
+0

क्या आपने [यह उत्तर] पढ़ा है (http://stackoverflow.com/a/14268804/1240268)? –

उत्तर

13

आप इसे ऐसा कर सकते हैं। केवल चाल यह है कि पहली बार स्टोर टेबल मौजूद नहीं है, इसलिए get_storer उठाएगा।

import pandas as pd 
import numpy as np 
import os 

files = ['test1.csv','test2.csv'] 
for f in files: 
    pd.DataFrame(np.random.randn(10,2),columns=list('AB')).to_csv(f) 

path = 'test.h5' 
if os.path.exists(path): 
    os.remove(path) 

with pd.get_store(path) as store: 
    for f in files: 
     df = pd.read_csv(f,index_col=0) 
     try: 
      nrows = store.get_storer('foo').nrows 
     except: 
      nrows = 0 

     df.index = pd.Series(df.index) + nrows 
     store.append('foo',df) 


In [10]: pd.read_hdf('test.h5','foo') 
Out[10]: 
      A   B 
0 0.772017 0.153381 
1 0.304131 0.368573 
2 0.995465 0.799655 
3 -0.326959 0.923280 
4 -0.808376 0.449645 
5 -1.336166 0.236968 
6 -0.593523 -0.359080 
7 -0.098482 0.037183 
8 0.315627 -1.027162 
9 -1.084545 -1.922288 
10 0.412407 -0.270916 
11 1.835381 -0.737411 
12 -0.607571 0.507790 
13 0.043509 -0.294086 
14 -0.465210 0.880798 
15 1.181344 0.354411 
16 0.501892 -0.358361 
17 0.633256 0.419397 
18 0.932354 -0.603932 
19 -0.341135 2.453220 

आप वास्तव में जरूरी एक वैश्विक अद्वितीय सूचकांक, (जब तक आप एक चाहते हैं) HDFStore के रूप में (PyTables के माध्यम से) की जरूरत नहीं है विशिष्ट नंबर पंक्तियों से एक प्रदान करता है। आप हमेशा इन चयन पैरामीटर जोड़ सकते हैं।

In [11]: pd.read_hdf('test.h5','foo',start=12,stop=15) 
Out[11]: 
      A   B 
12 -0.607571 0.507790 
13 0.043509 -0.294086 
14 -0.465210 0.880798 
+0

ग्रेट पोस्ट; ऐसे मामले हैं (जैसे) जहां यह इस कामकाज के बजाए एक ऑटोइनक्रमेंटल इंडेक्स होना आदर्श होगा। जैसा कि: जब आप hdf5 में सहेजते हैं, तो आपके पास एक ignore_index = True (जैसे pd.Concat) हो सकता है और यह स्वचालित रूप से हुड के नीचे होता है? बस एक विचार – Carst

+0

इसके अलावा: बड़ी मात्रा में छोटी फ़ाइलों का उपयोग करते समय, प्रत्येक एपेंड एक्शन के अंत में वर्तमान डेटाफ्रेम की लंबाई के साथ प्रत्येक बार पंक्तियों की वर्तमान संख्या और ऊपर उतारना बेहतर होगा (प्रदर्शन के लिए बेहतर)। यदि यह एक अस्पष्ट टिप्पणी है, तो मुझे बताएं और मैं इसे कहीं भी – Carst

+0

पर काम करूँगा, आपको वास्तव में इनमें से कोई भी करने की आवश्यकता नहीं है। क्योंकि स्टोर आंतरिक रूप से 'क्रमांकित' होते हैं, फिर आप पंक्ति संख्या द्वारा चयन कर सकते हैं, यदि आप चाहते हैं, (यहां देखें) [http://pandas.pydata.org/pandas-docs/dev/io.html#advanced-queries] – Jeff

संबंधित मुद्दे