Tutorial: validar dados usando SemPy e Great Expectations (GX)
Neste tutorial, você aprenderá a usar o SemPy junto com o Great Expectations (GX) para executar a validação de dados em modelos semânticos do Power BI.
Este tutorial mostra como:
- Valide restrições em um conjunto de dados em seu workspace do Fabric com a Fonte de Dados do Fabric do Great Expectations (criada no link semântico).
- Configure um contexto de dados do GX, ativos de dados e expectativas.
- Exiba resultados de validação com um ponto de verificação do GX.
- Use o link semântico para analisar dados brutos.
Pré-requisitos
Obtenha uma assinatura do Microsoft Fabric. Ou, inscreva-se para uma avaliação gratuita do Microsoft Fabric.
Entre no Microsoft Fabric.
Use o alternador de experiência no lado esquerdo da sua página inicial para mudar para a experiência de Ciência de Dados Synapse.
- Selecione Workspaces no painel de navegação esquerdo para localizar e selecionar seu workspace. Esse workspace se torna seu workspace atual.
- Baixe o arquivo PBIX.pbix de exemplo de análise de varejo.
- Em seu workspace, use o botão Carregar para carregar o arquivo PBIX.pbix de exemplo de análise de varejo no workspace.
Acompanhar no notebook
great_expectations_tutorial.ipynb é o notebook que acompanha este tutorial.
Para abrir o notebook que acompanha este tutorial, siga as instruções em Preparar seu sistema para tutoriais de ciência de dados para importar os notebooks para seu workspace.
Se preferir copiar e colar o código a partir dessa página, você poderá criar um novo notebook.
Certifique-se de anexar um lakehouse ao notebook antes de começar a executar o código.
Configurar o notebook
Nesta seção, você configura um ambiente de notebook com os módulos e dados necessários.
- Instale
SemPy
e as bibliotecas relevantesGreat Expectations
do PyPI usando a funcionalidade de instalação em linha%pip
dentro do notebook.
# install libraries
%pip install semantic-link great-expectations great_expectations_experimental great_expectations_zipcode_expectations
# load %%dax cell magic
%load_ext sempy
- Realize as importações necessárias de módulos que você precisará mais tarde:
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
Configurar o contexto de dados e a fonte de dados do GX
Para começar a usar o Great Expectations, primeiro você precisa configurar um contexto de dados do GX. O contexto serve como um ponto de entrada para operações do GX e contém todas as configurações relevantes.
context = gx.get_context()
Agora você pode adicionar seu conjunto de dados do Fabric a esse contexto como uma Fonte de Dados para começar a interagir com os dados. Este tutorial usa um arquivo .pbix de exemplo de análise de varejo de modelo semântico de exemplo do Power BI padrão.
ds = context.sources.add_fabric_powerbi("Retail Analysis Data Source", dataset="Retail Analysis Sample PBIX")
Especificar ativos de dados
Defina os ativos de dados para especificar o subconjunto de dados com os quais você gostaria de trabalhar. O ativo pode ser tão simples quanto tabelas completas ou ser tão complexo quanto uma consulta personalizada de expressões de análise de dados (DAX).
Aqui, você adicionará vários ativos:
- Tabela do Power BI
- Medida do Power BI
- Consulta DAX personalizada
- Consulta de exibição de gerenciamento dinâmico (DMV)
Tabela do Power BI
Adicione uma tabela do Power BI como um ativo de dados.
ds.add_powerbi_table_asset("Store Asset", table="Store")
Medida do Power BI
Se o conjunto de dados contiver medidas pré-configuradas, adicione as medidas como ativos seguindo uma API semelhante à evaluate_measure
do SemPy.
ds.add_powerbi_measure_asset(
"Total Units Asset",
measure="TotalUnits",
groupby_columns=["Time[FiscalYear]", "Time[FiscalMonth]"]
)
DAX
Se você quiser definir suas próprias medidas ou ter mais controle sobre linhas específicas, poderá adicionar um ativo DAX com uma consulta DAX personalizada. Aqui, definimos uma Total Units Ratio
medida dividindo duas medidas existentes.
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])
)
"""
)
Consulta DMV
Em alguns casos, pode ser útil usar cálculos de exibição de gerenciamento dinâmico (DMV) como parte do processo de validação de dados. Por exemplo, você pode acompanhar o número de violações de integridade referencial em seu conjunto de dados. Para obter mais informações, confira Limpar dados = relatórios mais rápidos.
ds.add_powerbi_dax_asset(
"Referential Integrity Violation",
dax_string=
"""
SELECT
[Database_name],
[Dimension_Name],
[RIVIOLATION_COUNT]
FROM $SYSTEM.DISCOVER_STORAGE_TABLES
"""
)
Expectativas
Para adicionar restrições específicas aos ativos, primeiro você precisa configurar o Expectation Suites. Depois de adicionar expectativas individuais a cada pacote, você pode atualizar o contexto de dados configurado no início com o novo pacote. Para obter uma lista completa das expectativas disponíveis, confira a Galeria de Expectativas do GX.
Comece adicionando uma "Retail Store Suite" com duas expectativas:
- um CEP válido
- uma tabela com contagem de linhas entre 80 e 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)
Medida TotalUnits
Adicione uma "Retail Measure Suite" com uma expectativa:
- Os valores de coluna devem ser maiores que 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)
DAX Total Units Ratio
Adicione uma "Retail DAX Suite" com uma expectativa:
- Os valores de coluna para a taxa de unidades totais devem estar entre 0,8 e 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)
Violações de integridade referencial (DMV)
Adicione uma "Retail DMV Suite" com uma expectativa:
- o RIVIOLATION_COUNT deve ser 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)
Validação
Para realmente executar as expectativas especificadas em relação aos dados, primeiro crie um ponto de verificação e adicione-o ao contexto. Para obter mais informações sobre a configuração do ponto de verificação, confira o fluxo de trabalho de validação de dados.
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
)
Agora execute o ponto de verificação e extraia os resultados como um DataFrame pandas para formatação simples.
result = checkpoint.run()
Processe e imprima seus resultados.
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"]]
Nesses resultados, você pode ver que todas as suas expectativas passaram pela validação, exceto o "Total de Unidades YoY Asset" que você definiu por meio de uma consulta DAX personalizada.
Diagnósticos
Usando o link semântico, você pode buscar os dados de origem para entender quais anos exatos estão fora do intervalo. O link semântico fornece uma mágica embutida para executar consultas DAX. Use o link semântico para executar a mesma consulta que você passou para o ativo de dados do GX e visualizar os valores resultantes.
%%dax "Retail Analysis Sample PBIX"
EVALUATE SUMMARIZECOLUMNS(
'Time'[FiscalYear],
'Time'[FiscalMonth],
"Total Units Ratio", DIVIDE([Total Units This Year], [Total Units Last Year])
)
Salve esses resultados em um DataFrame.
df = _
Plote os resultados.
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
No gráfico, você pode ver que abril e julho estavam ligeiramente fora do alcance e pode, assim, tomar mais medidas para investigar.
Armazenar a configuração do GX
À medida que os dados em seu conjunto de dados são alterados ao longo do tempo, convém executar novamente as validações do GX que você acabou de executar. Atualmente, o contexto de dados (que contém os ativos de dados conectados, os Expectation Suites e o ponto de verificação) é efêmero, mas pode ser convertido em um contexto de arquivo para uso futuro. Como alternativa, você pode criar uma instância de um contexto de arquivo (confira Instanciar um contexto de dados).
context = context.convert_to_file_context()
Agora que você salvou o contexto, copie o diretório gx
para o lakehouse.
Importante
Essa célula pressupõe que você tenha adicionado um lakehouse ao notebook. Se não houver nenhum lakehouse anexado, você não verá um erro, mas também não poderá obter o contexto mais tarde. Se você adicionar um lakehouse agora, o kernel será reiniciado, portanto, você terá que executar novamente todo o notebook para voltar a este ponto.
# copy GX directory to attached lakehouse
!cp -r gx/ /lakehouse/default/Files/gx
Agora, os contextos futuros podem ser criados com context = gx.get_context(project_root_dir="<your path here>")
para usar todas as configurações deste tutorial.
Por exemplo, em um novo bloco de anotações, anexe o mesmo lakehouse e use context = gx.get_context(project_root_dir="/lakehouse/default/Files/gx")
para recuperar o contexto.
Conteúdo relacionado
Faça o check-out de outros tutoriais sobre link semântico / SemPy:
- Tutorial: Limpar dados com dependências funcionais
- Tutorial: Analisar dependências funcionais em um modelo semântico de exemplo
- Tutorial: Extrair e calcular medidas do Power BI por meio de um notebook do Jupyter
- Tutorial: Descobrir relações em um modelo semântico usando o link semântico
- Tutorial: Descobrir relacionamentos no conjunto de dados Synthea utilizando o link semântico