Перейти к основному контенту

Руководство по Great Expectations: проверка данных на Python

Научитесь проверять свои данные с помощью Great Expectations в Python в этом сквозном руководстве!
Обновлено 22 июл. 2026 г.  · 8 мин читать

Изучить с помощью AI

Открыть в ChatGPTОткрыть в ClaudeОткрыть в Perplexity

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

Great Expectations — это инструмент для проверки данных с открытым исходным кодом, который позволяет на ранних этапах выявлять проблемы с данными и гарантирует соответствие требуемым стандартам качества.

В этом руководстве мы пошагово покажем, как использовать Great Expectations для валидации данных, на практическом сквозном примере, чтобы вы могли быстро начать работу!

Что такое Great Expectations?

Great Expectations (GX) — это популярный open-source фреймворк для управления и автоматизации проверки данных в современных конвейерах данных.

Его фреймворк на Python помогает командам по данным гарантировать качество и согласованность данных. Пользователи могут задавать «expectations» — правила или тесты, описывающие, как должны выглядеть корректные данные, — которые автоматически проверяют, соответствуют ли данные этим стандартам.

Преимущества Great Expectations:

  • Автоматическая валидация данных — Great Expectations автоматизирует процесс проверки данных, сокращая ручной труд и снижая риск ошибок. Он обеспечивает стабильное соответствие данных заранее заданным стандартам.
  • Интеграция с конвейерами данных — Легко интегрируется с различными источниками и платформами данных, включая базы данных SQLs, облачное хранилище и инструменты ETL, что позволяет выполнять проверку данных на разных этапах вашего конвейера.
  • Понятные и прикладные результаты проверок — Инструмент предоставляет прозрачные результаты валидации, что упрощает обнаружение проблем с качеством данных и их быстрое устранение.
  • Документация данных — Great Expectations может генерировать подробную и удобную документацию по процессам проверки данных, помогая командам согласовать стандарты качества и создавая базу для дальнейшего использования.
  • Масштабируемость и гибкость — Как open-source инструмент, Great Expectations высоко настраиваем и масштабируется под ваши потребности в валидации данных, предлагая гибкость для различных кейсов без высоких затрат.

Теперь перейдём к сквозному примеру!

Настройка Great Expectations

В этом руководстве вы узнаете, как использовать GX Core, open-source версию Great Expectations, для проверки DataFrame в Pandas. Мы пройдём настройку контекста, регистрацию источника данных Pandas, определение expectations и валидацию пакетов данных.

Примечание: Рекомендуем работать параллельно в ноутбуке DataLab, но вы также можете создать собственный скрипт на Python.

Предварительные требования

  • Установленный Python 3.9–3.12.
  • Во избежание конфликтов настоятельно рекомендуется устанавливать Great Expectations в виртуальную среду (дисклеймер: настройка виртуальных окружений выходит за рамки этой статьи).
  • Пример набора данных.

Примечание: Если вы используете предоставленный ноутбук DataLab, эти требования уже выполнены. Можно их пропустить.

Используйте следующую команду для установки GX через pip:

pip install great_expectations

Эта команда установит основной пакет и все необходимые зависимости.

Great Expectations требует контекст данных для управления конфигурациями. Мы используем эфемерный контекст данных, чтобы не сохранять конфигурации.

import great_expectations as gx

# Get the Ephemeral Data Context
context = gx.get_context()
assert type(context).__name__ == "EphemeralDataContext"

Создание первого набора правил валидации

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

Источник данных подключает Great Expectations к вашим данным, а data asset представляет конкретное подмножество данных (например, таблицу, DataFrame или файл).

В нашем случае мы подготовим всё для подключения к DataFrame с именем inventory_parts_df. Пример набора данных доступен в предоставленном DataLab, и он создаётся после запуска SQL-блока:

Если вы не используете DataLab, создайте собственный DataFrame с тестовыми данными.

Теперь создайте источник и asset:

# Add a Pandas Data Source
data_source = context.data_sources.add_pandas(name="inventory_parts")
# Add a Data Asset to the Data Source
data_asset = data_source.add_dataframe_asset(name="inventory_parts_asset")

Batch definition определяет и организует ваши данные для валидации. Здесь мы добавим определение пакета, охватывающее весь DataFrame:

# Define the Batch Definition name
batch_definition_name = "inventory_parts_batch"
# Add the Batch Definition
batch_definition = data_asset.add_batch_definition_whole_dataframe(batch_definition_name)
assert batch_definition.name == batch_definition_name

Пакет (batch) — это набор данных, связанный с batch definition. Чтобы выполнить проверку, нужно получить пакет и связать его с вашим DataFrame, в нашем случае с inventory_parts_df:

