Руководство по проверке данных с помощью SemPy и больших ожиданий (GX)
В этом руководстве описано, как использовать SemPy вместе с большими ожиданиями (GX) для выполнения проверки данных в семантических моделях Power BI.
В этом учебнике описаны следующие процедуры.
- Проверьте ограничения для набора данных в рабочей области Fabric с помощью источника данных Fabric Great Expectation (построенного на семантическом канале).
- Настройте контекст данных GX, ресурсы данных и ожидания.
- Просмотр результатов проверки с помощью контрольной точки GX.
- Используйте семантику для анализа необработанных данных.
Необходимые компоненты
Получение подписки Microsoft Fabric. Или зарегистрируйте бесплатную пробную версию Microsoft Fabric.
Войдите в Microsoft Fabric.
Используйте переключатель интерфейса в левой части домашней страницы, чтобы перейти на интерфейс Synapse Обработка и анализ данных.
- Выберите рабочие области в области навигации слева, чтобы найти и выбрать рабочую область. Эта рабочая область становится текущей рабочей областью.
- Скачайте пример PBIX.pbix-файла для анализа розничной торговли.
- В рабочей области нажмите кнопку "Отправить ", чтобы отправить пример PBIX.pbix-файла розничного анализа в рабочую область.
Следуйте инструкциям в записной книжке
great_expectations_tutorial.ipynb — это записная книжка, сопровождающая это руководство.
Чтобы открыть сопровождающую записную книжку для этого руководства, следуйте инструкциям в статье "Подготовка системы для обработки и анализа данных", чтобы импортировать записную книжку в рабочую область.
Если вы хотите скопировать и вставить код на этой странице, можно создать новую записную книжку.
Перед запуском кода обязательно подключите lakehouse к записной книжке .
Настройка записной книжки
В этом разделе описана настройка среды записной книжки с необходимыми модулями и данными.
- Установите
SemPy
и соответствующиеGreat Expectations
библиотеки из PyPI с помощью%pip
возможности установки в строке в записной книжке.
# install libraries
%pip install semantic-link great-expectations 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
Чтобы приступить к работе с большими ожиданиями, сначала необходимо настроить контекст данных GX. Контекст служит точкой входа для операций GX и содержит все соответствующие конфигурации.
context = gx.get_context()
Теперь вы можете добавить набор данных Fabric в этот контекст в качестве источника данных, чтобы начать взаимодействие с данными. В этом руководстве используется стандартный пример семантической модели семантической модели розничной торговли 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 SemPy evaluate_measure
.
ds.add_powerbi_measure_asset(
"Total Units Asset",
measure="TotalUnits",
groupby_columns=["Time[FiscalYear]", "Time[FiscalMonth]"]
)
DAX
Если вы хотите определить собственные меры или иметь более широкий контроль над определенными строками, можно добавить ресурс 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
В некоторых случаях может потребоваться использовать вычисления динамического административного представления (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
ДАКС
Добавьте "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
)
Теперь запустите точку проверка и извлеките результаты в виде кадра данных 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])
)
Сохраните эти результаты в кадре данных.
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 в записную книжку. Если нет присоединенного озера, вы не увидите ошибку, но вы также не сможете получить контекст. Если вы добавите 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 с помощью семантической ссылки