پاکسازی و اعتبارسنجی دادهها با استفاده از pandera

از هدر دادن زمان برای دادههای ناپاک خسته شدهاید؟ یاد بگیرید چگونه با Pandera در چند دقیقه آنها را پاکسازی کنید.
هنگام کار با دادهها، انجام بررسیهایی برای اطمینان از اینکه دادهها ناپاک یا نامعتبر نیستند — مانند بررسی مقادیر تهی، مقادیر گمشده، یا اعدادی که برای نوع ستون خاصی مجاز نیستند — بسیار مهم است. این بررسیها ضروری هستند زیرا دادههای بد میتوانند منجر به تحلیلهای اشتباه، شکست مدلها و هدر رفتن زمان و منابع شوند.
احتمالاً روش معمول پاکسازی و اعتبارسنجی دادهها با استفاده از Pandas را دیدهاید، اما در این آموزش، میخواهم ابزار بهتری به شما معرفی کنم: یک کتابخانه قدرتمند پایتون به نام Pandera. Pandera یک API انعطافپذیر و گویا برای اعتبارسنجی دادهها در اشیاء مشابه DataFrame ارائه میدهد. این روش بسیار سریعتر و مقیاسپذیرتر از بررسی دستی است. شما اساساً شِماها (schemas) را ایجاد میکنید که مشخص میکنند دادههای شما باید چگونه باشند — ساختار، نوع دادهها، قوانین و غیره. سپس Pandera دادههای شما را با این شِماها مقایسه میکند و هر چیزی که مطابق نباشد را مشخص میکند، بنابراین میتوانید مشکلات را زودتر شناسایی و برطرف کنید تا بعداً به دردسر نیفتید.
این راهنما فرض میکند که شما کمی با پایتون و Pandas آشنا هستید. بیایید مراحل استفاده از Pandera در جریانهای کاری را قدم به قدم بررسی کنیم.
نکته: برای آشنایی و تسلط بر پانداس میتوانید دوره تحلیل داده با آقای ربات را چک کنید.
مرحله ۱: آمادهسازی محیط
ابتدا باید بستههای مورد نیاز را نصب کنید:
pip install pandera pandas
پس از نصب، کتابخانههای مورد نیاز را وارد کنید و نصب را تأیید کنید:
import pandas as pd
import pandera as pa
print("pandas version:", pd.__version__)
print("pandera version:", pa.__version__)
این باید نسخههای pandas و Pandera را نمایش دهد و تأیید کند که به درستی نصب شدهاند، به این صورت:
pandas version: 2.2.2
pandera version: 0.0.0+dev0
مرحله ۲: ایجاد یک مجموعه داده نمونه
بیایید یک مجموعه داده نمونه از اطلاعات مشتریان با خطاهای عمدی ایجاد کنیم تا پاکسازی و اعتبارسنجی را نشان دهیم:
import pandas as pd
# Customer dataset with errors
data = pd.DataFrame({
"customer_id": [1, 2, 3, 4, "invalid"], # "invalid" is not an integer
"name": ["Maryam", "Jane", "", "Alice", "Bobby"], # Empty name
"age": [25, -5, 30, 45, 35], # Negative age is invalid
"email": ["mrym@gmail.com", "jane.s@yahoo.com", "invalid_email", "alice@google.com", None] # Invalid email and None
})
print("Original DataFrame:")
print(data)
خروجی:
Original DataFrame:
customer_id name age email
0 1 Maryam 25 mrym@gmail.com
1 2 Jane -5 jane.s@yahoo.com
2 3 30 invalid_email
3 4 Alice 45 alice@google.com
4 invalid Bobby 35 None
مشکلات موجود در مجموعه داده:
customer_id: شامل یک رشته (“invalid”) به جای اعداد صحیح.
name: شامل یک رشته خالی.
age: شامل مقدار منفی (-5).
email: دارای فرمت نامعتبر (invalid_email) و یک مقدار گمشده (None).
مرحله ۳: تعریف شِمای Pandera
یک شِمای Pandera ساختار و محدودیتهای مورد انتظار برای DataFrame را تعریف میکند. ما از DataFrameSchema برای مشخص کردن قوانین هر ستون استفاده میکنیم:
import pandera as pa
from pandera import Column, Check, DataFrameSchema
# Define the schema
schema = DataFrameSchema({
"customer_id": Column(
dtype="int64", # Use int64 for consistency
checks=[
Check.isin(range(1, 1000)), # IDs between 1 and 999
Check(lambda x: x > 0, element_wise=True) # IDs must be positive
],
nullable=False
),
"name": Column(
dtype="string",
checks=[
Check.str_length(min_value=1), # Names cannot be empty
Check(lambda x: x.strip() != "", element_wise=True) # No empty strings
],
nullable=False
),
"age": Column(
dtype="int64",
checks=[
Check.greater_than(0), # Age must be positive
Check.less_than_or_equal_to(120) # Age must be reasonable
],
nullable=False
),
"email": Column(
dtype="string",
checks=[
Check.str_matches(r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$") # Email regex
],
nullable=False
)
})
مرحله ۴: اعتبارسنجی اولیه
اکنون DataFrame خود را با شِما اعتبارسنجی میکنیم. Pandera متد validate را برای بررسی انطباق دادهها با شِما ارائه میدهد. با تنظیم lazy=True تمام خطاها جمعآوری میشوند:
print("\nInitial Validation:")
try:
validated_df = schema.validate(data, lazy=True)
print("Data is valid!")
print(validated_df)
except pa.errors.SchemaErrors as e:
print("Validation failed with these problems:")
print(e.failure_cases[['column', 'check', 'failure_case', 'index']])
اعتبارسنجی به دلیل مشکلات موجود در مجموعه داده با شکست مواجه میشود. پیام خطا چیزی شبیه به این خواهد بود:
Initial Validation:
Validation failed with these problems:
column check \
0 customer_id isin(range(1, 1000))
1 name str_length(1, None)
2 name
3 age greater_than(0)
4 email not_nullable
5 email str_matches('^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\....
6 customer_id dtype('int64')
7 customer_id
8 name dtype('string')
9 email dtype('string')
failure_case index
0 invalid 4
1 2
2 2
3 -5 1
4 None 4
5 invalid_email 2
6 object None
7 TypeError("'>' not supported between instances... None
8 object None
9 object None
مرحله ۵: پاکسازی دادهها
اکنون که مشکلات را شناسایی کردیم، بیایید دادهها را پاکسازی کنیم تا با شِما مطابقت داشته باشند. هر مشکل را قدم به قدم برطرف میکنیم:
customer_id: حذف ردیفهایی با شناسههای غیرعددی یا نامعتبر.
name: حذف ردیفهایی با نامهای خالی.
age: حذف ردیفهایی با سنین منفی یا غیرمعقول.
email: حذف ردیفهایی با ایمیلهای نامعتبر یا گمشده.
# Step 4: Clean the data
# Step 4a: Clean customer_id (convert to int and filter valid IDs)
data["customer_id"] = pd.to_numeric(data["customer_id"], errors="coerce") # Convert to numeric, invalid to NaN
data = data[data["customer_id"].notna()] # Remove NaNs first
data = data[data["customer_id"].isin(range(1, 1000))] # Filter valid IDs
data["customer_id"] = data["customer_id"].astype("int64") # Force int64
# Step 4b: Clean name (remove empty or whitespace-only names)
data = data[data["name"].str.strip() != ""]
data["name"] = data["name"].astype("string")
# Step 4c: Clean age (keep positive and reasonable ages)
data = data[data["age"] > 0]
data = data[data["age"] <= 120]
# Step 4d: Clean email (remove invalid or missing emails)
data = data[data["email"].notna()]
data = data[data["email"].str.match(r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$")]
data["email"] = data["email"].astype("string[python]")
# Display cleaned data
print("Cleaned DataFrame:")
print(data)
پس از پاکسازی، DataFrame باید به این شکل باشد:
Cleaned DataFrame:
customer_id name age email
0 1.0 Maryam 25 mrym@gmail.com
1 4.0 Alice 45 alice@google.com
مرحله ۶: اعتبارسنجی مجدد دادهها
بیایید DataFrame پاکسازیشده را دوباره اعتبارسنجی کنیم تا مطمئن شویم که اکنون با شِما مطابقت دارد:
print("\nFinal Validation:")
try:
validated_df = schema.validate(cleaned_data, lazy=True)
print("Cleaned data is valid!")
print(validated_df)
except pa.errors.SchemaErrors as e:
print("Validation failed after cleaning. Errors:")
print(e.failure_cases[['column', 'check', 'failure_case', 'index']])
خروجی:
Final Validation:
Cleaned data is valid!
customer_id name age email
0 1 Maryam 25 mrym@gmail.com
3 4 Alice 45 alice@google.com
اعتبارسنجی با موفقیت انجام شد و تأیید کرد که مراحل پاکسازی ما تمام مشکلات را برطرف کردهاند.
مرحله ۷: ساخت یک pipeline قابل استفاده مجدد
برای اینکه جریان کاری شما قابل استفاده مجدد باشد، میتوانید پاکسازی و اعتبارسنجی را در یک خط لوله مانند این کپسوله کنید:
def process_data(df, schema):
"""
Process and validate a DataFrame using a Pandera schema.
Args:
df: Input pandas DataFrame
schema: Pandera DataFrameSchema
Returns:
Validated and cleaned DataFrame, or None if validation fails
"""
# Create a copy for cleaning
data_clean = df.copy()
# Clean customer_id
data_clean["customer_id"] = pd.to_numeric(data_clean["customer_id"], errors="coerce")
data_clean = data_clean[data_clean["customer_id"].notna()]
data_clean = data_clean[data_clean["customer_id"].isin(range(1, 1000))]
data_clean["customer_id"] = data_clean["customer_id"].astype("int64")
# Clean name
data_clean = data_clean[data_clean["name"].str.strip() != ""]
data_clean["name"] = data_clean["name"].astype("string")
# Clean age
data_clean = data_clean[data_clean["age"] > 0]
data_clean = data_clean[data_clean["age"] <= 120]
data_clean["age"] = data_clean["age"].astype("int64")
# Clean email
data_clean = data_clean[data_clean["
خروجی:
Testing Pipeline:
Data processing successful!
Final Processed DataFrame:
customer_id name age email
0 1 Maryam 25 mrym@gmail.com
1 4 Alice 45 alice@google.com
کتابخانه Pandera میتواند برای سایر مجموعههای داده با شِمای مشابه استفاده شود.
خلاصه
کتابخانه Pandera ابزاری قدرتمند برای اطمینان از کیفیت دادهها در جریانهای کاری pandas است. با تعریف شِماها، میتوانید خطاها را زودتر شناسایی کنید، یکپارچگی را اعمال کنید و پاکسازی دادهها را خودکار کنید. در این مقاله، ما:
- کتابخانه Pandera در پایتون را نصب کردیم و یک مجموعه داده نمونه ایجاد کردیم.
- یک شِما با قوانین برای نوع دادهها و محدودیتها تعریف کردیم.
- دادهها را اعتبارسنجی کردیم و مشکلات را شناسایی کردیم.
- دادهها را پاکسازی کردیم تا با شِما مطابقت داشته باشند.
- دادههای پاکسازیشده را دوباره اعتبارسنجی کردیم.
- یک خط لوله قابل استفاده مجدد برای پردازش دادهها ساختیم.
کتابخانه Pandera در پایتون همچنین ویژگیهای پیشرفتهای برای سناریوهای اعتبارسنجی پیچیده ارائه میدهد، مانند شِماهای مبتنی بر کلاس، اعتبارسنجی بینستونی، اعتبارسنجی جزئی و غیره، که میتوانید در مستندات رسمی Pandera کاوش کنید.
دیدگاهتان را بنویسید