# Define the Batch Parameters
batch_parameters = {"dataframe": inventory_parts_df}
# Retrieve the Batch
batch = batch_definition.get_batch(batch_parameters=batch_parameters)

Expectations — это правила для проверки данных. В этом примере мы зададим следующие простые правила:

  1. Гарантировать, что значения inventory_id не равны null.
  2. Гарантировать, что значения part_num уникальны.
# Create an Expectation Suite
expectation_suite_name = "inventory_parts_suite"
suite = gx.ExpectationSuite(name=expectation_suite_name)
# Add Expectations
suite.add_expectation(
    gx.expectations.ExpectColumnValuesToNotBeNull(column="inventory_id")
)
suite.add_expectation(
    gx.expectations.ExpectColumnValuesToBeUnique(column="part_num")
)
# Add the Expectation Suite to the Context
context.suites.add(suite)

Вы можете изучить все доступные правила в Expectation Gallery. Добавьте ещё несколько — это полезно!

После определения правил GX выводит конфигурацию набора expectations:

{
  "name": "inventory_parts_suite",
  "id": "b2de0b69-0869-4163-8dde-6c09884483f7",
  "expectations": [
    {
      "type": "expect_column_values_to_not_be_null",
      "kwargs": {
        "column": "inventory_id"
      },
      "meta": {},
      "id": "53d6c42a-d190-412f-a113-783b706531f4"
    },
    {
      "type": "expect_column_values_to_be_unique",
      "kwargs": {
        "column": "part_num"
      },
      "meta": {},
      "id": "362a2bdc-616d-4b3a-b7f0-c73808caee78"
    }
  ],
  "meta": {
    "great_expectations_version": "1.2.4"
  },
  "notes": null
}

Набор включает следующие детали:

  1. Имя набора и ID: Уникальное имя (inventory_parts_suite) и идентификатор для отслеживания и управления набором.
  2. Expectations: Каждое правило указывает:
    • Тип проверки (например, отсутствие null в столбце или уникальность значений).
    • Параметры, такие как проверяемый столбец.
    • Метаданные и уникальный ID каждого правила для удобного отслеживания и настройки.
  3. Метаданные: Информация о версии Great Expectations для обеспечения совместимости.
  4. Заметки: Поле для добавления описательных комментариев о наборе (необязательно).

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

5. Валидация данных

Наконец, проверьте пакет на соответствие заданным правилам и оцените результаты.

# Validate the Data Against the Suite
validation_results = batch.validate(suite)
# Evaluate the Results
print(validation_results)

После выполнения проверки Great Expectations предоставит подробный отчёт о том, соответствует ли набор данных заданным правилам:

{
  "success": false,
  "results": [
    {
      "success": true,
      "expectation_config": {
        "type": "expect_column_values_to_not_be_null",
        "kwargs": {
          "batch_id": "inventory_parts-inventory_parts_asset",
          "column": "inventory_id"
        },
        "meta": {},
        "id": "53d6c42a-d190-412f-a113-783b706531f4"
      },
      "result": {
        "element_count": 580069,
        "unexpected_count": 0,
        "unexpected_percent": 0.0,
        "partial_unexpected_list": [],
        "partial_unexpected_counts": [],
        "partial_unexpected_index_list": []
      },
      "meta": {},
      "exception_info": {
        "raised_exception": false,
        "exception_traceback": null,
        "exception_message": null
      }
    },
    {
      "success": false,
      "expectation_config": {
        "type": "expect_column_values_to_be_unique",
        "kwargs": {
          "batch_id": "inventory_parts-inventory_parts_asset",
          "column": "part_num"
        },
        "meta": {},
        "id": "362a2bdc-616d-4b3a-b7f0-c73808caee78"
      },
      "result": {
        "element_count": 580069,
        "unexpected_count": 568352,
        "unexpected_percent": 97.98006788847535,
        "partial_unexpected_list": [
          "48379c01",
          "paddle",
          "11816pr0005",
          "2343",
          "3003",
          "30176",
          "3020",
          "3022",
          "3023",
          "30357",
          "3039",
          "3062b",
          "3068b",
          "3069b",
          "3069b",
          "33291",
          "33291",
          "3795",
          "3941",
          "3960"
        ],
        "missing_count": 0,
        "missing_percent": 0.0,
        "unexpected_percent_total": 97.98006788847535,
        "unexpected_percent_nonmissing": 97.98006788847535,
        "partial_unexpected_counts": [
          {
            "value": "3069b",
            "count": 2
          },
          {
            "value": "33291",
            "count": 2
          },
          {
            "value": "11816pr0005",
            "count": 1
          },
          {
            "value": "2343",
            "count": 1
          },
          {
            "value": "3003",
            "count": 1
          },
          {
            "value": "30176",
            "count": 1
          },
          {
            "value": "3020",
            "count": 1
          },
          {
            "value": "3022",
            "count": 1
          },
          {
            "value": "3023",
            "count": 1
          },
          {
            "value": "30357",
            "count": 1
          },
          {
            "value": "3039",
            "count": 1
          },
          {
            "value": "3062b",
            "count": 1
          },
          {
            "value": "3068b",
            "count": 1
          },
          {
            "value": "3795",
            "count": 1
          },
          {
            "value": "3941",
            "count": 1
          },
          {
            "value": "3960",
            "count": 1
          },
          {
            "value": "48379c01",
            "count": 1
          },
          {
            "value": "paddle",
            "count": 1
          }
        ],
        "partial_unexpected_index_list": [
          0,
          3,
          4,
          5,
          6,
          7,
          8,
          9,
          10,
          11,
          12,
          13,
          14,
          15,
          16,
          17,
          18,
          19,
          20,
          21
        ]
      },
      "meta": {},
      "exception_info": {
        "raised_exception": false,
        "exception_traceback": null,
        "exception_message": null
      }
    }
  ],
  "suite_name": "inventory_parts_suite",
  "suite_parameters": {},
  "statistics": {
    "evaluated_expectations": 2,
    "successful_expectations": 1,
    "unsuccessful_expectations": 1,
    "success_percent": 50.0
  },
  "meta": {
    "great_expectations_version": "1.2.4",
    "batch_spec": {
      "batch_data": "PandasDataFrame"
    },
    "batch_markers": {
      "ge_load_time": "20241129T122532.416424Z",
      "pandas_data_fingerprint": "84a1e1939091fcf54324910def3b89cd"
    },
    "active_batch_definition": {
      "datasource_name": "inventory_parts",
      "data_connector_name": "fluent",
      "data_asset_name": "inventory_parts_asset",
      "batch_identifiers": {
        "dataframe": "<DATAFRAME>"
      }
    }
  },
  "id": null
}

