Инструкция: Проверка данных с помощью SemPy и Great Expectations (GX)
В этом руководстве вы узнаете, как использовать SemPy вместе с Great Expectations (GX) для проверки данных в семантических моделях Power BI.
В этом руководстве показано, как:
- Проверьте ограничения для набора данных в рабочей области Fabric с помощью источника данных Fabric от Great Expectation (основанного на семантической ссылке).
- Настройте контекст данных GX, ресурсы данных и ожидания.
- Просмотр результатов проверки с помощью контрольной точки GX.
- Используйте семантику для анализа необработанных данных.
Необходимые условия
Получите подписку Microsoft Fabric. Или зарегистрируйте бесплатную пробную Microsoft Fabric.
Войдите в Microsoft Fabric.
Используйте переключатель интерфейса в левой нижней части домашней страницы, чтобы перейти на Fabric.
- Выберите Рабочие области в левой области навигации, чтобы найти и выбрать вашу рабочую область. Эта рабочая область становится текущей рабочей областью.
- Скачайте файл образец анализа розничной торговли PBIX.pbix.
- В рабочей области выберите Импорт>Отчета или Страничного Отчета>с этого компьютера, чтобы загрузить файл Retail Analysis Sample PBIX.pbix в рабочую область.
Следуйте инструкциям в записной книжке
great_expectations_tutorial.ipynb — это записная книжка, сопровождающая это руководство.
Чтобы открыть сопровождающую записную книжку для этого руководства, следуйте инструкциям в Подготовьте систему для руководств по науке о данных, чтобы импортировать записную книжку в вашу рабочую область.
Если вы хотите скопировать и вставить код на этой странице, можно создать новую записную книжку.
Не забудьте подключить lakehouse к записной книжке перед началом выполнения кода.
Настройка записной книжки
В этом разделе описана настройка среды записной книжки с необходимыми модулями и данными.
- Установите
SemPy
и соответствующие библиотекиGreat Expectations
из PyPI с помощью встроенной возможности установки%pip
в тетради.
# install libraries
%pip install semantic-link 'great-expectations<1.0' great_expectations_experimental great_expectations_zipcode_expectations
# load %%dax cell magic
%load_ext sempy
- Выполните необходимые импорты модулей, которые потребуются вам позже:
import great_expectations as gx
from great_expectations.expectations.expectation import ExpectationConfiguration
from great_expectations_zipcode_expectations.expectations import expect_column_values_to_be_valid_zip5
Настройка контекста и источника данных GX
Чтобы запустить работу с Great Expectations, сначала необходимо настроить GX контекст данных. Контекст служит точкой входа для операций GX и содержит все соответствующие конфигурации.
context = gx.get_context()
Теперь вы можете добавить набор данных Fabric в этот контекст как источник данных, чтобы начать работать с данными. В этом руководстве используется стандартная семантическая модель Power BI из файла Retail Analysis Sample .pbix.
ds = context.sources.add_fabric_powerbi("Retail Analysis Data Source", dataset="Retail Analysis Sample PBIX")
Указание ресурсов данных
Определите ресурсы данных, чтобы указать подмножество данных, с которыми вы хотите работать. Ресурс может быть как простым, так и полными таблицами, или быть сложным в виде пользовательского запроса выражений анализа данных (DAX).
Здесь вы добавите несколько ресурсов:
- Таблица Power BI
- Показатель Power BI
- Настраиваемый запрос DAX
- запрос динамического управления (DMV)
Таблица Power BI
Добавьте таблицу Power BI в качестве ресурса данных.
ds.add_powerbi_table_asset("Store Asset", table="Store")
Мера Power BI
Если набор данных содержит предварительно настроенные меры, добавьте эти меры в качестве активов после аналогичного API evaluate_measure
SemPy.
ds.add_powerbi_measure_asset(
"Total Units Asset",
measure="TotalUnits",
groupby_columns=["Time[FiscalYear]", "Time[FiscalMonth]"]
)
ДАКС
Если вы хотите определить свои собственные метрики или иметь более широкий контроль над конкретными строками, можно добавить объект DAX с пользовательским запросом DAX. Здесь мы задаем меру Total Units Ratio
, разделив две существующие меры.
ds.add_powerbi_dax_asset(
"Total Units YoY Asset",
dax_string=
"""
EVALUATE SUMMARIZECOLUMNS(
'Time'[FiscalYear],
'Time'[FiscalMonth],
"Total Units Ratio", DIVIDE([Total Units This Year], [Total Units Last Year])
)
"""
)
Запрос DMV
В некоторых случаях может быть полезным использовать вычисления Dynamic Management View (DMV) как часть процесса проверки данных. Например, можно отслеживать количество нарушений целостности ссылок в наборе данных. Дополнительные сведения см. в разделе Очистка данных = более быстрыйотчет.
ds.add_powerbi_dax_asset(
"Referential Integrity Violation",
dax_string=
"""
SELECT
[Database_name],
[Dimension_Name],
[RIVIOLATION_COUNT]
FROM $SYSTEM.DISCOVER_STORAGE_TABLES
"""
)
Ожидания
Чтобы добавить конкретные ограничения в активы, сначала необходимо настроить комплекты ожиданий . После добавления отдельных требований в каждый набор, вы можете обновить контекст данных, настроенный в начале, используя новый набор. Полный список доступных ожиданий см. в Галерее ожиданий GX.
Начните с добавления "Retail Store Suite" с двумя ожиданиями:
- корректный почтовый индекс
- таблица с числом строк от 80 до 200
suite_store = context.add_expectation_suite("Retail Store Suite")
suite_store.add_expectation(ExpectationConfiguration("expect_column_values_to_be_valid_zip5", { "column": "PostalCode" }))
suite_store.add_expectation(ExpectationConfiguration("expect_table_row_count_to_be_between", { "min_value": 80, "max_value": 200 }))
context.add_or_update_expectation_suite(expectation_suite=suite_store)
TotalUnits
Мера
Добавьте "Retail Measure Suite" с одним ожиданием:
- Значения столбцов должны превышать 50 000
suite_measure = context.add_expectation_suite("Retail Measure Suite")
suite_measure.add_expectation(ExpectationConfiguration(
"expect_column_values_to_be_between",
{
"column": "TotalUnits",
"min_value": 50000
}
))
context.add_or_update_expectation_suite(expectation_suite=suite_measure)
Total Units Ratio
DAX
Добавьте "Retail DAX Suite" с одним ожиданием:
- Значения столбцов для общего числа единиц должны составлять от 0,8 до 1,5.
suite_dax = context.add_expectation_suite("Retail DAX Suite")
suite_dax.add_expectation(ExpectationConfiguration(
"expect_column_values_to_be_between",
{
"column": "[Total Units Ratio]",
"min_value": 0.8,
"max_value": 1.5
}
))
context.add_or_update_expectation_suite(expectation_suite=suite_dax)
Нарушения целостности ссылок (DMV)
Добавьте "Retail DMV Suite" с одним ожиданием:
- значение RIVIOLATION_COUNT должно быть 0
suite_dmv = context.add_expectation_suite("Retail DMV Suite")
# There should be no RI violations
suite_dmv.add_expectation(ExpectationConfiguration(
"expect_column_values_to_be_in_set",
{
"column": "RIVIOLATION_COUNT",
"value_set": [0]
}
))
context.add_or_update_expectation_suite(expectation_suite=suite_dmv)
Ратификация
Чтобы фактически выполнить указанные ожидания для данных, сначала создайте контрольную точку и добавьте её в контекст. Дополнительные сведения о настройке контрольных точек см. в рабочем процессе проверки данных.
checkpoint_config = {
"name": f"Retail Analysis Checkpoint",
"validations": [
{
"expectation_suite_name": "Retail Store Suite",
"batch_request": {
"datasource_name": "Retail Analysis Data Source",
"data_asset_name": "Store Asset",
},
},
{
"expectation_suite_name": "Retail Measure Suite",
"batch_request": {
"datasource_name": "Retail Analysis Data Source",
"data_asset_name": "Total Units Asset",
},
},
{
"expectation_suite_name": "Retail DAX Suite",
"batch_request": {
"datasource_name": "Retail Analysis Data Source",
"data_asset_name": "Total Units YoY Asset",
},
},
{
"expectation_suite_name": "Retail DMV Suite",
"batch_request": {
"datasource_name": "Retail Analysis Data Source",
"data_asset_name": "Referential Integrity Violation",
},
},
],
}
checkpoint = context.add_checkpoint(
**checkpoint_config
)
Теперь запустите контрольную точку и извлеките результаты в виде DataFrame pandas для простого форматирования.
result = checkpoint.run()
Обработка и печать результатов.
import pandas as pd
data = []
for run_result in result.run_results:
for validation_result in result.run_results[run_result]["validation_result"]["results"]:
row = {
"Batch ID": run_result.batch_identifier,
"type": validation_result.expectation_config.expectation_type,
"success": validation_result.success
}
row.update(dict(validation_result.result))
data.append(row)
result_df = pd.DataFrame.from_records(data)
result_df[["Batch ID", "type", "success", "element_count", "unexpected_count", "partial_unexpected_list"]]
В этих результатах вы увидите, что все ожидания прошли проверку, за исключением параметра Total Units YoY Asset, который вы определили с помощью пользовательского запроса DAX.
Диагностика
С помощью семантической ссылки можно получить исходные данные, чтобы понять, какие точные годы находятся вне диапазона. Семантическая ссылка предоставляет встроенную магию для выполнения запросов DAX. Используйте семантическую ссылку, чтобы выполнить тот же запрос, который вы передали в ресурс данных GX, и визуализировать полученные значения.
%%dax "Retail Analysis Sample PBIX"
EVALUATE SUMMARIZECOLUMNS(
'Time'[FiscalYear],
'Time'[FiscalMonth],
"Total Units Ratio", DIVIDE([Total Units This Year], [Total Units Last Year])
)
в таблице
Сохраните эти результаты в DataFrame.
df = _
Постройте график результатов.
import matplotlib.pyplot as plt
df["Total Units % Change YoY"] = (df["[Total Units Ratio]"] - 1)
df.set_index(["Time[FiscalYear]", "Time[FiscalMonth]"]).plot.bar(y="Total Units % Change YoY")
plt.axhline(0)
plt.axhline(-0.2, color="red", linestyle="dotted")
plt.axhline( 0.5, color="red", linestyle="dotted")
None
На графике вы можете увидеть, что апрель и июль были немного вне диапазона, после чего вы можете предпринять дальнейшие шаги для расследования.
Хранение конфигурации GX
По мере изменения данных в наборе данных с течением времени может потребоваться повторно выполнить только что выполненные проверки GX. В настоящее время контекст данных (содержащий подключенные ресурсы данных, наборы ожиданий и контрольную точку) существует временно, но его можно преобразовать в файловый контекст для дальнейшего использования. Кроме того, можно создать экземпляр контекста файла (см. создание экземпляра контекста данных).
context = context.convert_to_file_context()
Теперь, после сохранения контекста, скопируйте каталог gx
в lakehouse.
Важный
В этой ячейке предполагается, что вы добавили озерный дом в тетрадь. Если нет присоединенного озера, вы не увидите ошибку, но вы также не сможете получить контекст. Если вы добавите lakehouse сейчас, ядро перезапустится, поэтому вам придется повторно запустить всю записную книжку, чтобы вернуться к этой точке.
# copy GX directory to attached lakehouse
!cp -r gx/ /lakehouse/default/Files/gx
Теперь будущие контексты можно создать с помощью context = gx.get_context(project_root_dir="<your path here>")
, чтобы использовать все конфигурации из этого руководства.
Например, в новой записной книжке подключите то же озеро и используйте context = gx.get_context(project_root_dir="/lakehouse/default/Files/gx")
для получения контекста.
Связанное содержимое
Ознакомьтесь с другими руководствами по семантической ссылке / SemPy:
- Руководство: Очистка данных с помощью функциональных зависимостей
- Урок: Анализ функциональных зависимостей в примерной семантической модели
- Руководство: извлечение и вычисление мер Power BI из записной книжки Jupyter
- руководство по . Обнаружение связей в семантической модели с помощью семантической связи
- Руководство по . Обнаружение связей в наборе данных Synthea с помощью семантической связи