著者は、 Diversity in Tech Fund を選択して、 Write forDOnationsプログラムの一環として寄付を受け取りました。

序章

このチュートリアルでは、Pythonで記述されたオープンソースのデータ検証およびドキュメントライブラリである GreatExpectationsのローカルデプロイメントを設定します。 データ検証は、パイプラインで処理するデータが正しく、誤った入力や変換のバグなどのエラーが原因で発生する可能性のあるデータ品質の問題がないことを確認するために重要です。 Great Expectationsを使用すると、 Expectations と呼ばれるデータに関するアサーションを確立し、それらのExpectationsを使用してデータを検証できます。

終了すると、Great Expectationsをデータに接続し、一連のExpectationsを作成し、それらのExpectationsを使用してデータのバッチを検証し、検証結果を含むデータ品質レポートを生成できるようになります。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • Python3.6以降のローカル開発環境。 このシリーズのオペレーティングシステムのチュートリアルに従うことができます: Python3のローカルプログラミング環境をインストールおよびセットアップする方法。 ブラウザへの接続に関する問題を回避するために、ローカルプログラミング環境を使用することをお勧めします。
  • Pythonにある程度精通している。 詳細については、 PythoneBookでのコーディング方法をご覧ください。
  • Jupyterノートブックにある程度精通していること。
  • Gitの動作中のインストール。
  • FirefoxChromeなどのWebブラウザ。

ステップ1—大きな期待をインストールして大きな期待プロジェクトを初期化する

このステップでは、ローカルPython環境にGreat Expectationsパッケージをインストールし、このチュートリアルで使用するサンプルデータをダウンロードして、GreatExpectationsプロジェクトを初期化します。

まず、ターミナルを開き、仮想Python環境をアクティブ化してください。 次のコマンドを使用して、Great Expectations Pythonパッケージとコマンドラインツール(CLI)をインストールします。

  1. pip install great_expectations==0.13.35

:このチュートリアルは、Great Expectationsバージョン0.13.35用に開発されたものであり、他のバージョンには適用できない場合があります。

サンプルデータリポジトリにアクセスするには、次のgitコマンドを実行してディレクトリのクローンを作成し、作業ディレクトリとしてそのディレクトリに変更します。

  1. git clone https://github.com/do-community/great_expectations_tutorial
  2. cd great_expectations_tutorial

リポジトリには、dataというフォルダが1つだけ含まれています。このフォルダには、このチュートリアルで使用するデータを含む2つのCSVファイルの例が含まれています。 dataディレクトリの内容を見てください。

  1. ls data

次の出力が表示されます。

Output
yellow_tripdata_sample_2019-01.csv yellow_tripdata_sample_2019-02.csv

Great Expectationsは、リレーショナルデータベース、Sparkデータフレーム、さまざまなファイル形式への接続など、さまざまな種類のデータで機能します。 このチュートリアルでは、タクシーの乗車データの小さなセットを含むこれらのCSVファイルを使用して開始します。

最後に、次のコマンドを実行して、ディレクトリをGreatExpectationsプロジェクトとして初期化します。 必ず--v3-apiフラグを使用してください。これにより、パッケージの最新のAPIを使用するように切り替わります。

  1. great_expectations --v3-api init

OK to proceed? [Y/n]:と尋ねられたら、ENTERを押して続行します。

これにより、great_expectationsというフォルダーが作成されます。このフォルダーには、データコンテキストとも呼ばれるGreatExpectationsプロジェクトの基本構成が含まれています。 フォルダの内容を調べることができます:

  1. ls great_expectations

great_expectationsフォルダー内に作成された最初のレベルのファイルとサブディレクトリが表示されます。

Output
checkpoints great_expectations.yml plugins expectations notebooks uncommitted

フォルダには、大いなる期待の設定に関連するすべてのコンテンツが保存されます。 great_expectations.ymlファイルには、すべての重要な構成情報が含まれています。 チュートリアルの次のステップに進む前に、フォルダーと構成ファイルをもう少し詳しく調べてください。

次のステップでは、データソースを追加して、データに大きな期待を向けます。

ステップ2—データソースを追加する

このステップでは、大きな期待でデータソースを構成します。これにより、 Expectations と呼ばれるデータアサーションを自動的に作成し、ツールを使用してデータを検証できます。

プロジェクトディレクトリにいる間に、次のコマンドを実行します。

  1. great_expectations --v3-api datasource new

