Pandas read_xml() yöntemi test stratejileri

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

Şu anda, pandas I/O araçları, read_xml() yöntemi ve karşılığı to_xml(). Ancak, read_json veri çerçevesi içe aktarma için ağaç benzeri yapıların uygulanabileceğini kanıtlar ve İşaretleme biçimleri için read_html.

Eğer pandalar ekibi gelecekteki bir panda sürümü için böyle bir read_xml yöntemini düşünürse, hangi uygulamayı yaparlar? takip: yerleşik xml.etree.ElementTree ile iterfind() veya iterparse() işlevleriyle veya üçüncü taraf modülüyle ayrıştırma, XPath 1.0 ve XSLT 1.0 yöntemleriyle lxml?

Aşağıda basit, düz, öğe merkezli bir XML girişinde dört yöntem türü için test çalıştırmalarım yer almaktadır. Hepsi, kökün herhangi bir ikinci düzey çocukları için genelleştirilmiş ayrıştırma için ayarlanmıştır ve her yöntem, tam olarak aynı pandalar veri çerçevesini vermelidir. Sözlükler listesindeki son çağrılar hariç tümü pd.Dataframe(). XSLT yöntemi, pd.read_csv() içinde yayınlanmış StringIO() için XML'i CSV'ye dönüştürür.

Soru (multi-part)

  • PERFORMANS: Dosya yinelemeli olarak ayrıştırıldığından genellikle daha büyük dosyalar için önerilen daha yavaş iterparse'ı nasıl açıklarsınız? Kısmen if mantık kontrollerinden mi kaynaklanıyor?

  • BELLEK: CPU belleği, G/Ç çağrılarındaki zamanlamalarla ilişkili mi? XSLT ve XPath 1.0, çözümlenmesi için tüm dosyanın bellekte okunması gerektiğinden, daha büyük XML belgeleriyle iyi ölçeklenmeme eğilimindedir.

  • STRATEJİ: Sözlük listesi Dataframe() çağrısı? Şu ilginç yanıtlara bakın: generator sürümü ve iterwalk kullanıcı tanımlı sürüm . Her iki liste de veri çerçevesine yükseltilir.

