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 теги и элементы, которые я хочу вывести в кадр данных. Затем используйте фреймы данных для создания значимой статистики о содержании данных. Сейчас я просто пытаюсь создать простые плоские фреймы данных с жестко закодированными значениями элементов.