מדריך ציפיות גדולות: אימות נתונים עם פייתון

איכות הנתונים והעקיפה הם כמו היסוד של בית – ללא בסיס יציב, הכל שנבנה עליו סופג סכנת התמוטטות. זהו המקום בו האימות של הנתונים משחק תפקיד חשוב. אימות הנתונים עוזר לך לוודא שהנתונים שלך מדויקים, עקביים ואמינים.

Great Expectations היא כלי לאימות הנתונים מקור פתוח שמאפשר לך לזהות בעיות בנתונים במוקד ומבטיח שהנתונים שלך עומדים בתקני איכות הנדרשים.

במדריך זה, אנחנו נלמד איך להשתמש ב-Great Expectations לאימות הנתונים, עם דוגמה מעשית מראשיתו ועד סופה כדי לעזור לך להתחיל!

מהו Great Expectations?

Great Expectations (GX) הוא מרכז פתוח המפורסם עבור ניהול ואוטומציה של אימות הנתונים ב־מערכות נתונים מודרניות.

הגישה המבוססת על Python מיועדת לעזור לצוותי נתונים לוודא את איכותם והעקביות של הנתונים שלהם. המשתמשים יכולים להגדיר "ציפיות" – כללים או בדיקות שתיארו מה צריך להיראות הנתונים התקפים, שבודקים באופן אוטומטי האם הנתונים עומדים בתקנים אלה.

חלק מיתרונות Great Expectations כוללים:

  • אימות נתונים אוטומטי – Great Expectations מאפשרת את התהליך האוטומטי של אימות נתונים, ובכך מפחיתה את המאמץ הידני וממזערת את סיכון השגיאות. היא מבטיחה כי הנתונים יעמדו בתקנים שהוגדרו מראש באופן עקבי.
  • אינטגרציה עם צינורות נתונים – הוא משתלב בקלות עם מקורות נתונים שונים ופלטפורמות, כולל בסיסי נתונים SQL, אחסון בענן, וכלי ETL, מאפשר בדיקת תקינות נתונים בשלבים שונים של הצינור.
  • תוצאות אימות ברורות ופעולתיות – הכלי מספק תוצאות אימות שקופות, מה שהופך קל לזהות בעיות באיכות הנתונים ולטפל בהן מהר.
  • תיעוד נתונים – Great Expectations יכול ליצור תיעוד מפורט ונגיש של תהליכי אימות הנתונים שלך, עוזר לצוותים ליישם סטנדרטים של איכות ומספק התיעוד כקישור לשימושים עתידיים.
  • קידמות וגמישות – ככלי קוד פתוח, Great Expectations הוא ניתן להתאמה אישית ויכול להתרחב עם צרכי אימות הנתונים שלך, מציע גמישות להתאמה למגוון תרחישי שימוש ללא עלויות גבוהות.

עכשיו, בואו נצפה בדוגמה מתחילה עד סוף!

התקנת Great Expectations

במדריך הזה, תלמד איך להשתמש בGX Core, הגרסה הקוד הפתוח של Great Expectations, כדי לאמת DataFrame של Pandas. נעבור על הגדרת הקשר, רישום מקור נתונים של Pandas, הגדרת ציפיות, ואימות קבוצות נתונים.

הערה: מומלץ לעקוב אחרי מחברת DataLab, אבל אתה יכול גם ליצור סקריפט פייתון משלך.

דרישות מקדימות

  • פייתון 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 לנתונים שלך, בעוד נכס נתונים מייצג תת קבוצה ספציפית של נתונים (לדוגמה, טבלה, DataFrame או קובץ).

במקרה זה, נכין הכול כדי להתחבר ל-DataFrame בשם inventory_parts_df. קבצי הדגמה זמינים ב-DataLab שסופק, והם נוצרים פעם שנפעיל את בלוק ה-SQL:

אם אינך משתמש ב-DataLab, צרי DataFrame משלך עם נתוני דוגמה.

כעת, צרי מקור נתונים ונכס:

# הוסף מקור נתונים של Pandas data_source = context.data_sources.add_pandas(name="inventory_parts") # הוסף נכס נתונים למקור הנתונים data_asset = data_source.add_dataframe_asset(name="inventory_parts_asset")

הגדרת אצווה מזהה ומארגנת את הנתונים שלך לצורך אימות. כאן, אנחנו מוסיפים הגדרת אצווה שמכסה את כל ה-DataFrame:

קביעת שם להגדרת הצטברות batch_definition_name = "inventory_parts_batch" # הוסף את ההגדרת הצטברות batch_definition = data_asset.add_batch_definition_whole_dataframe(batch_definition_name) assert batch_definition.name == batch_definition_name

צטברות היא אוסף של נתונים הקשור להגדרת צטברות. כדי לאמת את הנתונים, עליך לאחזר ולקשר את הצטברות ל-DataFrame שלך, במקרה זה inventory_parts_df:

# הגדרת פרמטרים לצטברות batch_parameters = {"dataframe": inventory_parts_df} # אחזור את הצטברות batch = batch_definition.get_batch(batch_parameters=batch_parameters)

ציפיות הן כללים לאימות נתונים. בדוגמה זו, נגדיר את הציפיות הפשוטות הבאות:

  1. הבטח כי ערכי inventory_id אינם ריקים.
  2. הבטח כי ערכי part_num הם ייחודיים.
