Устранена. Функция вероятности массы гамма-функции реализована в numpy.random иначе, чем в моем учебнике.
Я получил правильное среднее значение, установив параметр 'scale' в теле get_samples_from_gamma_dist () в 1 / lamb:
def get_samples_from_gamma_dist( num_of_samples, size_of_samples, alpha, lamb ):
'''
Returns table with ( num_of_samples ) rows and ( size_of_samples ) columns.
Cells in the table are i.i.d sample values from numpy's gamma function
with shape parameter ( alpha ) and scale parameter ( 1 / lamb ).
'''
return pd.DataFrame(
data = gamma(
shape = alpha,
scale = 1 / lamb,
size =
(
num_of_samples,
size_of_samples
)
)
)
Существует два распространенных способа обработать данные XML.
Каждого называют DOM, который обозначает Объектную модель документа. Этот стиль парсинга XML, вероятно, что Вы видели при рассмотрении документации, потому что это читает весь XML в память для создания объектной модели.
Второе называют SAX, который является методом потоковой передачи. Синтаксический анализатор начинает читать XML и отправляет сигналы в Ваш код об определенных событиях, например, когда новый тег запуска найден.
Таким образом, SAX ясно, в чем Вы нуждаетесь для своей ситуации. Синтаксические анализаторы саксофона могут быть найдены в библиотеке Python под xml.sax и xml.parsers.expat.
Я имел успех с cElementTree.iterparse методом, чтобы сделать подобную задачу.
У меня был большой xml документ с повторными 'записями' с тегом 'resFrame', и я хотел отфильтровать записи для определенного идентификатора. Вот код, который я использовал для него:
исходный документ имел эту структуру
<snapDoc>
<bucket>....</bucket>
<bucket>....</bucket>
<bucket>....</bucket>
...
<resFrame><id>234234</id>.....</resFrame>
<frame><id>344234</id>.....</frame>
<resFrame>...</resFrame>
<frame>...</frame>
</snapDoc>
Я использовал следующий сценарий для создания меньшего документа, который имел ту же структуру, записи блока и только resFrame записи с определенным идентификатором.
#!/usr/bin/env python2.6
import xml.etree.cElementTree as cElementTree
start = '''<?xml version="1.0" encoding="UTF-8"?>
<snapDoc>'''
def main():
print start
context = cElementTree.iterparse('snap.xml', events=("start", "end"))
context = iter(context)
event, root = context.next() # get the root element of the XML doc
for event, elem in context:
if event == "end":
if elem.tag == 'bucket': # i want to write out all <bucket> entries
elem.tail = None
print cElementTree.tostring( elem )
if elem.tag == 'resFrame':
if elem.find("id").text == ":4:39644:482:-1:1": # i only want to write out resFrame entries with this id
elem.tail = None
print cElementTree.tostring( elem )
if elem.tag in ['bucket', 'frame', 'resFrame']:
root.clear() # when done parsing a section clear the tree to safe memory
print "</snapDoc>"
main()
Как случайный! Will Larson просто сделал хорошее сообщение об Обработке Очень Большого CSV и XML-файла в Python.
Основная еда на дом, кажется, для использования xml.sax
модуль, как Van упомянул, и сделать некоторые макрофункции к краткому обзору далеко деталями SAX низкого уровня API.
Вы могли бы рассмотреть использование функции ElementTree iterparse для этой ситуации.
Это старая, но очень хорошая статья из колонки Uche Ogbuji, также очень хорошей Python и XMl. Он охватывает ваш точный вопрос и использует стандартный модуль sax библиотеки, как и в другом ответе. Декомпозиция, обработка, перекомпоновка