При разборе фрейма данных xml на pandas возникает ошибка памяти
Я пытаюсь поместить 1. родительский атрибут 2. дочерний атрибут и 3. текст внука во фрейм данных. Я могу заставить дочерний атрибут и текст внука распечатать на экране, но я не могу заставить их помещаться во фрейм данных. Я получаю ошибку памяти от панд.
Вот вступительный материал
import requests
from lxml import etree, objectify
r = requests.get('https://api.stuff.us/place/getData? security_key=key&period=minutes&startTime=2013-05-01T00:00&endTime=2013-05-01T23:59&sort=channel') #edited for privacy
root = etree.fromstring(r.text)
xml_new = etree.tostring(root, pretty_print=True)
print xml_new[300:900] #gives xml output to show structure
<startTime>2013-05-01 00:00:00</startTime>
<endTime>2013-05-01 23:59:00</endTime>
<summaryPeriod>minutes</summaryPeriod>
<data>
<channel channel="97925" name="blah">
<Time Time="2013-05-01 00:00:00">
<value>258</value>
</Time>
<Time Time="2013-05-01 00:01:00">
<value>259</value>
</Time>
<Time Time="2013-05-01 00:02:00">
<value>258</value>
</Time>
<Time Time="2013-05-01 00:03:00">
<value>257</value>
</Time>
Это показывает, как я выполняю синтаксический анализ, чтобы получить дочерний атрибут и внука для печати.
for df in root.xpath('//channel/Time'):
## Iterate over attributes of channel/Time
for attrib in df.attrib:
print '@' + attrib + '=' + df.attrib[attrib]
## value is a child of time, and iterate
subfields = df.getchildren()
for subfield in subfields:
print 'subfield=' + subfield.text
Это дает очень длинную распечатку с информацией по запросу:
...
@Time=2013-05-01 23:01:00
value=100
@Time=2013-05-01 23:02:00
value=101
@Time=2013-05-01 23:03:00
value=99
@Time=2013-05-01 23:04:00
value=101
...
Тем не менее, когда я пытаюсь поместить его в кадр данных, я получаю ошибку памяти. Я попытался с ними обоими, а также просто пытаясь вставить дочерний атрибут во фрейм данных.
data = []
for df in root.xpath('//channel/Time'):
## Iterate over attributes of channel/Time
for attrib in df.attrib:
el_data = {}
el_data[attrib] = df.attrib[attrib]
data.append(el_data)
from pandas import *
perf = DataFrame(data)
perf
---------------------------------------------------------------------------
MemoryError Traceback (most recent call last)
<ipython-input-6-08c8c74f7192> in <module>()
1 from pandas import *
----> 2 perf = DataFrame(data)
3 perf
/Users/user/Library/Enthought/Canopy_32bit/User/lib/python2.7/site- packages/pandas/core/frame.pyc in __init__(self, data, index, columns, dtype, copy)
417
418 if isinstance(data[0], (list, tuple, collections.Mapping, Series)):
--> 419 arrays, columns = _to_arrays(data, columns, dtype=dtype)
420 columns = _ensure_index(columns)
421
/Users/user/Library/Enthought/Canopy_32bit/User/lib/python2.7/site-packages/pandas/core/frame.pyc in _to_arrays(data, columns, coerce_float, dtype)
5457 return _list_of_dict_to_arrays(data, columns,
5458 coerce_float=coerce_float,
-> 5459 dtype=dtype)
5460 elif isinstance(data[0], Series):
5461 return _list_of_series_to_arrays(data, columns,
/Users/user/Library/Enthought/Canopy_32bit/User/lib/python2.7/site- packages/pandas/core/frame.pyc in _list_of_dict_to_arrays(data, columns, coerce_float, dtype)
5521 for d in data]
5522
-> 5523 content = list(lib.dicts_to_array(data, list(columns)).T)
5524 return _convert_object_array(content, columns, dtype=dtype,
5525 coerce_float=coerce_float)
/Users/user/Library/Enthought/Canopy_32bit/User/lib/python2.7/site-packages/pandas/lib.so in pandas.lib.dicts_to_array (pandas/lib.c:7657)()
MemoryError:
У меня есть 12960 значений «значение» в моем XML-файле. Я предполагаю, что эти ошибки памяти говорят мне что-то о значениях в файле, не соответствующих ожидаемым, но это не совпадает с ошибкой памяти, и я не мог понять это из других вопросов SO относительно ошибок памяти или из документация панд.
Попытка получить типы данных не дает никакой информации. Может быть, нет типов? Возможно, потому что они являются элементами в дереве элементов. (Я пытался напечатать .pyval, но он только сказал мне, что атрибута нет.) El_data имеет тип "dict"
print(objectify.dump(root))[700:1000] #print a subset of types
name = 'zone'
Time = None [_Element]
* Time = '2013-05-01 00:00:00'
value = '258' [_Element]
Time = None [_Element]
* Time = '2013-05-01 00:01:00'
value = '259' [_Element]
type(el_data)
dict
Я построил этот код на основе книги Python для анализа данных и других примеров, которые можно найти в SO для анализа XML. Я все еще новичок в Python.
Запуск Python 2.7.2 в Mac OS 10.7.5