۳ ترفند پایتون پانداس برای تجزیه‌و‌تحلیل کارآمد داده‌ها

شکل ۱. عکس از نیک فیوینگز در Unsplash
شکل ۱. عکس از نیک فیوینگز در Unsplash
منتشر‌شده در: towardsdatascience به تاریخ ۱ می ۲۰۲۱
لینک منبع: 3 Python Pandas Tricks for Efficient Data Analysis

سرور Pandas یکی از ابزارهای تجزیه‌و‌تحلیل داده غالب است که در میان دانشمندان داده بسیار مورد توجه قرار گرفته است. این روش توابع انعطاف‌پذیر و متنوعی را برای انجام تجزیه‌و‌تحلیل کارآمد داده‌ها فراهم می‌کند. در این مقاله، ما بیش از سه ترفند را بررسی خواهیم کرد که به نظر من شما را یک کاربر راضی تبدیل خواهد کرد. بهتر است که این ترفندها را با چند مثال توضیح دهیم. بنابراین، ما کار خود را با ایجاد یک چارچوب داده برای این کار آغاز می‌کنیم.

چارچوب داده‌ها شامل میزان فروش روزانه ۳ فروشگاه مختلف است. ما ابتدا یک دوره ۱۰ روزه را با استفاده از تابع date_range ایجاد می‌کنیم.

import numpy as np
import pandas as pddays = pd.date_range("2020-01-01", periods=10, freq="D")

متغیر روز به عنوان یک ستون استفاده خواهد شد. همچنین به یک ستون مقدار فروش نیاز داریم که می‌تواند توسط تابع randint از اعداد تولید شود. سپس یک چارچوب داده با ۳ ستون برای هر فروشگاه ایجاد می‌کنیم.

A = pd.DataFrame({"date": days,
"store": "A",
"sales": np.random.randint(100, 200, size=10)})B = pd.DataFrame({"date": days,
"store": "B",
"sales": np.random.randint(100, 200, size=10)})C = pd.DataFrame({"date": days,
"store": "C",
"sales": np.random.randint(100, 200, size=10)})

اکنون این سه چارچوب داده را با تابع concat ترکیب می‌کنیم. همچنین بهتر است که ردیف‌ها را بر اساس تاریخ مرتب کنیم زیرا ما به مقادیر فروش روزانه علاقمند هستیم.

df = pd.concat([A, B, C]).sort_values(by="date")df.head()

شکل ۲. مقادیر فروش روزانه
شکل ۲. مقادیر فروش روزانه

۱. تابع رتبه‌بندی

اولین ترفند، در مورد عملکرد rank است. بیایید فرض کنیم که باید فروشگاهی را پیدا کنیم که بیش‌ترین مقدار فروش روزانه را داشته باشد. این کار را می‌توان با استفاده از توابع groupby و max انجام داد. اگر ما نیاز به مرتب کردن فروشگاه‌ها بر اساس میزان فروش روزانه آن‌ها داشته باشیم، چه اتفاقی می‌افتد؟ لطفا نگاهی به تصویر بالا بیاندازید. برای تاریخ ۲۰۲۰-۰۱-۰۱، A رتبه اول، C رتبه دوم و B رتبه سوم است.

ما می‌توانیم از تابع رتبه‌بندی برای اعمال چنین ترتیبی برای هر تاریخ استفاده کنیم.