次の出力が表示されます。 dataディレクトリのファイルベースのデータソースを構成するように求められたときに表示されるオプションを入力します。

Output
What data would you like Great Expectations to connect to? 1. Files on a filesystem (for processing with Pandas or Spark) 2. Relational database (SQL) : 1 What are you processing your files with? 1. Pandas 2. PySpark : 1 Enter the path of the root directory where the data files are stored. If files are on local disk enter a path relative to your current working directory or an absolute path. : data

ENTERでディレクトリパスを確認した後、GreatExpectationsはWebブラウザでJupyterノートブックを開きます。これにより、データソースの構成を完了し、データコンテキストに保存できます。 次のスクリーンショットは、ノートブックの最初のいくつかのセルを示しています。

Screenshot of a Jupyter notebook

ノートブックには、データソースを構成するためのPythonコードの事前入力されたセルがいくつか含まれています。 必要に応じて、名前などのデータソースの設定を変更できます。 ただし、このチュートリアルでは、すべてをそのままにして、Cell > Run Allメニューオプションを使用してすべてのセルを実行します。 正常に実行されると、最後のセル出力は次のようになります。

Output
[{'data_connectors': {'default_inferred_data_connector_name': {'module_name': 'great_expectations.datasource.data_connector', 'base_directory': '../data', 'class_name': 'InferredAssetFilesystemDataConnector', 'default_regex': {'group_names': ['data_asset_name'], 'pattern': '(.*)'}}, 'default_runtime_data_connector_name': {'module_name': 'great_expectations.datasource.data_connector', 'class_name': 'RuntimeDataConnector', 'batch_identifiers': ['default_identifier_name']}}, 'module_name': 'great_expectations.datasource', 'class_name': 'Datasource', 'execution_engine': {'module_name': 'great_expectations.execution_engine', 'class_name': 'PandasExecutionEngine'}, 'name': 'my_datasource'}]

これは、my_datasourceという新しいデータソースをデータコンテキストに追加したことを示しています。 次の手順に進む前に、ノートブックの説明を読んで、さまざまな構成オプションの詳細を確認してください。

警告:先に進む前に、ノートブックのブラウザタブを閉じて端末に戻り、CTRL+Cを押して実行中のノートブックサーバーをシャットダウンしてから続行してください。

これで、dataディレクトリを指すデータソースが正常に設定されました。これにより、大きな期待を介してディレクトリ内のCSVファイルにアクセスできるようになります。 次のステップでは、データソースでこれらのCSVファイルの1つを使用して、プロファイラーで期待値を自動的に生成します。

ステップ3—自動プロファイラーを使用したExpectationSuiteの作成

チュートリアルのこのステップでは、組み込みのプロファイラーを使用して、いくつかの既存のデータに基づいて一連の期待値を作成します。 この目的のために、ダウンロードしたサンプルデータを詳しく見てみましょう。

  • ファイルyellow_tripdata_sample_2019-01.csvyellow_tripdata_sample_2019-02.csvには、それぞれ2019年1月と2月のタクシー乗車データが含まれています。
  • このチュートリアルでは、1月のデータが正しいことを知っており、後続のデータファイルが数または行、列、および特定の列値の分布に関して1月のデータと一致することを確認する必要があることを前提としています。

この目的のために、1月のデータの特定のプロパティに基づいて期待値(データアサーション)を作成し、後のステップでそれらの期待値を使用して2月のデータを検証します。 一緒にグループ化された一連のExpectationsであるExpectationSuiteを作成することから始めましょう。

  1. great_expectations --v3-api suite new

以下の出力に示されているオプションを選択することにより、yellow_tripdata_sample_2019-01.csvデータファイルを入力として使用して、プロファイラーを使用して期待値を自動的に生成することを指定します。 プロンプトが表示されたらExpectationSuite名として名前my_suiteを入力し、Would you like to proceed? [Y/n]が表示されたら最後にENTERを押します。

Output
Using v3 (Batch Request) API How would you like to create your Expectation Suite? 1. Manually, without interacting with a sample batch of data (default) 2. Interactively, with a sample batch of data 3. Automatically, using a profiler : 3 A batch of data is required to edit the suite - let's help you to specify it. Which data asset (accessible by data connector "my_datasource_example_data_connector") would you like to use? 1. yellow_tripdata_sample_2019-01.csv 2. yellow_tripdata_sample_2019-02.csv : 1 Name the new Expectation Suite [yellow_tripdata_sample_2019-01.csv.warning]: my_suite When you run this notebook, Great Expectations will store these expectations in a new Expectation Suite "my_suite" here: <path_to_project>/great_expectations_tutorial/great_expectations/expectations/my_suite.json Would you like to proceed? [Y/n]: <press ENTER>

