Изо всех сил пытается внедрить элементы XML в фрейм данных Pandas - PullRequest
0 голосов
/ 09 апреля 2019

xml и pandas.

То, что я пытаюсь сделать, это изучить кадры данных Pandas, чтобы я мог работать и анализировать данные, поступающие из формата xml. В частности, я хочу быть уверенным в потреблении вложенного XML. В большинстве учебных пособий, которые я читал или видел на Youtube, в инструкциях используются плоские XML-документы без вложенности. Это не данные реального мира, поэтому я пробую что-то более сложное.

Я создал некоторый код на python для генерации фреймов данных Pandas, и я могу начать практиковать запрос данных с помощью фреймворка Pandas.

Я использую музыкальный ресурс с открытым исходным кодом «Discogs», потому что он предоставляет доступ к большим xmls с большим количеством данных, с которыми я могу играть.

Существует несколько проблем с исходными данными, во-первых, нет стандартизированной схемы для таблиц, поэтому структура данных не согласована по всей таблице XML (мне кажется, что эта проблема имитирует реальные данные, и я в конечном итоге работать с по-настоящему). Во-вторых, исходные файлы огромны, самые маленькие - 1,5 ГБ.

Первый шаг, который я сделал, - разделить файлы на более мелкие фрагменты по 200 МБ. Затем я посмотрел на структуру с помощью текстового редактора, поэтому у меня было хорошее понимание тегов и элементов, с которыми мне нужно было работать. Сейчас я работаю со столом под названием «Мастера». Я жестко программирую элементы, которые я пытаюсь вставить в информационный блок, чтобы упростить упражнение и на данный момент содержать его.

Я использую xml.etree для анализа XML-документа и взаимодействия с каждым содержащим его элементом.

Я создал статический фрейм данных с 8 столбцами для ввода данных. Опять же пока просто.

Затем я ищу конкретные элементы в проанализированных XML-данных и извлекаю текст из каждого в переменную для каждого интересующего элемента.

Данные разбиты внутри этого xml как набор строк, каждая из которых заключена в тег, называемый master. Поэтому я использую этот тег в качестве своего корневого якоря для зацикливания.

Если я запускаю вышеизложенное как вывод на консоль, до этого момента все работает нормально, и я получаю поток хорошо сглаженных и правильно сформированных данных (исключая некоторые элементы, которые случайным образом имеют значения None и, следовательно, выдают ошибку)

Последний шаг состоял в том, чтобы затем разобрать строки из каждого собранного элемента в строку, добавленную к фрейму данных.

Здесь я столкнулся с проблемой. Код для добавления к фрейму данных кажется простым, но когда я добавляю его в свой цикл for, я получаю бесконечный цикл, который мне нужно принудительно завершить.

Я явно что-то здесь упускаю. советую с благодарностью. Код, с которым я работаю ниже:

    import xml.etree.ElementTree as et
    import re
    import pandas as pd
    tree = et.parse 
    ('/media/linux/Data1/TestData/masters/200mb/masters-01.xml')
    root = tree.getroot()

    masters_df_cols = ["MasterID", "MainRelese", "Title", "Year", 
    "Genre", "ArtistID", "ArtistName"]
     masters_df = pd.DataFrame(columns = masters_df_cols)

    for elem in root.iter('master'):
        if elem is not None:
            masterID = str(elem.get('id'))
            mainRelease = str(elem.find('main_release').text)
            year = str(elem.find('year').text)
            title = str(elem.find('title').text)
            genre = str(elem.find('./genres/genre').text)
            #style = str(elem.find('./styles/style').text)
            artistID = str(elem.find('./artists/artist/id').text)
            artistName = 
            str(elem.find('./artists/artist/name').text)
         print(masterID, ':', mainRelease, ':', year, ':', title, 
            ':', genre, ':', artistID, ':', artistName)
         masters_df = masters_df.append(pd.DataFrame([masterID, 
         mainRelease, year, title, genre, artistID, artistName], 
         index = masters_df_cols), ignore_index = True)

    print("Dataframe exported.")

Цель состоит в том, чтобы в конечном итоге выполнить это упражнение, скопировав знания, полученные от него, в различных типах XMl, что даст мне возможность динамически искать в XMls теги и элементы, которые я хочу вывести в кадр данных. Затем используйте фреймы данных для создания значимой статистики о содержании данных. Сейчас я просто пытаюсь создать простые плоские фреймы данных с жестко закодированными значениями элементов.

1 Ответ

0 голосов
/ 16 апреля 2019

В приведенном выше коде есть несколько проблем.

Прежде всего, важно быть бдительным с пробелами и отступами в Python. Копия / вставка приведенного выше кода содержала комбинацию пробела и пробела.

