python पांडास एचडीएफस्टोर को एक बड़ी मात्रा में डेटा कैसे जोड़ता है और एक प्राकृतिक अनूठी इंडेक्स मिलता है?



indexing pandas (1)

मैं बड़ी मात्रा में http लॉग (80GB +) को एक पांड्या एचडीएफस्टोर में सांख्यिकीय प्रसंस्करण के लिए आयात कर रहा हूं। यहां तक ​​कि एक एकल आयात फ़ाइल में भी मुझे सामग्री को बैच करने की आवश्यकता है क्योंकि मैं इसे लोड करता हूं। इस प्रकार अब तक मेरी रणनीति को डेटाफ्रेम में पर्सेड लाइनों को पढ़ने के लिए किया गया है, फिर डेटाफ़्रेम को एचडीएफस्टोर में संग्रहीत करें। मेरा लक्ष्य डेटास्टोर में एक कुंजी के लिए इंडेक्स कुंजी को अनूठा बनाना है, लेकिन हर डेटाफ़्रेम इसे पुनः अपना सूचकांक मान पुन: प्रारंभ कर देता है मैं 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)

आप इसे इस तरह कर सकते हैं। केवल चाल यही है कि पहली बार स्टोर तालिका मौजूद नहीं है, इसलिए 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




hdfstore