Этот отчёт описывает качество ваших данных, указывая на успешные и неуспешные проверки. Краткое пояснение результатов:

Итоговая валидация: Результат частично успешен: 50% правил пройдено и 50% — нет. Неуспешная проверка указывает на проблему качества данных, требующую внимания. В данном случае один столбец не соответствует заданному правилу.

Expectation 1: inventory_id не должен содержать пропусков

  • Результат: успешно
  • Пояснение: В столбце inventory_id присутствуют все значения, нет null или пропусков. Это говорит о хорошей полноте данных в этом столбце.

Expectation 2: part_num должен содержать уникальные значения

  • Результат: неуспешно
  • Пояснение: В столбце part_num 97,98% дубликатов, то есть уникальных значений очень мало.
  • Особенности:
    • Примеры дубликатов: «3069b» и «33291».
    • Инструмент показывает частоту появления этих дубликатов и позиции строк, что упрощает поиск и исправление проблем.

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

Вот и всё! Вы выполнили сквозные проверки данных.

Интеграция Great Expectations в конвейеры данных

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

В этом разделе мы обсудим, как интегрировать Great Expectations в ваши конвейеры данных.

Это лишь примеры для общего представления; могут потребоваться дополнительные настройки, не включённые здесь. Смотрите документацию каждого инструмента для актуального синтаксиса!

Интеграция с инструментами ETL

Интегрировать Great Expectations с популярными инструментами ETL, такими как Apache Airflow или Prefect, достаточно просто. Встраивание шагов проверки непосредственно в процессы ETL позволит выявлять и устранять проблемы с данными в реальном времени до того, как они повлияют на последующую аналитику.

Рассмотрим простой пример интеграции Great Expectations с Prefect для запуска проверки данных как части автоматизированного ETL-конвейера:

from prefect import task, Flow
import great_expectations as ge
# Define a task to run Great Expectations validation
@task
def validate_data():
    context = ge.data_context.DataContext()
    batch_kwargs = {"path": "path/to/your/datafile.csv", "datasource": "your_datasource"}
    batch = context.get_batch(batch_kwargs, suite_name="your_expectation_suite")
    results = context.run_validation_operator("action_list_operator", assets_to_validate=[batch])
	    
    # Check validation results and raise an alert if validation fails
    if not results["success"]:
        raise ValueError("Data validation failed!")
# Define your ETL flow
with Flow("ETL_with_GE_Validation") as flow:
    validation = validate_data()
# Execute the flow
flow.run()

В этом примере мы определяем поток Prefect с задачей для запуска проверки Great Expectations.

Задача validate_data() загружает контекст Great Expectations, получает пакет данных и применяет набор правил.

Если данные не соответствуют критериям проверки, задача генерирует оповещение, останавливая рабочий процесс и предотвращая ошибки далее по цепочке.

Непрерывная валидация данных

