Рубрики
Без рубрики

Используя Pydantic в качестве инструмента проверки анализа и данных

Pydantic обеспечивает базовыйodel, который может быть продлен в разные поля коллекций для данных Mo … Теги с Python, программированием, базой данных, MongoDB.

Pydantic предоставляет Базомодель , который может быть продлен в различные области коллекций для моделирования данных. Он поддерживает Enum Тип, конверсионные конверсии JSON и даже диапазон строки HTTP.

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

Вступление

У НАСА есть куча прохладных и Публично доступные API Отказ Все, что нам нужно сделать, как разработчики для их использования – запросить ключ API. Тогда мы можем запросить данные, связанные с последними нововведениями, которые у NASA или фотографии дня или уведомления о погоде.

Для этого приложения я выбрал уведомления о погоде (Donki). Потому что у него есть какой-то текст и datetime Поля, которые я мог использовать в этом разборе.

С запрошенными данными уведомлений о погоде я хотел хорошо разбирать их с Pydantic, затем вставьте их в базу данных документов (MongoDB).

Необработанный ответ выглядит следующим образом:

{
    "messageType":"RBE",
    "messageID":"20201007-AL-001",
    "messageURL":"https://kauai.ccmc.gsfc.nasa.gov/DONKI/view/Alert/15920/1",
    "messageIssueTime":"2020-10-07T17:18Z",
    "messageBody":"## NASA Goddard Space Flight Center, Space Weather Research Center ( SWRC )\n## Message Type: Space Weather Notification - Radiation Belt Enhancement\n##\n## Message Issue Date: 2020-10-07T17:18:51Z\n## Message ID: 20201007-AL-001\n##\n## Disclaimer: NOAA's Space Weather Prediction Center (http://swpc.noaa.gov) is the United States Government official source for space weather forecasts. This \"Experimental Research Information\" consists of preliminary NASA research products and should be interpreted and used accordingly.\n\n\n## Summary:\n\nSignificantly elevated energetic electron fluxes in the Earth's outer radiation belt. GOES \"greater than 2.0 MeV\" integral electron flux is above 1000 pfu starting at 2020-10-07T14:05Z. \n\nThe elevated energetic electron flux levels are caused by an S-type CME with ID 2020-09-30T12:09:00-CME-001.\n\nNASA spacecraft at GEO, MEO and other orbits passing through or in the vicinity of the Earth's outer radiation belt can be impacted.\n\nActivity ID: 2020-10-07T14:05:00-RBE-001."
}

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

{ 
    "_id" : ObjectId("5fd917b83ecc12560ee43ef1"),
    "insertion_date" : ISODate("2020-12-15T20:08:23.091Z"),
    "message_type_abbreviation" : "RBE",
    "message_url" : "https://kauai.ccmc.gsfc.nasa.gov/DONKI/view/Alert/15920/1",
    "message_body" : 
        {
            "message_type" : "Space Weather Notification - Radiation Belt Enhancement",
            "message_issue_date" : ISODate("2020-10-07T17:18:51Z"),
            "message_id" : "20201007-AL-001",
            "disclaimer" : "NOAA's Space Weather Prediction Center (http://swpc.noaa.gov) is the United States Government official source for space weather forecasts. This \"Experimental Research Information\" consists of preliminary NASA research products and should be interpreted and used accordingly.",
            "summary" : "Significantly elevated energetic electron fluxes in the Earth's outer radiation belt. GOES \"greater than 2.0 MeV\" integral electron flux is above 1000 pfu starting at 2020-10-07T14:05Z. The elevated energetic electron flux levels are caused by an S-type CME with ID 2020-09-30T12:09:00-CME-001. NASA spacecraft at GEO, MEO and other orbits passing through or in the vicinity of the Earth's outer radiation belt can be impacted. Activity ID: 2020-10-07T14:05:00-RBE-001.",
            "notes" : null
        }
}

Некоторые замечания о наборе данных:

  • Тип сообщения может быть только одной из следующих категорий: FLR, SEP, CME, IPS, MPC, GST, RBE и отчет.
  • Тело сообщения имеет текстовые поля, разделенные со следующими символами: \ n ## Отказ

Некоторые хорошие концепции от пидантического

Pydantic поставляется с Базомодель Отказ С Базомодель , мы можем разобрать некоторые словари с правильным типом, или изменить поведение определенного типа при преобразовании Базомодель в JSON.