Giriş Veri (Yığın Taşması"nın mevcut panda arkadaşlarımızın dahil olduğu yıllara göre en iyi kullanıcılar )

<? xml version="1.0" encoding="utf-8"?> <stackoverflow> <topusers> <user>Gordon Linoff</user> <link>http://www.stackoverflow.com//users /1144035/gordon-linoff</link> <location>New York, Amerika Birleşik Devletleri</location> <year_rep>5,985</year_rep> <total_rep>499,408</total_rep>gt <tag1 tag1> <tag2>sql-server</tag2> <tag3>mysql</tag3> </topusers> <topusers> <user>G√ºnter Z√chbauer</user> <link> http://www.stackoverflow.com//users/217408/g%c3%bcnter-z%c3%b6chbauer</link> <location>Linz, Avusturya</location> <year_rep>5.835</year_rep> ; <toplam_rep>154,4 39</total_rep> <tag1>angular2</tag1> <tag2>typescript</tag2> <tag3>javascript</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>jezrael</user> <link>http://www.stackoverflow.com//users/2901002/jezrael</link> <location>Bratislava, Slovakya</location> <year_rep>5.740</year_rep> <total_rep>83,237</total_rep> <tag1>pandalar</tag1> <tag2>python</tag2> <tag3>veri çerçevesi</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>VonC</user> <link>http://www.stackoverflow.com//users/6309/vonc</link> <konum>Fransa</konum> <year_rep>5.577</year_rep> <total_rep>651,397</total_rep> <tag1>git</tag1> <tag2>github</tag2> <tag3>docker</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Martijn Pieters</user> <link>http://www.stackoverflow.com//users/100297/martijn-pieters</link> <konum>Cambridge, Birleşik Krallık</location> <year_rep>5,337</year_rep> <total_rep>525,176</total_rep> <tag1>python</tag1> <tag2>python-3.x</tag2> <tag3>python-2.7</tag3> </üst kullanıcılar> <üst kullanıcılar> <kullanıcı>TJ Kalabalık</user> <link>http://www.stackoverflow.com//users/157247/tj-crowder</link> <konum>Birleşik Krallık</konum> <year_rep>5,258</year_rep> <total_rep>508.310</total_rep> <tag1>javascript</tag1> <tag2>jquery</tag2> <tag3>java</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>akrun</user> <link>http://www.stackoverflow.com//users/3732271/akrun</link> <konum></konum> <year_rep>5.188</year_rep> <total_rep>229.553</total_rep> <tag1>r</tag1> <tag2>dplyr</tag2> <tag3>veri çerçevesi</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Wiktor Strib?ew</user> <link>http://www.stackoverflow.com//users/3832970/wiktor-stribi%c5%bcew</link> <location>Varşova, Polonya</location> <year_rep>4.948</year_rep> <total_rep>158,134</total_rep> <tag1>normal ifade</tag1> <tag2>javascript</tag2> <tag3>c#</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Darin Dimitrov</user> <link>http://www.stackoverflow.com//users/29407/darin-dimitrov</link> <location>Sofya, Bulgaristan</location> <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> </üst kullanıcılar> <üst kullanıcılar> <user>Eric Duminil</user> <link>http://www.stackoverflow.com//users/6419007/eric-duminil</link> <konum></konum> <year_rep>4.854</year_rep> <total_rep>12.557</total_rep> <tag1>yakut</tag1> <tag2>ruby-on-rails</tag2> <tag3>diziler</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>alecxe</user> <link>http://www.stackoverflow.com//users/771848/alecxe</link> <konum>New York, Amerika Birleşik Devletleri</konum> <year_rep>4.723</year_rep> <total_rep>233.368</total_rep> <tag1>python</tag1> <tag2>selenyum</tag2> <tag3>iletki</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Jean-Fran√ßois Fabre</user> <link>http://www.stackoverflow.com//users/6451573/jean-fran%c3%a7ois-fabre</link> <location>Toulouse, Fransa</location> <year_rep>4,526</year_rep> <total_rep>30,027</total_rep> <tag1>python</tag1> <tag2>python-3.x</tag2> <tag3>python-2.7</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>piRSquared</user> <link>http://www.stackoverflow.com//users/2336654/pirsquared</link> <location>Bellevue, WA, Amerika Birleşik Devletleri</location> <year_rep>4.482</year_rep> <total_rep>41,183</total_rep> <tag1>pandalar</tag1> <tag2>python</tag2> <tag3>veri çerçevesi</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>CommonsWare</user> <link>http://www.stackoverflow.com//users/115145/commonsware</link> <konum>Kim Bilmek İster?</konum> <year_rep>4.475</year_rep> <total_rep>616,135</total_rep> <tag1>android</tag1> <tag2>java</tag2> <tag3>android amaçlı</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Quentin</user> <link>http://www.stackoverflow.com//users/19068/quentin</link> <konum>Birleşik Krallık</konum> <year_rep>4,464</year_rep> <total_rep>509,365</total_rep> <tag1>javascript</tag1> <tag2>html</tag2> <tag3>css</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Jon Skeet</user> <link>http://www.stackoverflow.com//users/22656/jon-skeet</link> <location>Reading, Birleşik Krallık</location> <year_rep>4.348</year_rep> <total_rep>921.690</total_rep> <tag1>c#</tag1> <tag2>java</tag2> <tag3>.net</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Felix Kling</user> <link>http://www.stackoverflow.com//users/218196/felix-kling</link> <konum>Sunnyvale, CA</konum> <year_rep>4.324</year_rep> <total_rep>411.535</total_rep> <tag1>javascript</tag1> <tag2>jquery</tag2> <tag3>eşzamansız</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>matt</user> <link>http://www.stackoverflow.com//users/341994/matt</link> <konum></konum> <year_rep>4.313</year_rep> <total_rep>220.515</total_rep> <tag1>hızlı</tag1> <tag2>ios</tag2> <tag3>xcode</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Psidom</user> <link>http://www.stackoverflow.com//users/4983450/psidom</link> <location>Atlanta, GA, Amerika Birleşik Devletleri</location> <year_rep>4.236</year_rep> <total_rep>36,950</total_rep> <tag1>python</tag1> <tag2>pandalar</tag2> <tag3>r</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Martin R</user> <link>http://www.stackoverflow.com//users/1187415/martin-r</link> <konum>Almanya</konum> <year_rep>4,195</year_rep> <total_rep>269,380</total_rep> <tag1>hızlı</tag1> <tag2>ios</tag2> <tag3>swift3</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Barmar</user> <link>http://www.stackoverflow.com//users/1491895/barmar</link> <konum>Arlington, MA</konum> <year_rep>4,179</year_rep> <total_rep>289,989</total_rep> <tag1>javascript</tag1> <tag2>php</tag2> <tag3>jquery</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Alexey Mezenin</user> <link>http://www.stackoverflow.com//users/1227923/alexey-mezenin</link> <konum>??????</konum> <year_rep>4,142</year_rep> <total_rep>31,602</total_rep> <tag1>laravel</tag1> <tag2>php</tag2> <tag3>laravel-5.3</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>BalusC</user> <link>http://www.stackoverflow.com//users/157882/balusc</link> <location>Amsterdam, Hollanda</location> <year_rep>4,046</year_rep> <total_rep>703,046</total_rep> <tag1>java</tag1> <tag2>jsf</tag2> <tag3>servletler</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>GurV</user> <link>http://www.stackoverflow.com//users/6348498/gurv</link> <konum></konum> <year_rep>4,016</year_rep> <total_rep>7,932</total_rep> <tag1>sql</tag1> <tag2>mysql</tag2> <tag3>sql-sunucusu</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Nina Scholz</user> <link>http://www.stackoverflow.com//users/1447675/nina-scholz</link> <location>Berlin, Deutschland</location> <year_rep>3,950</year_rep> <total_rep>61,135</total_rep> <tag1>javascript</tag1> <tag2>diziler</tag2> <tag3>nesne</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>JB Nizet</user> <link>http://www.stackoverflow.com//users/571407/jb-nizet</link> <location>Saint-Etienne, Fransa</location> <year_rep>3.923</year_rep> <total_rep>418,780</total_rep> <tag1>java</tag1> <tag2>hazırda bekletme</tag2> <tag3>java-8</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Frank van Puffelen</user> <link>http://www.stackoverflow.com//users/209103/frank-van-puffelen</link> <konum>San Francisco, CA</konum> <year_rep>3.920</year_rep> <total_rep>86,520</total_rep> <tag1>firebase</tag1> <tag2>firebase-database</tag2> <tag3>android</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>dasblinkenlight</user> <link>http://www.stackoverflow.com//users/335858/dasblinkenlight</link> <yer>Amerika Birleşik Devletleri</konum> <year_rep>3.886</year_rep> <total_rep>475,813</total_rep> <tag1>c#</tag1> <tag2>java</tag2> <tag3>c++</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Tim Biegeleisen</user> <link>http://www.stackoverflow.com//users/1863229/tim-biegeleisen</link> <location>Singapur</location> <year_rep>3.814</year_rep> <total_rep>77,211</total_rep> <tag1>sql</tag1> <tag2>mysql</tag2> <tag3>java</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Greg Hewgill</user> <link>http://www.stackoverflow.com//users/893/greg-hewgill</link> <location>Christchurch, Yeni Zelanda</location> <year_rep>3.796</year_rep> <total_rep>529,137</total_rep> <tag1>git</tag1> <tag2>python</tag2> <tag3>git-pull</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>unutbu</user> <link>http://www.stackoverflow.com//users/190597/unutbu</link> <konum></konum> <year_rep>3.735</year_rep> <total_rep>401,595</total_rep> <tag1>python</tag1> <tag2>pandalar</tag2> <tag3>numpy</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Hans Passant</user> <link>http://www.stackoverflow.com//users/17034/hans-passant</link> <konum>Madison, WI</location> <year_rep>3.688</year_rep> <total_rep>672,118</total_rep> <tag1>c#</tag1> <tag2>.net</tag2> <tag3>winforms</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Jonathan Leffler</user> <link>http://www.stackoverflow.com//users/15168/jonathan-leffler</link> <location>California, ABD</location> <year_rep>3.649</year_rep> <total_rep>455,157</total_rep> <tag1>c</tag1> <tag2>bash</tag2> <tag3>unix</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>paxdiablo</user> <link>http://www.stackoverflow.com//users/14860/paxdiablo</link> <konum></konum> <year_rep>3.636</year_rep> <total_rep>507,043</total_rep> <tag1>c</tag1> <tag2>c++</tag2> <tag3>bash</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Pranav C Balan</user> <link>http://www.stackoverflow.com//users/3037257/pranav-c-balan</link> <location>Ramanthali, Kannur, Kerala, Hindistan</location> <year_rep>3.604</year_rep> <total_rep>64,476</total_rep> <tag1>javascript</tag1> <tag2>jquery</tag2> <tag3>html</tag3> </üst kullanıcılar> <üst kullanıcılar> <user>Suragch</user> <link>http://www.stackoverflow.com//users/3681880/suragch</link> <konum>Hohhot, Çin</konum> <year_rep>3,580</year_rep> <total_rep>71,032</total_rep> <tag1>hızlı</tag1> <tag2>ios</tag2> <tag3>android</tag3> </üst kullanıcılar> </stackoverflow> 

Python Yöntemler

xml.etree.ElementTree as et al pandaları pd olarak al io'dan import StringIO from lxml import etree as lxet def read_xml_iterfind(): tree = et.parse("Input.xml") data = [] inner = {} el in tree.iterfind("./*"): for i in el.iterfind("* "): inner[i.tag] = i.text data.append(inner) inner = {} df = pd.DataFrame(data) def read_xml_iterparse(): data = [] inner = {} i = 1 for (ev , el) et.iterparse(path): if i <= 2: first_tag = el.tag if el.tag == first_tag ve len(inner) != 0: data.append(inner) inner = {} if el.text Yok değildir ve len(el.text.strip()) > 0: inner[el.tag] = el.text i += 1 df = pd.DataFrame(data) def read_xml_lxml_xpath(): ağaç = lxet.parse("Input.xml") data = [] inner = {} için el in tree.xpath("/*/*"): for i in el: inner[i.tag] = i.text data.append(inner) inner = {} df = pd.DataFrame(veri) def read_xml_lxml_xsl( ): xml = lxet.parse("Giriş.xml") xslstr = """ <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output version="1.0" encoding= "UTF-8" indent="yes" method="text"/> <xsl:strip-space element="*"/> <!-- HEADERS --> <xsl:template match = "/*"> <xsl:for-each select="*[1]/*"> <xsl:value-of select="local-name()" /> <xsl:choose> <xsl:while test="position() != last()"> <xsl:text>,</xsl:text> </xsl:what> <xsl:başka türlü> <xsl: text>&#xa;</xsl:text> </xsl:aksi takdirde> </xsl:choose> </xsl:for-each> <xsl:apply-templates/> </ xsl:template> <!-- VERİ SATIRLARI (VİRGÜL AYRILMIŞ) --> <xsl:template match="/*/*" öncelik="2"> <xsl:for-each select=" *"> <xsl:if test="position() = 1"> <xsl:text>&quot;</xsl:text> </xsl:if> <xsl:value- of select="." /> <xsl:choose> <xsl:When test="position() != last()"> <xsl:text>&quot;,& quot;</xsl:metin> </xsl:ne zaman> <xsl:aksi halde> <xsl:text>&quot;&#xa;</xsl:text> </xsl:aksi halde> </xsl:seç> </xsl:her biri için> </xsl:şablon> </xsl:dönüştür> """ xsl = lxet.fromstring(xslstr) transform = lxet.XSLT(xsl) newdom = transform(xml) df = pd.read_csv(StringIO(str(newdom))) 

Zamanlamalar (mevcut XML ve XML ile 25 katı alt öğeyle (yani, 900 StackOverflow kullanıcı kaydı)

# KISA DOSYA python -mtimeit -s"readxml_test_runs'ı test olarak içe aktar" "test.read_xml_iterfind()" 100 döngü, en iyi 3: döngü başına 3,87 msn python -mtimeit -s"readxml_test_runs'ı test olarak içe aktar" "test.read_xml_iterparse()" 100 döngü, en iyi 3 : döngü başına 5,5 msn python -mtimeit -s"readxml_test_runs'ı test olarak içe aktar" "test.read_xml_lxml_xpath()" 100 döngü, en iyi 3: döngü başına 3,86 msn python -mtimeit -s"readxml_test_runs'ı test olarak içe aktar" "test.read_xml_lxml_ )" 100 döngü, döngü başına en iyi 3: 5,68 msn # BÜYÜK DOSYA python -mtimeit -n"100" -s" readxml_test_runs as test" "test.read_xml_iterfind()" 100 döngü, döngü başına en iyi 3: 36 msn python -mtimeit -n"100" -s"readxml_test_runs dosyasını test olarak içe aktar" "test.read_xml_i terparse()" 100 döngü, en iyi 3: döngü başına 78,9 msn python -mtimeit -n"100" -s" readxml_test_runs as test" "test.read_xml_lxml_xpath()" 100 döngü, en iyi 3: döngü başına 32,7 msn python -mtimeit -n"100" -s"readxml_test_runs'ı test olarak içe aktar" "test.read_xml_lxml_xsl()" 100 döngü, en iyi 3: döngü başına 51,4 msn