利用PYTHON進行數據分析 學習筆記(三)

XML(Extensible Markup Language)是另外一種常見的支持分層、嵌套數據以及元數據的結構化數據格式。本書所使用的這些文件實際上來自於一個很大的XML文檔。html

紐約大都會運輸署(Metropolitan Transportation Authority,MTA)發佈了一些有關其公交和列車服務的數據資料(http://www.mta.info/developers/download.html )。這裏,咱們將看看包含在一組XML文件中的運行狀況數據。每項列車或公交服務都各有各自的文件(如Metro-North Railroad的文件是Performance_MNR.xml),其中每條XML記錄就是一條月度數據。這裏須要注意,前文所述的網址和文件都已經有了些許變化,下面的文本展現,實際是「./Performance_MNRR.xml」文本內容,咱們的後續學習也將基於該文件。python

<?xml version="1.0" encoding="UTF-8" standalone="true"?>
-<PERFORMANCE>

-<INDICATOR>
<INDICATOR_SEQ>28345</INDICATOR_SEQ>
<PARENT_SEQ>55526</PARENT_SEQ>
<AGENCY_NAME>Metro-North Railroad</AGENCY_NAME>
<INDICATOR_NAME>Hudson Line - OTP</INDICATOR_NAME>
<DESCRIPTION>Percent of commuter trains that arrive at their destinations within 5 minutes and 59 seconds of the scheduled time.</DESCRIPTION>
<CATEGORY>Service Indicators</CATEGORY>
<FREQUENCY>M</FREQUENCY>
<DESIRED_CHANGE>U</DESIRED_CHANGE>
<INDICATOR_UNIT>%</INDICATOR_UNIT>
<DECIMAL_PLACES>1</DECIMAL_PLACES>
-<YEAR>
<PERIOD_YEAR>2008</PERIOD_YEAR>
-<MONTH>
<PERIOD_MONTH>1</PERIOD_MONTH>
-<MONTHLYVALUES>
<YTD_TARGET>98.00</YTD_TARGET>
<YTD_ACTUAL>99.30</YTD_ACTUAL>
<MONTHLY_TARGET>98.00</MONTHLY_TARGET>
<MONTHLY_ACTUAL>99.30</MONTHLY_ACTUAL>

利用lxml.objectify解析文件,經過getroot獲得XML文件的根節點的引用:app

from lxml import objectify
import numpy as np
import pandas as pd
from pandas import Series, DataFrame

path="Performance_MNRR.xml"
parsed = objectify.parse(open(path))
root = parsed.getroot()

root.INDICATOR返回一個用於產生各個 XML元素的生成器。對於每條記錄,咱們能夠用標記名(如YTD_ACTUAL)和數據值填充一個字典(排除幾個標記): 學習

data = []

skip_fields = ['PARENT_SEQ','INDICATOR_SEQ','DESIRED_CHANGE','DECIMAL_PLACES']

for elt in root.INDICATOR:  #還能夠試試root.INDICATOR.YEAR.PERIOD_YEAR
    el_data = {}
    for child in elt.getchildren():
        if child.tag in skip_fields:
            continue
        el_data[child.tag] = child.text  #原child.pyval 沒法識別。搜索後建議用.text,但結果perf中都是object類型,而非value
    data.append(el_data)                 #好比:GENCY_NAME       13 non-null object

最後,將這組字典轉換爲一個DataFrame:code

perf = DataFrame(data)
perf.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 13 entries, 0 to 12
Data columns (total 7 columns):
AGENCY_NAME       13 non-null object
CATEGORY          13 non-null object
DESCRIPTION       13 non-null object
FREQUENCY         13 non-null object
INDICATOR_NAME    13 non-null object
INDICATOR_UNIT    13 non-null object
YEAR              0 non-null object
dtypes: object(7)
memory usage: 808.0+ bytes

XML數據能夠比本例複雜得多。每一個標記均可以有元數據。看看下面這個HTML的連接標記(它也算是一段有效的XML):orm

from io import StringIO

tag = '<a href="http://www.baidu.com">BaiDu</a>'

root = objectify.parse(StringIO(tag)).getroot()

如今能夠訪問連接文本或標記中的任何字段了(如href):xml

root
<Element a at 0x137f2861e88>
root.get('href')
'http://www.baidu.com'
root.text
'BaiDu'

本段中涉及一些概念,還須要後續好好研習,root、children、tag、xml的規範。。。htm

相關文章
相關標籤/搜索