पांडा read_xml () विधि परीक्षण रणनीतियाँ

| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |

वर्तमान में, pandas I/O टूल एक < का रखरखाव नहीं करता है कोड>read_xml() विधि और समकक्ष to_xml()। हालांकि, read_json साबित करता है कि डेटाफ़्रेम आयात के लिए पेड़ जैसी संरचनाएँ लागू की जा सकती हैं और मार्कअप प्रारूपों के लिए read_html

यदि पांडा टीम भविष्य के पांडा संस्करण के लिए ऐसी read_xml विधि पर विचार करती है, तो वे क्या कार्यान्वयन करेंगे पीछा: अंतर्निहित xml.etree.ElementTree के साथ इसके iterfind() या iterparse() फ़ंक्शन या तृतीय-पक्ष मॉड्यूल के साथ पार्स करना, अपने XPath 1.0 और XSLT 1.0 विधियों के साथ lxml?

एक सरल, सपाट, तत्व-केंद्रित XML इनपुट पर चार प्रकार की विधियों के लिए मेरे परीक्षण रन नीचे दिए गए हैं। सभी रूट के किसी भी दूसरे स्तर के बच्चों के लिए सामान्यीकृत पार्सिंग के लिए स्थापित किए गए हैं और प्रत्येक विधि को सटीक समान पांडा डेटाफ्रेम प्राप्त करना चाहिए। शब्दकोशों की सूची में अंतिम कॉल के अलावा सभी pd.Dataframe() हैं। XSLT पद्धति pd.read_csv() में कास्ट किए गए StringIO() के लिए XML को CSV में बदल देती है।

प्रश्न (मल्टी-पार्ट)

  • प्रदर्शन: आप धीमी iterparse की व्याख्या कैसे करते हैं, जिसे अक्सर बड़ी फ़ाइलों के लिए अनुशंसित किया जाता है क्योंकि फ़ाइल को पुनरावृत्त रूप से पार्स किया जाता है? क्या यह आंशिक रूप से if तर्क जांच के कारण है?

  • मेमोरी: क्या CPU मेमोरी I/O कॉल में समय के साथ सहसंबंधित है? XSLT और XPath 1.0 बड़े XML दस्तावेज़ों के साथ अच्छी तरह से स्केल नहीं करते हैं क्योंकि पूरी फ़ाइल को पार्स करने के लिए मेमोरी में पढ़ा जाना चाहिए।

  • STRATEGY: क्या शब्दकोशों की सूची < के लिए एक इष्टतम रणनीति है? कोड>डेटाफ्रेम () कॉल? ये दिलचस्प जवाब देखें: जनरेटर संस्करण और एक iterwalk user-defined संस्करण . डेटाफ़्रेम के लिए दोनों अपकास्ट सूचियाँ।