צור יחידת ציפיות expectation_suite_name = "inventory_parts_suite" suite = gx.ExpectationSuite(name=expectation_suite_name) הוסף ציפיות suite.add_expectation( gx.expectations.ExpectColumnValuesToNotBeNull(column="inventory_id") ) suite.add_expectation( gx.expectations.ExpectColumnValuesToBeUnique(column="part_num") ) הוסף את יחידת הציפיות להקשר context.suites.add(suite)

ניתן לחקור את כל הציפיות הזמינות ב-גלריית הציפיות. אנו ממליצים להוסיף עוד כמה!

לאחר הגדרת הציפיות, GX מייצא את התצורה של יחידת הציפיות:

{ "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. שם ומזהה של היחידה: שם ייחודי (inventory_parts_suite) ומזהה למעקב וניהול היחידה.
  2. ציפיות: כל כלל מפרט:
    • סוג הבדיקה (לדוגמה, הבטחה שיש בעמודה ערכים לא ריקים או ערכים ייחודיים).
    • פרמטרים, כגון העמודה שמובאת לוודא.
    • מטא-נתונים וזיהוי ייחודי לכל ציפייה, המאפשרים מעקב קל והתאמות.
  3. מטא-נתונים: מידע גרסה עבור Great Expectations, הבטיחות תאימות עם הכלי.
  4. הערות: מציין מקום להוספת הערות תיאוריות על האוסף (אופציונלי).

הפלט המובנה הזה משמש גם כתיעוד וכהגדרת תצפיות חוזרות לאימות האוסף שלך כך שהציפיות שלך מוגדרות באופן ברור, נעקב ומוכנות לשימוש עתידי.

5. אימות הנתונים

לבסוף, עליכם לאמת את המצעד לפי הצפיות המוגדרות ולשקול את התוצאות.

# אימות הנתונים לפי האוסף validation_results = batch.validate(suite) # שלב הערכת התוצאות 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% נכשלו. ציפייה שנכשלה מציינת בעיה באיכות הנתונים שדורשת תשומת לב. במקרה זה, עמודה אחת לא עמדה בכלל המוגדר.

ציפייה 1: inventory_id צריך לא לכלול ערכים חסרים

  • תוצאה: עבר
  • הסבר: כל הערכים בעמודת inventory_id קיימים, ללא ערכים חסרים או null. זה מציין שלמות נתונים טובה עבור עמודה זו.

ציפייה 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 # הגדר משימה כדי להפעיל אימות Great Expectations @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]) # בדוק את תוצאות האימות והעלה התראה אם האימות נכשל if not results["success"]: raise ValueError("Data validation failed!") # הגדר את זרימת ה-ETL שלך with Flow("ETL_with_GE_Validation") as flow: validation = validate_data() # בצע את הזרימה 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 גדר את DAG והגדר את הזמנים כך שירוץ באופן יומי default_args = { 'owner': 'airflow', 'start_date': datetime(2024, 1, 1), 'retries': 1, } dag = DAG( 'great_expectations_validation', default_args=default_args, schedule_interval='@daily', # רץ פעם ביום ) גדר את הפונקציה שתרוץ את האימות 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 קבע את המשימה ב-Airflow validation_task = PythonOperator( task_id='run_great_expectations_validation', python_callable=run_validation, dag=dag, ) קבע את המשימה ב-DAG validation_task

בדוגמה זו, אנו מגדירים DAG שמתזמן להרצה של אימות פעם ביום (@daily)

הפונקציה run_validation() מבצעת את האימות על ידי טעינת ההקשר של Great Expectations והרצת ערכי הציפיות שהוגדרו נגד הנתונים.

Best Practices לאימות נתונים עם Great Expectations

עקוב אחרי פרקטיקות המומלצות תמיד הן הכי טובות לכלכלה ויעילות, וזה לא שונה גם לאימות נתונים עם Great Expectations.

התחילו בצעדים קטנים והתקדמו

התחילו עם בדיקות איכות נתונים בסיסיות והרחיבו בהדרגה. עדיף להתמקד בציפיות בסיסיות בתחילה, שכן זה עוזר להימנע מהפיכת התהליך למורכב מדי, מה שמקל על ההשתלבות ועל פתרון בעיות. כאשר ההבנה שלכם של מערך הנתונים משתפרת, תוכלו להוסיף בדיקות יותר מורכבות.

שיתופי פעולה בין צוותים

איכות הנתונים אינה רק עניין טכני. שיתוף פעולה בין צוותים עסקיים כדי להגדיר ציפיות ולהבטיח שהאימות המיושם תואם את הלוגיקה העסקית והיעדים הבסיסיים. גישה בין-תחומית זו מבטיחה שהנתונים ישרתו את מטרתם המיועדת ויעמדו בדרישות של כל בעלי העניין.

אוטומטו היכן שאפשר

אוטומטו את התהליך בכל מקום שבו זה אפשרי כדי לשלב את אימות הנתונים בצינורות הנתונים. שילוב בדיקות אימות אוטומטיות מאפשר ניטור רציף של איכות הנתונים ללא התערבות ידנית, מה שמשפר משמעותית את היעילות.

סיכום

עבודה מעולה! למדת כיצד לקבוע ולאמת נתונים ב-Great Expectations. טכניקות אלו יסייעו לשמור על איכות נתונים גבוהה ושקיפות בעבודות שלך.

כדי להמשיך לפתח את המיומנויות שלך, עיין במשאבים הללו:

Source:
https://www.datacamp.com/tutorial/great-expectations-tutorial