df["rank"] = df.groupby("date)["sales"]\
.rank(ascending=False).astype("int")df.head(6)

شکل ۳. میزان فروش روزانه فروشگاه‌ها
شکل ۳. میزان فروش روزانه فروشگاه‌ها

ما ابتدا نقاط داده (برای مثال ردیف‌ها) را به روز گروه‌بندی می‌کنیم و سپس تابع رتبه‌بندی را اعمال می‌کنیم. رتبه‌بندی ایجاد شده به یک ستون جدید اختصاص داده می‌شود. تابع رتبه مقادیر را به ترتیب صعودی به صورت پیش‌فرض مرتب می‌کند اما می‌تواند با پارامتر صعودی تغییر کند. اطلاعات رتبه‌بندی را می‌توان برای مقایسه بین فروشگاه‌ها استفاده کرد. حال توزیع رتبه‌بندی هر فروشگاه را پیدا می‌کنیم.

df.groupby(["store","rank"]).count()[["sales"]]

شکل ۴. توزیع رتبه‌بندی هر فروشگاه
شکل ۴. توزیع رتبه‌بندی هر فروشگاه

فروشگاه A بالاترین رتبه را دارد. فروشگاه B معمولا دومین فروشگاه است و C نوعی توزیع یکنواخت از رتبه‌ها را دارد.

۲. نامگذاری تراکم و فراوانی

هنگامی که توزیع رتبه را در مثال قبلی پیدا کردیم، یک ستون را پس از انجام تراکم و فراوانی انتخاب کردیم. دلیل آن این است که تراکم شمارش برای تمام ستون‌هایی که در گروه‌بندی استفاده نمی‌شوند، اعمال می‌شود. اگر یک جمع با میانگین انجام دهیم، این ستون روی تمام ستون‌های عددی که در گروه‌بندی استفاده نشده است، اعمال می‌شود.

در اینجا مشاهده می‌‍‌شود که نتیجه بدون انتخاب یک ستون چگونه به نظر می‌رسد.

df.groupby(["store","rank"]).count()

شکل ۵. نتیجه بدون انتخاب یک ستون
شکل ۵. نتیجه بدون انتخاب یک ستون

اگر ما یک تجمع با میانگین انجام دهیم، به تمام ستون‌های عددی که در گروه‌بندی استفاده نمی‌شوند اعمال می‌شود. ایراد دیگر این رویکرد آن است که نام ستون تراکم، اطلاعاتی از آنچه ارائه می‌دهد، ندارد. بدون دیدن کد، ما واقعا نمی‌توانیم بگوییم که ستون فروش به ما چه می‌گوید. ما همیشه می‌توانیم نام ستون‌ها را تغییر دهیم اما یک راه عملی‌تر وجود دارد.

راه‌حلی برای حل هر دوی این مسائل استفاده از یک اجتماع نام‌گذاری شده با تابع agg است. باید نام ستون و تابع تجمع را به صورت زیر مشخص کنیم:

df.groupby(["store","rank"]).agg(rank_count = ("rank", "count"))

شکل ۶. نام ستون و تابع تجمع
شکل ۶. نام ستون و تابع تجمع

تنها نام‌های ستون تجمیع شده را می‌بینیم بنابراین مجبور نیستیم یک ستون را بعد از تجمع انتخاب کنیم. همچنین به ما اجازه می‌دهد تا هر نامی را به ستون متراکم اختصاص دهیم.

ممکن است به مطالعه مقاله تابع نقشه در پایتون علاقمند باشید.

۳. نادیده گرفتن شاخص

تصویر اول را به‌روزرسانی کنید.

شکل ۷. به‌روزرسانی تصویر اول
شکل ۷. به‌روزرسانی تصویر اول

ما سه چارچوب داده را با هم ترکیب می‌کنیم اما شاخص‌ها به‌روزرسانی نمی‌شوند. آن‌ها شاخص هر چارچوب داده منحصر به فرد را نشان می‌دهند. این شاخص بخش مهمی از یک چارچوب داده است بنابراین باید دقیق باشد. یک گزینه، تنظیم مجدد شاخص پس از الحاق است.

df = pd.concat([A, B, C])\
.sort_values(by="date").reset_index(drop=True)df.head()

شکل ۸. ترکیب سه چارچوب داده
شکل ۸. ترکیب سه چارچوب داده

ما اکنون شاخص دقیق‌تری داریم. اگر پارامتر drop تابع reset_index را درست در نظر نگیریم، شاخص‌های قبلی به عنوان یک ستون در چارچوب داده‌ها در نظر گرفته می‌شوند. نکته مهم در اینجا پارامتر ignore_index است. این کار، ما را از نیاز به استفاده از تابعreset_index نجات می‌دهد. هر دو تابعconcat و sort_values این پارمتر را دارند. هنگامی که به عنوان صحیح تنظیم می‌شود، شاخص‌های فریم‌های داده فردی را نادیده می‌گیرد و یک شاخص عدد صحیح جدید را تخصیص می‌دهد.

df = pd.concat([A, B, C]).sort_values(by="date", ignore_index=True)df.head()

شکل ۹. جدول داده‌ها
شکل ۹. جدول داده‌ها

این مسئله بهره زیادی ندارد اما با یک عملکرد کمتر به همان نتیجه می‌رسیم.

نتیجه‌گیری

ما سه ترفند را پوشش داده‌ایم که به نظر ساده می‌آیند اما در برخی موارد مفید هستند. آن‌ها همچنین ترکیب و عملیات را ساده می‌کنند. سرور Pandas یک کتابخانه بزرگ با ترکیب ساده و شهودی است. در نتیجه شما به راحتی می‌توانید عملیات پایه را با کمی تمرین یاد بگیرید. پس از اصول اولیه، پیشنهاد می‌کنم بر روی برخی از ترفندها و تکنیک‌های دقیق برای بهره‌وری تمرکز کنید.

این متن با استفاده از ربات مترجم مقاله علم داده ترجمه شده و به صورت محدود مورد بازبینی انسانی قرار گرفته است.در نتیجه می‌تواند دارای برخی اشکالات ترجمه باشد.
مقالات لینک‌شده در این متن می‌توانند به صورت رایگان با استفاده از مقاله‌خوان ترجمیار به فارسی مطالعه شوند.