CoderCastrov logo
CoderCastrov
Питон

Как использовать функции Qri для создания лучшего набора данных

Как использовать функции Qri для создания лучшего набора данных
просмотров
6 мин чтение
#Питон

Qri может хранить все необходимые данные для идентификации, документирования, хранения, обновления и проверки набора данных в одном месте. Давайте воспользуемся этим.

В моем последнем посте, я написал парсер на Python, чтобы извлечь данные из удобной страницы Найти парк Калифорнии.

Если вы вдохновлены создать что-то с этим набором данных, он доступен на qri.cloud: feep/ca_state_parks. Пойдите. Создайте что-нибудь. Не беспокойтесь о нас, этот пост будет здесь, когда вы вернетесь.

Я использовал данные для создания файла .kmz (.kml и .kmz - это форматы файлов Google, похожие на .gpx) всех государственных парков с пешими и велосипедными кемпингами, чтобы я мог найти их, когда у меня нет сигнала во время велосипедного тура.

Но об этом я здесь не говорю.

Мой набор данных имеет некоторые проблемы

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

Кроме того, метаданные качества делают ваш набор данных более доступным и удобным для использования - либо с помощью Google или qri.cloud, если это общедоступный набор данных, либо внутренне, если он является частным. Мы должны заполнить это, чтобы сделать набор данных более полезным.

Редактор метаданных Qri Desktop.
  1. Скрипт, который сгенерировал файл .csv в наборе данных, работал. Но если кто-то еще захотел бы его использовать или изменить, мне пришлось бы найти место для размещения скрипта. Они должны были бы его установить и его зависимости. Мы должны быть внимательны к проблемам межплатформенной совместимости.

  2. Поля, отображающие особенности парка, названы произвольным числом, а не меткой, отражающей содержимое поля.

  3. Я написал заголовочную строку в файл .csv, но Qri не обнаружил ее.

Плохие имена полей, их нужно исправить.

Как создать лучший набор данных?

The Qri dataset model

Почему эта картинка присутствует в каждой статье о Qri? Она является важной и определяющей особенностью Qri.

В предыдущей статье мы использовали body и readme. Мы добавили commit сообщение. Qri автоматически добавляет другую полезную информацию о коммите.

Мы собираемся использовать оставшиеся три компонента: meta, transform и structure, чтобы улучшить наш набор данных.

Более подробно я расскажу о structure и qri validate в следующей статье.

Meta: meta.json

  1. Метаданные. Это просто.

Используйте Qri Desktop. В нем есть форма, которую нужно заполнить, включая подсказки, которые объясняют, как заполнить каждое поле.

Add some useful metadata.

Или вы можете редактировать meta.json в вашем любимом редакторе. Это простой файл .json (или .yaml). Поля перечислены здесь. Затем выполните qri commit -m 'Added metadata.'.

{
 "keywords": [
  "государственные парки",
  "кемпинг",
  "государственные пляжи",
  "калифорния"
 ],
 "license": {
  "type": "Общественное достояние",
  "url": "[https://creativecommons.org/share-your-work/public-domain/pdm/](https://creativecommons.org/share-your-work/public-domain/pdm/)"
 },
 "qri": "md:0",
 "theme": [
  "Отдых"
 ],
 "title": "Государственные парки Калифорнии: местоположение и особенности"
}

Transform: transform.star

  1. Starlark - это круто.

Компонент transform позволяет нам хранить код для генерации нашего body. Скрипт transform выполняется каждый раз, когда версия набора данных сохраняется с указанным transform.

Скрипт хранится и версионируется вместе с другими компонентами в наборе данных. Код и данные "связаны" вместе.

Скрипты Transform написаны на starlark. Starlark - это подмножество Python 3 с некоторыми отличиями. Qri включает starlib, небольшую стандартную библиотеку для использования в ваших скриптах starlark.

Какие отличия?

Какие изменения нам нужно внести в скрипт на Python, чтобы он работал в starlark?

Наш скрипт на Python мог быть произвольным. Для transform.star нам нужен доступ к объекту dataset, чтобы записать в него. Qri вызывает transform(ds, ctx) с объектом dataset и контекстом. Нам нужно переместить часть нашего кода в transform().

# starlarkdef transform(ds, ctx):
    parkindex = ctx.download
...

Starlark работает в песочнице. Он не имеет доступа к локальной файловой системе. В Python мы просто можем открыть файл с помощью open.

Из-за песочницы нам нужно загрузить файл из интернета. Вся работа с интернетом должна происходить в download(), которая вызывается перед transform().