これにより、ExpectationSuiteの構成を完了することができる別のJupyterノートブックが開きます。 ノートブックには、組み込みのプロファイラーを構成するためのかなりの量のコードが含まれています。プロファイラーは、選択したCSVファイルを確認し、データで検出された内容に基づいて、ファイルの各列に特定のタイプの期待値を作成します。

ignored_columnsのリストが含まれているノートブックの2番目のコードセルまで下にスクロールします。 デフォルトでは、プロファイラーはすべての列を無視するので、プロファイラーがそれらの期待値を作成することを確認するために、それらのいくつかをコメントアウトしましょう。 次のようにコードを変更します。

ignored_columns = [
#     "vendor_id"
# ,    "pickup_datetime"
# ,    "dropoff_datetime"
# ,    "passenger_count"
    "trip_distance"
,    "rate_code_id"
,    "store_and_fwd_flag"
,    "pickup_location_id"
,    "dropoff_location_id"
,    "payment_type"
,    "fare_amount"
,    "extra"
,    "mta_tax"
,    "tip_amount"
,    "tolls_amount"
,    "improvement_surcharge"
,    "total_amount"
,    "congestion_surcharge"
,]

"trip_distance"の前のカンマを必ず削除してください。 列vendor_idpickup_datetimedropoff_datetime、およびpassenger_countをコメントアウトすることにより、これらの列の期待値を生成するようにプロファイラーに指示します。 さらに、プロファイラーは、データ内の列の数と名前、行の数など、テーブルレベルの期待値も生成します。 もう一度、Cell > Run Allメニューオプションを使用して、ノートブックのすべてのセルを実行します。

このノートブックのすべてのセルを実行すると、次の2つのことが起こります。

  1. このコードは、自動プロファイラーと、使用するように指示したyellow_tripdata_sample_2019-01.csvファイルを使用してExpectationSuiteを作成します。
  2. ノートブックの最後のセルも、検証を実行し、データ品質レポートである DataDocsを使用して新しいブラウザーウィンドウを開くように構成されています。

次のステップでは、新しいブラウザウィンドウで開いたデータドキュメントを詳しく見ていきます。

ステップ4—データドキュメントの調査

チュートリアルのこのステップでは、大きな期待が生成したデータドキュメントを調べ、さまざまな情報を解釈する方法を学習します。 開いたばかりのブラウザウィンドウに移動し、下のスクリーンショットに示されているページを確認します。

Screenshot of Data Docs

ページの上部に、概要というタイトルのボックスが表示されます。このボックスには、新しく作成したExpectation Suitemy_suiteを使用して実行した検証に関する情報が含まれています。 Status: Succeededが表示され、実行された期待値の数に関する基本的な統計が表示されます。 さらに下にスクロールすると、テーブルレベルの期待値というタイトルのセクションが表示されます。 これには、2行の期待値が含まれ、各行のステータス、期待値、および観測値が表示されます。 [期待値]の表の下に、ノートブックでコメントアウトした各列の列レベルの期待値が表示されます。

1つの特定の期待値に焦点を当てましょう。passenger_count列には、「値はこのセットに属している必要があります:1 2 3 4 5 6」という期待値があります。 これは緑色のチェックマークでマークされており、観測値は「0% unexpected」です。 これは、プロファイラーが1月のCSVファイルのpassenger_count列の値を調べ、1〜6の値のみを検出したことを示しています。つまり、すべてのタクシーの乗客は1〜6人でした。 その後、大きな期待がこの事実への期待を生み出しました。 次に、ノートブックの最後のセルが1月のCSVファイルの検証をトリガーし、予期しない値は検出されませんでした。 期待値を作成するために使用されたのと同じデータが検証に使用されたデータでもあったため、これは不思議なことに真実です。

このステップでは、データドキュメントを確認し、passenger_count列の期待値を確認しました。 次のステップでは、データの別のバッチを検証する方法を確認します。

ステップ5—チェックポイントの作成と検証の実行

