10 تکخطی مفید پایتون برای پاکسازی دادهها
10 وان لاینر پایتون برای پاکسازی دادهها..!
هنگام کار با هر مجموعه دادهای، پاکسازی دادهها برای دستیابی به اطلاعاتی قابل تحلیل ضروری است. مشکلات رایج کیفیت داده شامل دادههای تکراری، فرمتهای نادرست، مقادیر خارج از محدوده و دادههای گمشده هستند.
در این مقاله از وبسایت آی کد آکادمی، به برخی از تکخطیهای مفید پایتون برای انجام کارهای رایج پاکسازی دادهها میپردازیم. این آموزش بر تکخطیهای پایتون برای پاکسازی دادهها تمرکز دارد و ما با یک مجموعه داده نمونه کار خواهیم کرد.
برای دنبال کردن راحت این آموزش، بهتر است با مفهومهای لیست و دیکشنری در پایتون آشنا باشید. بیایید شروع کنیم.
تولید داده نمونه
ابتدا یک مجموعه داده نمونه تولید میکنیم:
data = [
{"name": "alice smith", "age": 30, "email": "alice@example.com", "salary": 50000.00, "join_date": "2022-03-15"},
{"name": "bob gray", "age": 17, "email": "bob@not-an-email", "salary": 60000.00, "join_date": "invalid-date"},
{"name": "charlie brown", "age": None, "email": "charlie@example.com", "salary": -1500.00, "join_date": "15-09-2022"},
{"name": "dave davis", "age": 45, "email": "dave@example.com", "salary": 70000.00, "join_date": "2021-07-01"},
{"name": "eve green", "age": 25, "email": "eve@example.com", "salary": None, "join_date": "2023-12-31"},
]
حالا بیایید کدهایی برای رفع مشکلات موجود در این داده نمونه بنویسیم.
1. استانداردسازی رشتهها (حروف بزرگ کردن)
حفظ یکنواختی در فرمت رشتهها در سراسر مجموعه داده اهمیت زیادی دارد. بیایید نامها را بهصورت استاندارد با حروف بزرگ در ابتدای کلمات تنظیم کنیم:
# Capitalizing the names for consistency
data = [{**d, "name": d["name"].title()} for d in data]
این تکخطی با استفاده از متد title()، حروف ابتدایی هر کلمه در نامها را بزرگ میکند تا یکنواختی در دادهها ایجاد شود.
2. تبدیل نوع دادهها
اطمینان از یکنواختی و صحت نوع دادهها در مجموعه داده برای تحلیل دقیق ضروری است. در داده نمونه، بیایید سنین را به نوع داده عدد صحیح تبدیل کنیم:
# Converting age to an integer type, defaulting to 25 if conversion fails
data = [{**d, "age": int(d["age"]) if isinstance(d["age"], (int, float)) else 25} for d in data]
این کد بررسی میکند که آیا مقدار age یک عدد (صحیح یا اعشاری) است یا خیر. اگر عدد باشد، آن را به عدد صحیح تبدیل میکند؛ در غیر این صورت، مقدار پیشفرض 25 را اختصاص میدهد.
3. اعتبارسنجی محدوده عددی
مهم است که اطمینان حاصل کنیم مقادیر عددی در محدودههای قابل قبول قرار دارند. بیایید بررسی کنیم که سنین در محدوده 18 تا 60 سال باشند و در غیر این صورت، مقدار پیشفرض را اختصاص دهیم:
# Ensuring age is an integer within the range of 18 to 60; otherwise, set to 25
data = [{**d, "age": d["age"] if isinstance(d["age"], int) and 18 <= d["age"] <= 60 else 25} for d in data]
این تکخطی اطمینان میدهد که سن یک عدد صحیح در محدوده 18 تا 60 است. اگر شرط برقرار نباشد، مقدار 25 را تنظیم میکند.
4. اعتبارسنجی ایمیل
ناسازگاریهای فرمت در فیلدهای متنی بسیار رایج هستند. کد زیر بررسی میکند که آدرسهای ایمیل معتبر باشند و موارد نامعتبر را با یک ایمیل پیشفرض جایگزین میکند:
# Verifying that the email contains both an "@" and a ".";
# assigning 'invalid@example.com' if the format is incorrect
data = [{**d, "email": d["email"] if "@" in d["email"] and "." in d["email"] else "invalid@example.com"} for d in data]
این کد بررسی میکند که آیا ایمیل شامل کاراکترهای @ و . است یا خیر. اگر این شرایط برقرار نباشد، ایمیل به invalid@example.com تغییر میکند.
5. مدیریت مقادیر گمشده
مقادیر گمشده یکی دیگر از مشکلات رایج در اکثر مجموعههای داده هستند. در اینجا، مقادیر گمشده حقوق را با یک مقدار پیشفرض جایگزین میکنیم:
# Assigning a default salary of 30,000 if the salary is missing
data = [{**d, "salary": d["salary"] if d["salary"] is not None else 30000.00} for d in data]
این تکخطی بررسی میکند که آیا مقدار salary وجود دارد یا خیر. اگر وجود نداشته باشد، مقدار پیشفرض 30000.00 را اختصاص میدهد.
6. استانداردسازی فرمت تاریخ
در مورد تاریخها و زمانها، داشتن فرمت یکسان برای همه آنها بسیار مهم است. در اینجا، فرمتهای مختلف تاریخ را به یک فرمت واحد تبدیل میکنیم و برای ورودیهای نامعتبر یک مقدار پیشفرض تعیین میکنیم:
from datetime import datetime
# Attempting to convert the date to a standardized format and defaulting to '2023-01-01' if invalid
data = [{**d, "join_date": (lambda x: (datetime.strptime(x, '%Y-%m-%d').date() if '-' in x and len(x) == 10 else datetime.strptime(x, '%d-%m-%Y').date()) if x and 'invalid-date' not in x else '2023-01-01')(d['join_date'])} for d in data]
اگرچه این کد کار میکند، اما ممکن است خواندن آن دشوار باشد. بهتر است این فرآیند را به چند مرحله تقسیم کنیم. برای اطلاعات بیشتر، مقاله «چرا نباید از لیستهای فشرده بیش از حد در پایتون استفاده کرد» را مطالعه کنید تا بدانید چرا نباید خوانایی و نگهداری کد را فدای استفاده از لیستهای فشرده کرد.
7. حذف مقادیر منفی
گاهی اوقات نیاز است اطمینان حاصل کنیم که برخی فیلدهای عددی فقط مقادیر غیرمنفی داشته باشند، مانند سن یا حقوق. به عنوان مثال، میتوانیم مقادیر منفی حقوق را با صفر جایگزین کنیم:
# Replacing negative salary values with zero to ensure all values are non-negative
data = [{**d, "salary": max(d["salary"], 0)} for d in data]
این تکخطی اطمینان میدهد که مقادیر حقوق منفی با صفر جایگزین شوند تا همه مقادیر غیرمنفی باشند.
8. بررسی دادههای تکراری
حذف رکوردهای تکراری قبل از تحلیل بیشتر مجموعه داده مهم است. بیایید اطمینان حاصل کنیم که فقط رکوردهای منحصربهفرد باقی میمانند با بررسی نامهای تکراری:
# Keeping only unique entries based on the name field
data = {tuple(d.items()) for d in data} # Using a set to remove duplicates
data = [dict(t) for t in data] # Converting back to list of dictionaries
این کد با تبدیل دادهها به مجموعهای از تاپلها، رکوردهای تکراری را بر اساس فیلد name حذف میکند و سپس آن را به لیست دیکشنریها بازمیگرداند.
9. مقیاسبندی مقادیر عددی
مقیاسبندی مقادیر عددی گاهی اوقات به تحلیل یکنواخت کمک میکند. بیایید حقوقها را به درصد حداکثر حقوق در مجموعه داده مقیاسبندی کنیم:
# Normalizing salary values to a percentage of the maximum salary
max_salary = max(d["salary"] for d in data)
data = [{**d, "salary": (d["salary"] / max_salary * 100) if max_salary > 0 else 0} for d in data]
این تکخطی حقوقها را به درصد حداکثر حقوق نرمالسازی میکند تا تحلیل دادهها سادهتر شود.
10. حذف فاصلههای اضافی
گاهی اوقات نیاز است فاصلههای اضافی از رشتهها حذف شوند. در اینجا یک تکخطی برای حذف فاصلههای ابتدایی و انتهایی از رشتههای نام ارائه شده است:
# Trimming whitespace from names for cleaner data
data = [{**d, "name": d["name"].strip()} for d in data]
این کد فاصلههای اضافی را از نامها حذف میکند تا دادهها تمیزتر شوند.
نتیجهگیری
پس از اجرای مراحل پاکسازی داده، دیکشنری داده به این شکل خواهد بود:
[
{'name': 'Bob Gray',
'age': 25,
'email': 'invalid@example.com',
'salary': 85.71428571428571,
'join_date': '2023-01-01'},
{'name': 'Alice Smith',
'age': 30,
'email': 'alice@example.com',
'salary': 71.42857142857143,
'join_date': datetime.date(2022, 3, 15)},
{'name': 'Charlie Brown',
'age': 25,
'email': 'charlie@example.com',
'salary': 0.0,
'join_date': datetime.date(2022, 9, 21)},
{'name': 'Dave Davis',
'age': 45,
'email': 'dave@example.com',
'salary': 100.0,
'join_date': datetime.date(2021, 7, 1)},
{'name': 'Eve Green',
'age': 25,
'email': 'eve@example.com',
'salary': 42.857142857142854,
'join_date': datetime.date(2023, 12, 31)}
]
جمعبندی
در این آموزش، به مشکلات رایج کیفیت داده و تکخطیهای پایتون برای پاکسازی یک مجموعه داده نمونه پرداختیم. این تکخطیها میتوانند هنگام نیاز به پاکسازی ساده و سریع دادهها و شروع تحلیل بسیار مفید باشند. اگر به دنبال یک دوره کامل برای شروع تحلیل داده هستید پیشنهاد میکنم دوره کامل تحلیل داده با آقای ربات رو چک کنید.
پاکسازی داده بهتون خوش بگذره!
دیدگاهتان را بنویسید