Основная семантическая проблема заключается в том, что Pandas не подходит для поэтапного построения DataFrames. Как правило, API Pandas используется для одновременной передачи всей структуры данных, что позволяет каркасу выполнять свою тяжелую работу. Но конечно есть методы для append DataFrames. Но здесь был создан экземпляр DataFrame, а затем для каждой итерации XML создавался новый DataFrame, а затем добавлялся к первому. Это, безусловно, не то, что нужно, и может вызвать проблемы с памятью, особенно перед лицом объемного XML, который потребует много памяти хост-компьютера.

Тогда были незначительные проблемы при построении уровня строки DataFrame. Вот работающая MCVE, иллюстрирующая, как заставить работать XML-разбор синтаксиса, включая примеры встроенных данных.

import xml.etree.ElementTree as et
import re
import pandas as pd
parser = et.XMLParser()
discogs_masters = """<masters>
<master id="18500"><main_release>155102</main_release><images><image height="588" type="primary" uri="" uri150="" width="600" /></images><artists><artist><id>212070</id><name>Samuel L Session</name><anv>Samuel L</anv><join /><role /><tracks /></artist></artists><genres><genre>Electronic</genre></genres><styles><style>Techno</style></styles><year>2001</year><title>New Soil</title><data_quality>Correct</data_quality><videos><video duration="489" embed="true" src="http://www.youtube.com/watch?v=f05Ai921itM"><title>Samuel L - Velvet</title><description>Samuel L - Velvet</description></video><video duration="292" embed="true" src="http://www.youtube.com/watch?v=iOQsBOJLbwg"><title>Samuel L. - Danshes D'afrique</title><description>Samuel L. - Danshes D'afrique</description></video><video duration="348" embed="true" src="http://www.youtube.com/watch?v=v23rSPG_StA"><title>Samuel L - Danses D'Afrique</title><description>Samuel L - Danses D'Afrique</description></video><video duration="288" embed="true" src="http://www.youtube.com/watch?v=tHo82ha6p40"><title>Samuel L - Body N' Soul</title><description>Samuel L - Body N' Soul</description></video><video duration="331" embed="true" src="http://www.youtube.com/watch?v=KDcqzHca5dk"><title>Samuel L - Into The Groove</title><description>Samuel L - Into The Groove</description></video><video duration="334" embed="true" src="http://www.youtube.com/watch?v=3DIYjJFl8Dk"><title>Samuel L - Soul Syndrome</title><description>Samuel L - Soul Syndrome</description></video><video duration="325" embed="true" src="http://www.youtube.com/watch?v=_o8yZMPqvNg"><title>Samuel L - Lush</title><description>Samuel L - Lush</description></video><video duration="346" embed="true" src="http://www.youtube.com/watch?v=JPwwJSc_-30"><title>Samuel L - Velvet ( Direct Me )</title><description>Samuel L - Velvet ( Direct Me )</description></video></videos></master>
<master id="18512"><main_release>33699</main_release><images><image height="150" type="primary" uri="" uri150="" width="150" /><image height="592" type="secondary" uri="" uri150="" width="600" /><image height="592" type="secondary" uri="" uri150="" width="600" /></images><artists><artist><id>212070</id><name>Samuel L Session</name><anv /><join /><role /><tracks /></artist></artists><genres><genre>Electronic</genre></genres><styles><style>Tribal</style><style>Techno</style></styles><year>2002</year><title>Psyche EP</title><data_quality>Correct</data_quality><videos><video duration="376" embed="true" src="http://www.youtube.com/watch?v=c_AfLqTdncI"><title>Samuel L. Session - Psyche Part 1</title><description>Samuel L. Session - Psyche Part 1</description></video><video duration="419" embed="true" src="http://www.youtube.com/watch?v=0nxvR8Zl9wY"><title>Samuel L. Session - Psyche Part 2</title><description>Samuel L. Session - Psyche Part 2</description></video><video duration="118" embed="true" src="http://www.youtube.com/watch?v=QYf4j0Pd2FU"><title>Samuel L. Session - Arrival</title><description>Samuel L. Session - Arrival</description></video></videos></master>
</masters>
"""
parser.feed(discogs_masters)
root = parser.close()

masters_df_cols = ["MasterID", "MainRelese", "Title", "Year", 
"Genre", "ArtistID", "ArtistName"]
masters_rows = []

for elem in root.iter('master'):
    if elem is not None:
        masterID = str(elem.get('id'))
        mainRelease = str(elem.find('main_release').text)
        year = str(elem.find('year').text)
        title = str(elem.find('title').text)
        genre = str(elem.find('./genres/genre').text)
        artistID = str(elem.find('./artists/artist/id').text)
        artistName = str(elem.find('./artists/artist/name').text)
    masters_rows.append([masterID, mainRelease, year, title, genre, artistID, artistName])

masters_df = pd.DataFrame(masters_rows, columns = masters_df_cols)
print(masters_df)

Производит этот вывод

  MasterID MainRelese Title       Year       Genre ArtistID        ArtistName
0    18500     155102  2001   New Soil  Electronic   212070  Samuel L Session
1    18512      33699  2002  Psyche EP  Electronic   212070  Samuel L Session
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...