2013-06-11 8 views
8

मैं सैडल (saddle.github.io) का लेखक हूं, जो भावनाओं को पांडा में समान कार्यक्षमता प्रदान करता है (लेकिन जेवीएम पर स्कैला में)। मैं यह सुनिश्चित करने की कोशिश कर रहा हूं कि पांडा के डेटाफ्रेम का एचडीएफ 5 धारावाहिक प्रारूप सैडल के साथ अंतःक्रियाशील है। मैं वर्तमान में सैडल में स्ट्रिंग सरणी क्रमबद्धता लागू कर रहा हूं। तो मेरा सवाल यह है कि कैसे पांडा डेटाफ्रेम तारों को क्रमबद्ध करता है। अगर मैं पांडा में एक HDF5 फ़ाइल बनाने के इस प्रकार है:पांडा में एचडीएफ 5 स्ट्रिंग क्रमबद्धता विवरण?

from pandas import * 
h = HDFStore('tmp.h5') 
f = DataFrame({0: [1,2,3], 1: ["a", "b", "c"], 2: [1.5, 2.5, 3.5]}) 
h.put("f1", f) 
h.close() 

और जिसके परिणामस्वरूप tmp.h5 फ़ाइल h5dump, मुझे लगता है कि स्ट्रिंग ब्लॉक (block2_values) डेटाप्रकार H5T_VLEN के रूप में जमा है और विशेषता

ATTRIBUTE "CLASS" { 
    DATATYPE H5T_STRING { 
      STRSIZE 8; 
      STRPAD H5T_STR_NULLTERM; 
      CSET H5T_CSET_ASCII; 
      CTYPE H5T_C_S1; 
     } 
    DATASPACE SCALAR 
    DATA { 
    (0): "VLARRAY" 
    } 
} 

है यह एक ASCII चरित्र सेट पर संकेत देता है; हालांकि, एन्कोडेड देखे गए बाइट्स ASCII (यानी, "ए", "बी", "सी") के अनुरूप नहीं लगते हैं। इसके अलावा, मैं उत्सुक हूं जहां STRSIZE 8 आता है। क्या कोई स्ट्रिंग क्रमबद्धता के क्रियान्वयन विवरण पर प्रकाश डाल सकता है जो पांडा -> pytables -> hdf5 के माध्यम से होता है? (मैं पांडा/पायटेबल्स में कोड के किसी भी पॉइंटर्स से भी खुश रहूंगा जहां मैं खुद को गहराई से खोदना शुरू कर सकता हूं :)

उत्तर

6

आपने एक उदाहरण चुना है कि सतह पर बहुत सरल लगता है, लेकिन वास्तव में दृश्यों के पीछे काफी जटिल है। यह डेटा के 3 अलग-अलग ब्लॉक (प्रत्येक dtype के लिए 1), और इनमें से प्रत्येक स्टोर और अनुक्रमणिका और डेटा संग्रहीत करता है।

आपके द्वारा संग्रहीत ऑब्जेक्ट वह है जिसे मैं Storer प्रारूप कहता हूं, जिसका अर्थ है कि numpy arrays एक बार में सभी लिखे गए हैं, इसलिए एक बार लिखा गया कि वे परिवर्तनीय नहीं हैं। डॉक्स यहाँ देखें: http://pandas.pydata.org/pandas-docs/dev/io.html#hdf5-pytables

PyTables डॉक्स यहां हैं: http://pytables.github.io/usersguide/libref/declarative_classes.html#the-atom-class-and-its-descendants

ये स्ट्रिंग दुर्भाग्य से भंडारण के इस विशेष प्रारूप में एक अजगर अचार के रूप में जमा हो जाती है, तो मैं अगर तुम उन्हें पार मंच को डिकोड कर सकते हैं पता नहीं है।

आपके पास Table ऑब्जेक्ट पढ़ने का एक आसान समय होगा, जो अधिक बुनियादी प्रकारों का उपयोग करके संग्रहीत किया जाता है, जिन्हें आसानी से निर्यात किया जाता है (उदाहरण के लिए आर को निर्यात करने पर दस्तावेज़ों में एक अनुभाग है)। PyTables ptdump -avd tmp.h5 सुविधा का उपयोग

In [2]: df = DataFrame({0: [1,2,3], 1: ["a", "b", "c"], 2: [1.5, 2.5, 3.5]}) 

In [4]: h = pd.HDFStore('tmp.h5') 

In [6]: h.put('df',df, table=True) 

In [7]: h.close() 

, इस निम्नलिखित पैदावार:

इस प्रारूप को पढ़ने की कोशिश करो। यदि आप < पीईटीबल्स 3.0.0 (जो अभी बाहर आए हैं) पढ़ रहे हैं, या py3 (जिसे हम 0.11.1 में समर्थन करने जा रहे हैं) पढ़ रहे हैं। फिर स्ट्रिंग्स सभी utf-8 एन्कोडेड बाइट्स के रूप में लिखे गए हैं। (PyTables 3.0.0,) से पहले, तारों को एसीआईआई के रूप में लिखा जाता है, मुझे विश्वास है।