इनपुट डेटा (स्टैक ओवरफ़्लो" का वर्तमान वर्ष के अनुसार शीर्ष उपयोगकर्ता जिनमें से हमारे पांडा मित्र शामिल हैं)

<? xml संस्करण = "1.0" एन्कोडिंग = "utf-8"?> <stackoverflow.com//उपयोगकर्ता /1144035/गॉर्डन-लिनॉफ़</लिंक> <स्थान>न्यूयॉर्क, संयुक्त राज्य</स्थान> <year_rep>5,985</year_rep> <total_rep>499,408</total <rep>/total <rep> टैग1> <tag2>sql-server</tag2> <tag3>mysql</tag3> </topusers> <topusers> <user>G√ºnter Z√∂chbauer<लिंक> http://www.stackoverflow.com//users/217408/g%c3%bcnter-z%c3%b6chbauer</link> <स्थान>लिंज़, ऑस्ट्रिया</स्थान> <year_rep>5,835</year_rep> ; <total_rep>154,4 39</total_rep> <tag1>angular2</tag1> <tag2>टाइपस्क्रिप्ट</tag2> <tag3>जावास्क्रिप्ट</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>जेज़रेल</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/2901002/jezrael</link> <स्थान>ब्रातिस्लावा, स्लोवाकिया</स्थान> <year_rep>5,740</year_rep> <total_rep>83,237</total_rep> <tag1>पांडा</tag1> <tag2>पायथन</tag2> <tag3>डेटाफ्रेम</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>VonC</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/6309/vonc</link> <स्थान>फ़्रांस</स्थान> <year_rep>5,577</year_rep> <total_rep>651,397</total_rep> <tag1>git</tag1> <tag2>github</tag2> <tag3>docker</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>मार्टिजन पीटर्स</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/100297/martijn-pieters</link> <स्थान>कैम्ब्रिज, यूनाइटेड किंगडम</स्थान> <year_rep>5,337</year_rep> <total_rep>525,176</total_rep> <tag1>पायथन</tag1> <tag2>python-3.x</tag2> <tag3>पायथन-2.7</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>टीजे क्राउडर</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/157247/tj-crowder</link> <स्थान>यूनाइटेड किंगडम</स्थान> <year_rep>5,258</year_rep> <total_rep>508,310</total_rep> <tag1>जावास्क्रिप्ट</tag1> <tag2>jquery</tag2> <tag3>java</tag3> </topusers> <टोपसर्स> <user>akrun</user> <लिंक>http://www.stackoverflow.com//users/3732271/akrun</link> <स्थान></स्थान> <year_rep>5,188</year_rep> <total_rep>229,553</total_rep> <tag1>r</tag1> <tag2>dplyr</tag2> <tag3>डेटाफ्रेम</tag3> </topusers> <टोपसर्स> <user>Wiktor Stribi?ew</user> <लिंक>http://www.stackoverflow.com//users/3832970/wiktor-stribi%c5%bcew</link> <स्थान>वारसॉ, पोलैंड</स्थान> <year_rep>4,948</year_rep> <total_rep>158,134</total_rep> <tag1>regex</tag1> <tag2>जावास्क्रिप्ट</tag2> <tag3>c#</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>डारिन दिमित्रोव</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/29407/darin-dimitrov</link> <स्थान>सोफिया, बुल्गारिया</स्थान> <year_rep>4,936</year_rep> <total_rep>709,683</total_rep> <tag1>c#</tag1> <tag2>asp.net-mvc</tag2> <tag3>asp.net-mvc-3</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>एरिक डुमिनिल</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/6419007/eric-duminil</link> <स्थान></स्थान> <year_rep>4,854</year_rep> <total_rep>12,557</total_rep> <tag1>रूबी</tag1> <tag2>रूबी-ऑन-रेल</tag2> <tag3>सरणी</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>alecxe</user> <लिंक>http://www.stackoverflow.com//users/771848/alecxe</link> <स्थान>न्यूयॉर्क, संयुक्त राज्य</स्थान> <year_rep>4,723</year_rep> <total_rep>233,368</total_rep> <tag1>पायथन</tag1> <tag2>सेलेनियम</tag2> <tag3>चाचा</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>जीन-फ्रांस्वा फैब्रे</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/6451573/jean-fran%c3%a7ois-fabre</link> <स्थान>टूलूज़, फ़्रांस</स्थान> <year_rep>4,526</year_rep> <total_rep>30,027</total_rep> <tag1>पायथन</tag1> <tag2>python-3.x</tag2> <tag3>पायथन-2.7</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>piRSquared</user> <लिंक>http://www.stackoverflow.com//users/2336654/pirsquared</link> <स्थान>बेलेव्यू, डब्ल्यूए, संयुक्त राज्य</स्थान> <year_rep>4,482</year_rep> <total_rep>41,183</total_rep> <tag1>पांडा</tag1> <tag2>पायथन</tag2> <tag3>डेटाफ्रेम</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>कॉमन्सवेयर</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/115145/commonsware</link> <स्थान>कौन जानना चाहता है?</स्थान> <year_rep>4,475</year_rep> <total_rep>616,135</total_rep> <tag1>android</tag1> <tag2>java</tag2> <tag3>एंड्रॉइड-इरादे</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>क्वेंटिन</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/19068/quentin</link> <स्थान>यूनाइटेड किंगडम</स्थान> <year_rep>4,464</year_rep> <total_rep>509,365</total_rep> <tag1>जावास्क्रिप्ट</tag1> <tag2>html</tag2> <tag3>css</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>जॉन स्कीट</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/22656/jon-skeet</link> <स्थान>पठन, यूनाइटेड किंगडम</स्थान> <year_rep>4,348</year_rep> <total_rep>921,690</total_rep> <tag1>c#</tag1> <tag2>java</tag2> <tag3>.net</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>फेलिक्स क्लिंग</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/218196/felix-kling</link> <स्थान>सनीवेल, सीए</स्थान> <year_rep>4,324</year_rep> <total_rep>411,535</total_rep> <tag1>जावास्क्रिप्ट</tag1> <tag2>jquery</tag2> <tag3>एसिंक्रोनस</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>मैट</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/341994/matt</link> <स्थान></स्थान> <year_rep>4,313</year_rep> <total_rep>220,515</total_rep> <tag1>स्विफ्ट</tag1> <tag2>ios</tag2> <tag3>xcode</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>Psidom</user> <लिंक>http://www.stackoverflow.com//users/4983450/psidom</link> <स्थान>अटलांटा, जीए, संयुक्त राज्य</स्थान> <year_rep>4,236</year_rep> <total_rep>36,950</total_rep> <tag1>पायथन</tag1> <tag2>पांडा</tag2> <tag3>r</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>मार्टिन आर</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/1187415/martin-r</link> <स्थान>जर्मनी</स्थान> <year_rep>4,195</year_rep> <total_rep>269,380</total_rep> <tag1>स्विफ्ट</tag1> <tag2>ios</tag2> <tag3>swift3</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>बाड़मार</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/1491895/barmar</link> <स्थान>आर्लिंगटन, एमए</स्थान> <year_rep>4,179</year_rep> <total_rep>289,989</total_rep> <tag1>जावास्क्रिप्ट</tag1> <tag2>php</tag2> <tag3>jquery</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>एलेक्सी मेजेनिन</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/1227923/alexey-mezenin</link> <स्थान>??????</स्थान> <year_rep>4,142</year_rep> <total_rep>31,602</total_rep> <tag1>laravel</tag1> <tag2>php</tag2> <tag3>laravel-5.3</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>बलुसC</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/157882/balusc</link> <स्थान>एम्स्टर्डम, नीदरलैंड</स्थान> <year_rep>4,046</year_rep> <total_rep>703,046</total_rep> <tag1>java</tag1> <tag2>jsf</tag2> <tag3>सर्वलेट</tag3> </topusers> <टोपसर्स> <user>GurV</user> <लिंक>http://www.stackoverflow.com//users/6348498/gurv</link> <स्थान></स्थान> <year_rep>4,016</year_rep> <total_rep>7,932</total_rep> <tag1>sql</tag1> <tag2>mysql</tag2> <tag3>sql-server</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>नीना स्कोल्ज़</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/1447675/nina-scholz</link> <स्थान>बर्लिन, Deutschland</location> <year_rep>3,950</year_rep> <total_rep>61,135</total_rep> <tag1>जावास्क्रिप्ट</tag1> <tag2>सरणी</tag2> <tag3>ऑब्जेक्ट</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>जेबी निजेट</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/571407/jb-nizet</link> <स्थान>सेंट-एटिने, फ़्रांस</स्थान> <year_rep>3,923</year_rep> <total_rep>418,780</total_rep> <tag1>java</tag1> <tag2>हाइबरनेट</tag2> <tag3>java-8</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>फ्रैंक वैन पफेलन</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/209103/frank-van-puffelen</link> <स्थान>सैन फ्रांसिस्को, सीए</स्थान> <year_rep>3,920</year_rep> <total_rep>86,520</total_rep> <tag1>firebase</tag1> <tag2>firebase-डेटाबेस</tag2> <tag3>android</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>dasblinkenlight</user> <लिंक>http://www.stackoverflow.com//users/335858/dasblinkenlight</link> <स्थान>संयुक्त राज्य</स्थान> <year_rep>3,886</year_rep> <total_rep>475,813</total_rep> <tag1>c#</tag1> <tag2>java</tag2> <tag3>c++</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>टिम बेगेलेसेन</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/1863229/tim-biegeleisen</link> <स्थान>सिंगापुर</स्थान> <year_rep>3,814</year_rep> <total_rep>77,211</total_rep> <tag1>sql</tag1> <tag2>mysql</tag2> <tag3>java</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>ग्रेग हेगिल</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/893/greg-hewgill</link> <स्थान>क्राइस्टचर्च, न्यूजीलैंड</स्थान> <year_rep>3,796</year_rep> <total_rep>529,137</total_rep> <tag1>git</tag1> <tag2>पायथन</tag2> <tag3>git-pull</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>unutbu</user> <लिंक>http://www.stackoverflow.com//users/190597/unutbu</link> <स्थान></स्थान> <year_rep>3,735</year_rep> <total_rep>401,595</total_rep> <tag1>पायथन</tag1> <tag2>पांडा</tag2> <tag3>numpy</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>हंस पासेंट</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/17034/hans-passant</link> <स्थान>मैडिसन, डब्ल्यूआई</स्थान> <year_rep>3,688</year_rep> <total_rep>672,118</total_rep> <tag1>c#</tag1> <tag2>.net</tag2> <tag3>winforms</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>जोनाथन लेफ़लर</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/15168/jonathan-leffler</link> <स्थान>कैलिफ़ोर्निया, यूएसए</स्थान> <year_rep>3,649</year_rep> <total_rep>455,157</total_rep> <tag1>c</tag1> <tag2>bash</tag2> <tag3>unix</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>पैक्सडियाब्लो</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/14860/paxdiablo</link> <स्थान></स्थान> <year_rep>3,636</year_rep> <total_rep>507,043</total_rep> <tag1>c</tag1> <tag2>c++</tag2> <tag3>bash</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>प्रणव सी बालन</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/3037257/pranav-c-balan</link> <स्थान>रामंथली, कन्नूर, केरल, भारत</स्थान> <year_rep>3,604</year_rep> <total_rep>64,476</total_rep> <tag1>जावास्क्रिप्ट</tag1> <tag2>jquery</tag2> <tag3>html</tag3> </topusers> <टोपसर्स> <उपयोगकर्ता>सुरगच</उपयोगकर्ता> <लिंक>http://www.stackoverflow.com//users/3681880/suragch</link> <स्थान>होहोट, चीन</स्थान> <year_rep>3,580</year_rep> <total_rep>71,032</total_rep> <tag1>स्विफ्ट</tag1> <tag2>ios</tag2> <tag3>android</tag3> </topusers> </स्टैकओवरफ्लो> 

पायथन तरीके

आयात xml.etree.ElementTree के रूप में और io से पीडी के रूप में आयात पांडा lxml आयात etree से StringIO आयात करें जैसा कि lxet def read_xml_iterfind(): tree = et.parse("Input.xml") data = [] inner = {} for el in tree.iterfind(./*"): for i in el.iterfind("* "): आंतरिक [i.tag] = i.text data.append (आंतरिक) आंतरिक = {} df = pd.DataFrame (डेटा) def read_xml_iterparse (): डेटा = [] आंतरिक = {} i = 1 के लिए (ev) , el) et.iterparse(path) में: अगर i <= 2: first_tag = el.tag if el.tag == first_tag और len(inner) != 0: data.append(inner) inner = {} if el.text कोई नहीं है और len(el.text.strip()) > 0: आंतरिक [el.tag] = el.text i += 1 df = pd.DataFrame(data) def read_xml_lxml_xpath(): tree = lxet.parse("Input.xml") डेटा = [] आंतरिक = {} के लिए el in tree.xpath("/*/*"): for i in el: inner[i.tag] = i.text data.append(inner) inner = {} df = pd.DataFrame(data) def read_xml_lxml_xsl( ): एक्सएमएल = lxet.parse ("इनपुट। एक्सएमएल") xslstr = """ <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output version="1.0" एन्कोडिंग= "UTF-8" इंडेंट = "हां" विधि = "टेक्स्ट"/> <xsl:strip-space element="*"/> <!-- HEADERS --> <xsl:template match = "/*"> <xsl:for-each select="*[1]/*"> <xsl:value-of select="local-name()" /> <xsl:choose> <xsl:when test="position() != last()"> <xsl:text>,</xsl:text> </xsl:when> <xsl:अन्यथा> <xsl: टेक्स्ट>&#xa;</xsl:text> </xsl:अन्यथा> </xsl:choose> </xsl:for-प्रत्येक> <xsl:apply-templates/> </ xsl:टेम्पलेट> <!-- डेटा पंक्तियाँ (कॉमा-सेपरेटेड) --> <xsl:template match="/*/*" प्राथमिकता = "2"> <xsl:for-प्रत्येक select=" *"> <xsl:if test="position() = 1"> <xsl:text>&quot;</xsl:text> </xsl:if> <xsl:value- का चयन करें = "।" /> <xsl:चुनें> <xsl: जब परीक्षण = "स्थिति ()! = अंतिम ()"> <xsl:text>&quot;,& quot;</xsl:text> </xsl:कब> <xsl:अन्यथा> <xsl:text>&quot;&#xa;</xsl:text> </xsl:अन्यथा> </xsl:चुनें> </xsl: प्रत्येक के लिए> </xsl:टेम्पलेट> </xsl: रूपांतरित करें> """ xsl = lxet.fromstring(xslstr) ट्रांसफ़ॉर्म = lxet.XSLT (xsl) newdom = ट्रांसफ़ॉर्म (xml) df = pd.read_csv (StringIO (str (newdom))) 

समय (वर्तमान XML और XML के साथ 25 गुना बच्चे (यानी, 900 StackOverflow उपयोगकर्ता रिकॉर्ड)

# SHORTER FILE python -mtimeit -s"परीक्षण के रूप में readxml_test_runs आयात करें" "test.read_xml_iterfind ()" 100 लूप, सर्वश्रेष्ठ 3:3.87 मिसे प्रति लूप अजगर -mtimeit -s"आयात readxml_test_runs परीक्षण के रूप में" "test.read_xml_iterparse ()" 100 लूप, सर्वश्रेष्ठ 3 : 5.5 मिसे प्रति लूप अजगर -mtimeit -s"परीक्षण के रूप में readxml_test_runs आयात करें" "test.read_xml_lxml_xpath ()" 100 लूप, सर्वोत्तम 3:3.86 मिसे प्रति लूप अजगर -mtimeit -s"आयात readxml_test_runs परीक्षण के रूप में" "test.read_xml_lxml_xsl( )" 100 लूप, सर्वश्रेष्ठ 3:5.68 मिसे प्रति लूप # बड़ी फ़ाइल अजगर -mtimeit -n"100" -s"आयात readxml_test_runs परीक्षण के रूप में" "test.read_xml_iterfind ()" 100 लूप, सर्वोत्तम 3:36 मिसेक प्रति लूप अजगर -mtimeit -n"100" -s"परीक्षण के रूप में readxml_test_runs आयात करें" "test.read_xml_i terparse ()" 100 लूप, सर्वश्रेष्ठ 3: 78.9 मिसे प्रति लूप अजगर -mtimeit -n"100" -s"आयात readxml_test_runs as test" "test.read_xml_lxml_xpath()" 100 लूप, सर्वश्रेष्ठ 3:32.7 मिसे प्रति लूप अजगर -mtimeit -n"100" -s"import readxml_test_runs as test" "test.read_xml_lxml_xsl()" 100 लूप, सर्वश्रेष्ठ 3:51.4 मिसे प्रति लूप