利用PYTHON进行数据分析 学习笔记(三)

XML(Extensible Markup Language)是另一种常见的支持分层、嵌套数据以及元数据的结构化数据格式。本书所使用的这些文件实际上来自于一个很大的XML文档。

纽约大都会运输署(Metropolitan Transportation Authority,MTA)发布了一些有关其公交和列车服务的数据资料(http://www.mta.info/developers/download.html )。这里,我们将看看包含在一组XML文件中的运行情况数据。每项列车或公交服务都各有各自的文件(如Metro-North Railroad的文件是Performance_MNR.xml),其中每条XML记录就是一条月度数据。这里需要注意,前文所述的网址和文件都已经有了些许变化,下面的文本展示,实际是“./Performance_MNRR.xml”文本内容,我们的后续学习也将基于该文件。

<?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文件的根节点的引用:

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:

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):

from io import StringIO

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

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

现在可以访问链接文本或标记中的任何字段了(如href):

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

本段中涉及一些概念,还需要后续好好研习,root、children、tag、xml的规范。。。

转载于:https://www.cnblogs.com/sam-xu/p/10891201.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值