このチュートリアルの最後のステップでは、Expectation Suiteとデータのバッチをバンドルして、そのデータの検証を実行する新しいチェックポイントを作成します。 チェックポイントを作成したら、それを実行して2月のタクシーデータCSVファイルを検証し、ファイルが以前に作成した期待値に合格したかどうかを確認します。 開始するには、ターミナルに戻り、Jupyterノートブックがまだ実行されている場合は、CTRL+Cを押して停止します。 次のコマンドは、my_checkpointという新しいチェックポイントを作成するワークフローを開始します。

  1. great_expectations --v3-api checkpoint new my_checkpoint

これにより、チェックポイントを構成するための事前入力されたコードを含むJupyterノートブックが開きます。 ノートブックの2番目のコードセルには、既存のデータソースからランダムにdata_asset_nameが事前入力されます。これは、前に見たdataディレクトリにある2つのCSVファイルの1つです。 data_asset_nameyellow_tripdata_sample_2019-02.csvであることを確認し、必要に応じてコードを変更して正しいファイル名を使用してください。

my_checkpoint_name = "my_checkpoint" # This was populated from your CLI command.

yaml_config = f"""
name: {my_checkpoint_name}
config_version: 1.0
class_name: SimpleCheckpoint
run_name_template: "%Y%m%d-%H%M%S-my-run-name-template"
validations:
  - batch_request:
      datasource_name: my_datasource
      data_connector_name: default_inferred_data_connector_name
      data_asset_name: yellow_tripdata_sample_2019-02.csv
      data_connector_query:
        index: -1
    expectation_suite_name: my_suite
"""
print(yaml_config)
"""

この構成スニペットは、データアセットyellow_tripdata_sample_2019-02.csv、つまり2月のCSVファイルを読み取り、Expectation Suitemy_suiteを使用して検証する新しいチェックポイントを構成します。 コードを正しく変更したことを確認してから、ノートブックのすべてのセルを実行します。 これにより、新しいチェックポイントがデータコンテキストに保存されます。

最後に、この新しいチェックポイントを実行して2月のデータを検証するには、ノートブックの最後のセルまでスクロールダウンします。 セル内のコードのコメントを解除して、次のようにします。

context.run_checkpoint(checkpoint_name=my_checkpoint_name)
context.open_data_docs()

セルを選択し、Cell > Run CellsメニューオプションまたはSHIFT+ENTERキーボードショートカットを使用して実行します。 これにより、新しいブラウザタブでデータドキュメントが開きます。

[検証結果の概要]ページで、一番上の実行をクリックして、[検証結果の詳細]ページに移動します。 検証結果の詳細ページは、前の手順で表示したページと非常によく似ていますが、Expectation Suiteが失敗し、新しいCSVファイルを検証していることが示されます。 ページをスクロールして、どの期待値の横に赤いXが付いているかを確認し、失敗としてマークします。

前の手順で確認したpassenger_count列で期待値を見つけます:「値はこのセットに属している必要があります:1 2 3 4 5 6」。 失敗として表示され、1579 unexpected values found. ≈15.79% of 10000 total rowsが強調表示されます。 この行には、列で見つかった予期しない値のサンプル、つまり値0も表示されます。 これは、2月のタクシー乗車データがpassenger_counts列のように、予期しない値0を突然導入したことを意味します。これは、潜在的なデータバグのようです。 チェックポイントを実行することにより、Expectation Suiteで新しいデータを検証し、この問題を検出しました。

最後のノートブックセルでrun_checkpointメソッドを実行するたびに、別の検証実行を開始することに注意してください。 本番データパイプライン環境では、新しいデータバッチを処理するたびに、ノートブックの外部でrun_checkpointコマンドを呼び出して、新しいデータがすべての検証に合格するようにします。

結論

この記事では、データ検証のためのGreatExpectationsフレームワークの最初のローカルデプロイメントを作成しました。 Great Expectationsデータコンテキストを初期化し、新しいファイルベースのデータソースを作成し、組み込みのプロファイラーを使用してExpectationSuiteを自動的に生成しました。 次に、データの新しいバッチに対して検証を実行するためのチェックポイントを作成し、データドキュメントを検査して検証結果を表示しました。

このチュートリアルでは、大きな期待の基本のみを説明しました。 このパッケージには、リレーショナルデータベースなどの他のタイプのデータに接続するようにデータソースを構成するためのオプションがさらに含まれています。 また、テーブル名またはファイル名のパターンマッチングに基づいてデータの新しいバッチを自動的に認識する強力なメカニズムが付属しているため、チェックポイントを1回だけ構成して、将来のデータ入力を検証できます。 Great Expectationsの詳細については、公式ドキュメントをご覧ください。