/ (RootGroup) '' 
    /._v_attrs (AttributeSet), 4 attributes: 
    [CLASS := 'GROUP', 
    PYTABLES_FORMAT_VERSION := '2.0', 
    TITLE := '', 
    VERSION := '1.0'] 
/df (Group) '' 
    /df._v_attrs (AttributeSet), 12 attributes: 
    [CLASS := 'GROUP', 
    TITLE := '', 
    VERSION := '1.0', 
    data_columns := [], 
    index_cols := [(0, 'index')], 
    levels := 1, 
    nan_rep := b'nan', 
    non_index_axes := b"(lp1\n(I1\n(lp2\ncnumpy.core.multiarray\nscalar\np3\n(cnumpy\ndtype\np4\n(S'i8'\nI0\nI1\ntRp5\n(I3\nS'<'\nNNNI-1\nI-1\nI0\ntbS'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\ntRp6\nag3\n(g5\nS'\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\ntRp7\nag3\n(g5\nS'\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\ntRp8\natp9\na.", 
    pandas_type := b'frame_table', 
    pandas_version := b'0.10.1', 
    table_type := b'appendable_frame', 
    values_cols := ['values_block_0', 'values_block_1', 'values_block_2']] 
/df/table (Table(3,)) '' 
    description := { 
    "index": Int64Col(shape=(), dflt=0, pos=0), 
    "values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1), 
    "values_block_1": Int64Col(shape=(1,), dflt=0, pos=2), 
    "values_block_2": StringCol(itemsize=1, shape=(1,), dflt=b'', pos=3)} 
    byteorder := 'little' 
    chunkshape := (2621,) 
    autoindex := True 
    colindexes := { 
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False} 
    /df/table._v_attrs (AttributeSet), 19 attributes: 
    [CLASS := 'TABLE', 
    FIELD_0_FILL := 0, 
    FIELD_0_NAME := 'index', 
    FIELD_1_FILL := 0.0, 
    FIELD_1_NAME := 'values_block_0', 
    FIELD_2_FILL := 0, 
    FIELD_2_NAME := 'values_block_1', 
    FIELD_3_FILL := b'', 
    FIELD_3_NAME := 'values_block_2', 
    NROWS := 3, 
    TITLE := '', 
    VERSION := '2.6', 
    index_kind := b'integer', 
    values_block_0_dtype := b'float64', 
    values_block_0_kind := b"(lp1\ncnumpy.core.multiarray\nscalar\np2\n(cnumpy\ndtype\np3\n(S'i8'\nI0\nI1\ntRp4\n(I3\nS'<'\nNNNI-1\nI-1\nI0\ntbS'\\x02\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\ntRp5\na.", 
    values_block_1_dtype := b'int64', 
    values_block_1_kind := b"(lp1\ncnumpy.core.multiarray\nscalar\np2\n(cnumpy\ndtype\np3\n(S'i8'\nI0\nI1\ntRp4\n(I3\nS'<'\nNNNI-1\nI-1\nI0\ntbS'\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\ntRp5\na.", 
    values_block_2_dtype := b'string8', 
    values_block_2_kind := b"(lp1\ncnumpy.core.multiarray\nscalar\np2\n(cnumpy\ndtype\np3\n(S'i8'\nI0\nI1\ntRp4\n(I3\nS'<'\nNNNI-1\nI-1\nI0\ntbS'\\x01\\x00\\x00\\x00\\x00\\x00\\x00\\x00'\ntRp5\na."] 
    Data dump: 
[0] (0, [1.5], [1], [b'a']) 
[1] (1, [2.5], [2], [b'b']) 
[2] (2, [3.5], [3], [b'c']) 

शायद चर्चा करने के लिए ऑफलाइन से मुझसे संपर्क करने के लिए सबसे अच्छा है।

+0

"दुर्भाग्यवश इन स्ट्रिंग को इस विशेष प्रारूप में एक अजगर अचार के रूप में संग्रहीत किया जाता है ..." क्या यह इस तरह रहेगा या यहां संदेश का उपयोग करने की योजना है। मैं पूछ रहा हूं क्योंकि मैंने उस संदेश को देखा है जिस पर आप काम कर रहे हैं। –

+0

msgpack एक स्वतंत्र धारावाहिक प्रारूप है जिसमें PyTables के साथ कुछ भी नहीं है। जो अचार मैं प्रतिबिंबित कर रहा हूं वह एक इन-लाइन तरीका है कि पीईटीबल्स परिवर्तनीय लंबाई तारों को बचाता है। – Jeff

+0

मैंने सोचा कि यह पांडा विशिष्ट था और यह नहीं पता था कि यह pytables व्यवहार है। यदि pytables संदेश का उपयोग किया जाता है तो अन्य भाषाओं के डेटा को पढ़ने के लिए यह आसान होगा लेकिन जाहिर है कि उनका लक्ष्य अजगर है। –

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