Вы можете планировать задания по валидации с помощью различных средств — от cron в Unix-системах до управляемых сервисов вроде Apache Airflow. В качестве примера покажем, как расписать проверки в Airflow, который хорошо подходит для оркестрации конвейеров данных.

Вот как настроить DAG (ориентированный ацикличный граф) в Airflow для ежедневного запуска проверок Great Expectations:

from airflow import DAG
from airflow.operators.python_operator import PythonOperator
from datetime import datetime
import great_expectations as ge
# Define the DAG and set the schedule to run daily
default_args = {
	  'owner': 'airflow',
	  'start_date': datetime(2024, 1, 1),
	  'retries': 1,
}
dag = DAG(
      'great_expectations_validation',
	default_args=default_args,
	schedule_interval='@daily',  # Runs once a day
)
# Define the function to run the validation
def run_validation():
    context = ge.data_context.DataContext()
    batch = context.get_batch(batch_kwargs, suite_name="your_expectation_suite")
    results = context.run_validation_operator("action_list_operator", assets_to_validate=[batch])
    return results
# Set up the task in Airflow
validation_task = PythonOperator(
      task_id='run_great_expectations_validation',
      python_callable=run_validation,
      dag=dag,
)
# Set the task in the DAG
validation_task

В этом примере мы определяем DAG, который запускает проверку раз в день (@daily). 

Функция run_validation() выполняет проверку, загружая контекст Great Expectations и прогоняя определённый набор правил на данных.

Лучшие практики проверки данных с Great Expectations

Следование лучшим практикам — залог масштабируемости и эффективности; для Great Expectations это также справедливо.

Начинайте с малого и развивайте решение итеративно

Начните с базовых проверок качества и постепенно расширяйте их. Лучше сосредоточиться на простых правилах сначала, чтобы не усложнять процесс — так интеграция пройдёт гладко, а отладка будет проще. По мере углубления понимания набора данных добавляйте более сложные проверки.

Сотрудничайте между командами

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

Автоматизируйте, где это возможно

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

Заключение

Отличная работа! Вы узнали, как настраивать и проверять данные в Great Expectations. Эти техники помогут поддерживать высокое качество данных и прозрачность ваших процессов.

Чтобы продолжить обучение, посмотрите эти материалы:

FAQs

Как Great Expectations сравнивается с другими инструментами для проверки данных?

Great Expectations — это open-source, гибкий инструмент, хорошо интегрирующийся с современными конвейерами данных. Он выделяется обширной библиотекой правил (expectations) и качественной документацией.

Нужно ли знать Python, чтобы использовать Great Expectations?

Базовые знания Python полезны, но Great Expectations предоставляет удобную CLI и подробную документацию, что делает его доступным и для тех, кто не пишет код.

Какие типы источников данных поддерживает Great Expectations?

Great Expectations поддерживает широкий спектр источников данных, включая:

  • Реляционные базы данных, такие как PostgreSQL, MySQL и SQL Server.
  • Облачные хранилища, такие как AWS S3, Google Cloud Storage и Azure Blob Storage.
  • Форматы файлов, такие как CSV, Parquet и Excel.
  • Фреймворки для больших данных, такие как Apache Spark и Databricks. Вы легко подключите Great Expectations к этим источникам с помощью соответствующей конфигурации для вашего datasource.

Могу ли я использовать Great Expectations с потоковыми данными?

Great Expectations в первую очередь предназначен для пакетной проверки данных. Хотя он не поддерживает потоковые конвейеры нативно, его можно интегрировать с фреймворками вроде Apache Kafka или Spark Structured Streaming, периодически проверяя снимки или микропакеты данных.

Можно ли версионировать правила и результаты валидации?

Да. Вы можете хранить expectations и конфигурации в системах контроля версий как YAML или JSON в репозитории Git. Для результатов проверок можно настроить базу данных или файловое хранилище, чтобы отслеживать динамику и интегрировать её в ваши CI/CD-пайплайны для непрерывного мониторинга.

Как Great Expectations справляется с изменениями схемы в наборах данных?

Great Expectations обрабатывает эволюцию схемы с помощью гибкой системы правил. Если схема меняется, вы можете:

  • Использовать expect_table_columns_to_match_set или похожие правила для динамической проверки имён столбцов.
  • Изменять или создавать новые наборы правил под обновлённую схему.
  • Использовать инструменты инференса схемы, чтобы автоматически обновлять правила для новых столбцов.
Темы

Узнайте больше об инженерии данных на этих курсах!

Track

Инженер данных на Python

40 ч
Получите востребованные навыки для эффективного сбора, очистки и управления данными, а также планирования и мониторинга пайплайнов, чтобы выделиться в сфере data engineering.
ПодробнееRight Arrow
Начать Курс
Смотрите большеRight Arrow