Возможно, имея дело с вложенными формами данных, мышление изнутри к снаружим облегчает нашу жизнь. Следовательно, начиная с тела сообщения может быть полезно для этого случая использования. В следующем примере можно использовать для моделирования корпуса сообщения. Для печати мы можем получить помощь от Набрав Модуль, в качестве примера, чтобы иметь дополнительные поля:

from typing import Optional
from datetime import datetime
from pydantic import BaseModel


class NotificationMessageBody(BaseModel):
    message_type: str
    message_issue_date: datetime
    message_id: str
    disclaimer: Optional[str]
    summary: Optional[str]
    notes: Optional[str]

Мы можем преобразовать NotificationMessagebody Введите в JSON со следующим кодом:

parsed_and_cleaned_message_body_dict = {
    "message_type": "Space Weather Notification - Radiation Belt Enhancement",
    "message_issue_date": "2020-10-07T17:18:51Z",
    "message_id": "20201007-AL-001",
    "disclaimer": "NOAA's Space Weather Prediction Center (http://swpc.noaa.gov) is the United States Government official source for space weather forecasts. This \"Experimental Research Information\" consists of preliminary NASA research products and should be interpreted and used accordingly.",
    "summary": "Significantly elevated energetic electron fluxes in the Earth's outer radiation belt. GOES \"greater than 2.0 MeV\" integral electron flux is above 1000 pfu starting at 2020-10-07T14:05Z. The elevated energetic electron flux levels are caused by an S-type CME with ID 2020-09-30T12:09:00-CME-001. NASA spacecraft at GEO, MEO and other orbits passing through or in the vicinity of the Earth's outer radiation belt can be impacted. Activity ID: 2020-10-07T14:05:00-RBE-001."
}

print(
    NotificationMessageBody(
        **parsed_and_cleaned_message_body_dict
    ).json()
)

Это распечатает все поля в формате по умолчанию. Поле DATETIME будет сначала преобразовано из строки в Python DateTime, то преобразование JSON по умолчанию выводится ISO 8601 Формат строки DateTime. Примечания Поле не имеет ввода в примере. По этой причине преобразование JSON гарантирует, что он возвращается к нулевой :

{
    "message_type": "Space Weather Notification - Radiation Belt Enhancement",
    "message_issue_date": "2020-10-07T17:18:51+00:00",
    "message_id": "20201007-AL-001",
    "disclaimer": "NOAA's Space Weather Prediction Center (http://swpc.noaa.gov) is the United States Government official source for space weather forecasts. This \"Experimental Research Information\" consists of preliminary NASA research products and should be interpreted and used accordingly.",
    "summary": "Significantly elevated energetic electron fluxes in the Earth's outer radiation belt. GOES \"greater than 2.0 MeV\" integral electron flux is above 1000 pfu starting at 2020-10-07T14:05Z. The elevated energetic electron flux levels are caused by an S-type CME with ID 2020-09-30T12:09:00-CME-001. NASA spacecraft at GEO, MEO and other orbits passing through or in the vicinity of the Earth's outer radiation belt can be impacted. Activity ID: 2020-10-07T14:05:00-RBE-001.",
    "notes": null
}

Наконец, мы можем моделировать весь NotificationMessage Отказ Мы можем выбрать использовать enum для проверки, если один из этих значений enum в MessageTypeabbreviationenum существуют. Кроме того, мы могли бы использовать Httpurl Тип из пиданта. Это уверяет, что строка URL содержит Http. или HTTPS. протокол. Кроме того, он нарушает URL на куски Схема , хозяин , TLD , Host_Type и путь Поля:

from datetime import datetime
from pydantic import BaseModel, HttpUrl
from enum import Enum


class MessageTypeAbbreviationEnum(str, Enum):
    FLR = "FLR"
    SEP = "SEP"
    CME = "CME"
    IPS = "IPS"
    MPC = "MPC"
    GST = "GST"
    RBE = "RBE"
    Report = "Report"


class NotificationMessage(BaseModel):
    insertion_date: datetime
    message_type_abbreviation: MessageTypeAbbreviationEnum
    message_url: HttpUrl
    message_body: NotificationMessageBody

    class Config:
        json_encoders = {
            datetime: lambda v: v.strftime("%Y-%m-%d %H:%M:%S")
        }

Пример содержит дополнительную конфигурацию для кодировщиков JSON. На этот раз отличается от NotificationMessagebody Пример, json_encoders гарантирует, что DateTime отформатирован как % Y-% m-% d% h:% m:% s Как делается трансформация JSON.

Пример ввода:

parsed_and_cleaned_message_body_dict = {
    "message_type": "Space Weather Notification - Radiation Belt Enhancement",
    "message_issue_date": "2020-10-07T17:18:51Z",
    "message_id": "20201007-AL-001",
    "disclaimer": "NOAA's Space Weather Prediction Center (http://swpc.noaa.gov) is the United States Government official source for space weather forecasts. This \"Experimental Research Information\" consists of preliminary NASA research products and should be interpreted and used accordingly.",
    "summary": "Significantly elevated energetic electron fluxes in the Earth's outer radiation belt. GOES \"greater than 2.0 MeV\" integral electron flux is above 1000 pfu starting at 2020-10-07T14:05Z. The elevated energetic electron flux levels are caused by an S-type CME with ID 2020-09-30T12:09:00-CME-001. NASA spacecraft at GEO, MEO and other orbits passing through or in the vicinity of the Earth's outer radiation belt can be impacted. Activity ID: 2020-10-07T14:05:00-RBE-001."
}

parsed_and_cleaned_notification_message_dict = {
    "insertion_date": "2020-12-15T20:08:23.091Z",
    "message_type_abbreviation": "RBE",
    "message_url": "https://kauai.ccmc.gsfc.nasa.gov/DONKI/view/Alert/15920/1",
    "message_body": parsed_and_cleaned_message_body_dict
}

print(
    NotificationMessage(
        **parsed_and_cleaned_notification_message_dict
    ).json()
)

Пример дает следующий выход. Поля DateTime ( insertion_date и message_issue_date ) содержат данный формат dateTime ( % Y-% m-% d% h:% m:% s ) В классе конфигурации ( 2020-12-15T20: 08: 23.091Z становится 2020-12-15 20:08:23 ). И все message_body Поля проанализированы как NotificationMessagebody Модель предлагает:

{
    "insertion_date": "2020-12-15 20:08:23",
    "message_type_abbreviation": "RBE",
    "message_url": "https://kauai.ccmc.gsfc.nasa.gov/DONKI/view/Alert/15920/1",
    "message_body": 
        {
            "message_type": "Space Weather Notification - Radiation Belt Enhancement",
            "message_issue_date": "2020-10-07 17:18:51",
            "message_id": "20201007-AL-001",
            "disclaimer": "NOAA's Space Weather Prediction Center (http://swpc.noaa.gov) is the United States Government official source for space weather forecasts. This \"Experimental Research Information\" consists of preliminary NASA research products and should be interpreted and used accordingly.",
            "summary": "Significantly elevated energetic electron fluxes in the Earth's outer radiation belt. GOES \"greater than 2.0 MeV\" integral electron flux is above 1000 pfu starting at 2020-10-07T14:05Z. The elevated energetic electron flux levels are caused by an S-type CME with ID 2020-09-30T12:09:00-CME-001. NASA spacecraft at GEO, MEO and other orbits passing through or in the vicinity of the Earth's outer radiation belt can be impacted. Activity ID: 2020-10-07T14:05:00-RBE-001.",
            "notes": null
        }
}      

Вставка в БД

После разбора и проверки вложенных словарей соответствует совместимости NotificationMessage Модель, можно вставить те много уведомлений в базу данных. Это может быть база данных документов, поскольку у них есть аналогичная структура, что и JSON. Проект использует MongoDB.

Популярный пакет для Mongodb, пимонго Имеет хороший метод для вставки многих записей на одну партию. Удивительно, что это называется как insert_many. . И это требует словаря типа. Просто упомянуть, я использовал метод преобразования словаря из Pydantics для этой цели:

notifications = donki_parser.create_message_dictionary()
notifications_as_dict = list(map(lambda n: n.dict(), notifications))

notifications_repository = NotificationsRepository(
    host=MONGO_HOST,
    port=MONGO_PORT
)

notifications_repository.insert_many(notifications_as_dict)

Последние слова

Приятно узнать больше о разборе данных и проверке в Python. Pydantic – это удобный инструмент для этой цели. Примеры, которые я дал, требует довольно предварительной обработки. Возможно, это из-за примера API данных, которые я выбрал. Большое количество текстовых полей в корпусе сообщений делает данные осторожны. После решения этой головоломки Pydantic позаботился о том, чтобы все поля были правильными и готовы вставить в базу данных документов.

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

Для всего проекта, пожалуйста, обратитесь к репозиторий GitHub.

Оригинал: “https://dev.to/nazliander/using-pydantic-as-a-parser-and-data-validation-tool-51n3”