# starlarkdownload(ctx):
    res = http.get("https://www.parks.ca.gov/parkindex")
    return res.body()

В Python 3.6+ порядок итерации словаря является детерминированным. Наши данные поступают из JSON-объекта, каждая запись является словарем.

В Python мы могли быть ленивыми и полагаться на это, чтобы все записи оставались в том же порядке. В starlark такое упрощение приводит к беспорядку (а также возможному недоразумению и ругательствам). Чтобы обойти это, нам нужно определить порядок ключей и использовать его для записи строк.

# starlark dict order is not deterministickeyorderunlabled = [
    "long_name",
    "type_desc",
 ...

Теперь, когда у нас есть работающий transform.star, давайте используем его для обновления нашего набора данных. Наш transform будет генерировать body.csv. Команда qri save завершится с ошибкой, если они уже существуют, поэтому нам нужно удалить их перед запуском.

❯ rm  body.csv structure.json❯ # наш transform генерирует оба этих файла. Нам нужно удалить их, иначе они будут конфликтовать. Подробнее [здесь](https://qri.io/docs/transforms/overview#blending-manual-edits--transform-scripts).❯ qri save -m 'Added transform to generate body and structure.'
for linked dataset [feep/ca_state_parks_star]dataset saved: feep/ca_state_parks_star@/ipfs/QmQWXMVXUMvyyHV3adPsKoyRzsYX9iFTBnuT4m24jDdwPG❯ qri publish
for linked dataset [feep/ca_state_parks_star]0/10 blocks transferred
...
10/10 blocks transferred
done!
published dataset feep/ca_state_parks_star@QmU6qjzFk7mrSUdiAxg1TDBLVq4nt9N96jkNYsc6X2XM2u/ipfs/QmQWXMVXUMvyyHV3adPsKoyRzsYX9iFTBnuT4m24jDdwPG
  1. Извлечение названий полей из HTML с помощью bsoup.

vParksJson содержит все данные о парках, их местоположениях и особенностях, но имена полей особенностей не указаны. Они помечены числами.

Как мы узнаем, какая особенность соответствует какому числу?

Если вы нажмете на BY FEATURE, вы получите вид аккордеона с флажками для особенностей. Откройте инспектор BOATING > Boat Ramps.

Так мы получим <div class="panel-group" id="accordion">, начиная с 343 строки. Мы можем использовать [bsoup](https://qri.io/docs/transforms/starlib#bsoup), похожий на [beautifulsoup](https://www.crummy.com/software/BeautifulSoup/) API для разбора меток из каждого флажка.

# starlark
# Разбор меток для значений флажковnodes = bsoup.parseHtml(parkindex)
nodes = nodes.find_all("label")label = {}for i in nodes:
    for_ = i.attrs().get("for")
    if not for_:
        continue
    label[for_] = i.get_text()

Затем мы заменяем числовые метки текстом меток, которые мы разобрали из HTML.

# starlark
# `get(key, key)` помечает все ключи, которые есть в
# `label`, в противном случае они сохраняют свою старую меткуt = structure([label.get(key, key) for key in keyorderunlabled])

Модель набора данных Qri

Qri хранит все необходимое для идентификации, документирования, хранения, обновления и проверки набора данных в одном месте.

Если вы используете все компоненты в своих интересах, ваш набор данных будет более полезным, как для вас, так и для других.

О, и Qri также предоставляет вам способ поделиться своим набором данных с миром. И он отслеживает изменения каждого компонента в наборе данных.

Создайте что-то интересное

В этом посте было рассказано много о том, что вы можете сделать с Qri. Вам не обязательно так глубоко вдаваться в детали, чтобы начать. Если у вас есть набор данных, который вы хотите поделиться с миром, загрузите Qri Desktop или cli и опубликуйте его. Если вы видите интересный набор данных на qri.cloud, клонируйте его и создайте что-то.

Если вам нужен этот набор данных, он находится на qri.cloud, feep/ca_state_parks_star.

Я начал писать абзац о вспомогательных файлах для этого поста, когда понял, что они все находятся на qri.cloud. Вот именно суть этого поста.

Если вам нужен файл .kmz или скрипт на Python, который его создал, или Python, который сгенерировал body.csv для сравнения с transform.star, все они находятся на GitHub.

Если вы хотите поиграть с преобразованиями, вам понадобится командная строка qri, преобразования пока не доступны в Qri Desktop (04/2020, последняя версия Qri Desktop - 0.4.2).

Вы сделали что-то крутое? Покажите нам. Мы с удовольствием посмотрим, что вы создали.