ویرگول
ورودثبت نام
مجتبی پاکزاد
مجتبی پاکزادتکنیکال تیم لید شرکت داده پردازان آبشار هستم. برای خوندن بیشتر تجربیات و مطالعاتم من رو در باورژن baversion.com دنبال کنید.
مجتبی پاکزاد
مجتبی پاکزاد
خواندن ۸ دقیقه·۱۶ روز پیش

کار با کتابخانه Pandas برای تحلیل داده‌های حجیم

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

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

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


Pandas چیست؟

Pandas یک کتابخانه متن‌باز برای زبان برنامه‌نویسی Python است که ابزارهای قدرتمندی برای تحلیل و پردازش داده‌های ساختاریافته ارائه می‌دهد.

نام Pandas از عبارت Panel Data Analysis گرفته شده است.

مهم‌ترین ویژگی‌های Pandas عبارتند از:

  • پردازش سریع داده‌ها

  • پشتیبانی از فایل‌های CSV

  • پشتیبانی از اکسل

  • اتصال به پایگاه‌های داده

  • فیلتر و جستجوی داده‌ها

  • مدیریت داده‌های گمشده

  • انجام محاسبات آماری

  • ادغام و ترکیب داده‌ها

  • تجمیع و گروه‌بندی داده‌ها


چرا Pandas برای تحلیل داده محبوب است؟

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

مشکلات این روش‌ها عبارت بودند از:

  • پیچیدگی کدنویسی

  • خوانایی پایین

  • مدیریت دشوار داده‌های جدولی

  • نیاز به پیاده‌سازی دستی بسیاری از عملیات

Pandas این مشکلات را حل کرد و محیطی مشابه نرم‌افزارهای تحلیل داده مانند Excel و SQL در اختیار برنامه‌نویسان قرار داد.

مزایای اصلی Pandas:

سرعت توسعه بالا

عملیاتی که در SQL یا Python خام به ده‌ها خط کد نیاز دارند، در Pandas تنها با یک یا دو خط قابل انجام هستند.

یکپارچگی با اکوسیستم علم داده

Pandas به‌صورت کامل با کتابخانه‌های زیر هماهنگ است:

  • NumPy

  • Matplotlib

  • SciPy

  • Scikit-Learn

  • TensorFlow

  • PyTorch

مناسب برای ETL

بسیاری از فرایندهای استخراج، تبدیل و بارگذاری داده‌ها (ETL) توسط Pandas انجام می‌شوند.


نصب Pandas

برای نصب Pandas کافی است دستور زیر را اجرا کنید:

pip install pandas

برای بررسی نصب:

import pandas as pd print(pd.__version__)

آشنایی با DataFrame

مهم‌ترین ساختار داده در Pandas، شی DataFrame است.

DataFrame را می‌توان مشابه یک جدول پایگاه داده یا فایل Excel در نظر گرفت.

مثال:

import pandas as pd data = { "name": ["Ali", "Sara", "Reza"], "age": [25, 30, 28], "city": ["Tehran", "Tabriz", "Shiraz"] } df = pd.DataFrame(data) print(df)

خروجی:

name age city 0 Ali 25 Tehran 1 Sara 30 Tabriz 2 Reza 28 Shiraz

بارگذاری داده‌های حجیم از فایل CSV

یکی از رایج‌ترین سناریوها در تحلیل داده، خواندن فایل‌های CSV بزرگ است.

import pandas as pd df = pd.read_csv("data.csv")

اما اگر فایل چندین گیگابایت حجم داشته باشد، ممکن است حافظه سیستم پر شود.

در چنین شرایطی باید از روش‌های بهینه استفاده کنیم.


بررسی مصرف حافظه

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

df.info(memory_usage="deep")

این دستور میزان حافظه مصرفی هر ستون را نمایش می‌دهد.


انتخاب ستون‌های موردنیاز

بسیاری از فایل‌های داده دارای ده‌ها یا صدها ستون هستند اما معمولا فقط چند ستون مورد استفاده قرار می‌گیرد.

به‌جای بارگذاری کل فایل:

df = pd.read_csv("sales.csv")

می‌توان نوشت:

df = pd.read_csv( "sales.csv", usecols=["product_id", "price", "quantity"] )

این روش مصرف حافظه را به‌شدت کاهش می‌دهد.


تعیین نوع داده‌ها (dtype)

یکی از مهم‌ترین تکنیک‌های بهینه‌سازی Pandas تعیین نوع داده مناسب است.

به‌صورت پیش‌فرض Pandas ممکن است انواع داده‌ای بزرگ‌تری انتخاب کند.

مثال:

df = pd.read_csv( "sales.csv", dtype={ "product_id": "int32", "quantity": "int16" } )

مزایا:

  • کاهش حافظه

  • افزایش سرعت پردازش

  • کاهش زمان بارگذاری


خواندن داده‌ها به‌صورت Chunk

هنگام کار با فایل‌های بسیار بزرگ نباید کل فایل را یکجا وارد حافظه کرد.

Pandas امکان خواندن بخش‌بندی‌شده فایل را فراهم کرده است.

chunks = pd.read_csv( "big_data.csv", chunksize=100000 )

پردازش:

for chunk in chunks: print(chunk.shape)

در این حالت فقط 100 هزار رکورد در هر مرحله بارگذاری می‌شود.

این تکنیک برای فایل‌های چند گیگابایتی بسیار کاربردی است.


فیلتر کردن داده‌ها

یکی از رایج‌ترین عملیات‌ها در تحلیل داده، فیلتر کردن اطلاعات است.

مثال:

filtered = df[df["price"] > 100]

چند شرط:

filtered = df[ (df["price"] > 100) & (df["quantity"] > 10) ]

مرتب‌سازی داده‌ها

df.sort_values( by="price", ascending=False )

مرتب‌سازی بر اساس چند ستون:

df.sort_values( by=["city", "price"] )

مدیریت داده‌های گمشده

تقریباً تمام پروژه‌های واقعی دارای داده‌های ناقص هستند.

بررسی:

df.isnull().sum()

حذف:

df.dropna()

جایگزینی:

df.fillna(0)

جایگزینی با میانگین:

df["price"] = df["price"].fillna( df["price"].mean() )

GroupBy گروه بندی برای تحلیل داده در Pandas

یکی از قدرتمندترین قابلیت‌های Pandas عملیات GroupBy است.

مثال:

sales = df.groupby( "city" )["price"].sum()

خروجی:

Tehran 50000 Shiraz 23000 Tabriz 41000

میانگین فروش:

df.groupby( "city" )["price"].mean()

تعداد رکوردها:

df.groupby( "city" ).size()

تحلیل داده‌های حجیم با Aggregation

فرض کنید فایل شما ۵۰ میلیون رکورد فروش دارد.

برای محاسبه فروش هر محصول:

result = df.groupby( "product_id" ).agg({ "price": "sum", "quantity": "sum" })

این روش نسبت به حلقه‌های Python بسیار سریع‌تر است زیرا از عملیات برداری (Vectorized Operations) استفاده می‌کند.


ادغام داده‌ها با Merge

بسیاری از پروژه‌ها دارای چندین فایل داده هستند.

مثال:

orders = pd.read_csv("orders.csv") products = pd.read_csv("products.csv")

ادغام:

merged = pd.merge( orders, products, on="product_id" )

مشابه:

INNER JOIN

در SQL است.


استفاده از Query برای افزایش خوانایی

به‌جای:

df[ (df["price"] > 100) & (df["quantity"] > 5) ]

می‌توان نوشت:

df.query( "price > 100 and quantity > 5" )

این روش در پروژه‌های بزرگ خوانایی بیشتری دارد.

بهینه‌سازی حافظه در Pandas

هنگام کار با داده‌های حجیم، حافظه (RAM) معمولا اولین محدودیت جدی محسوب می‌شود. بسیاری از توسعه‌دهندگان تصور می‌کنند مشکل از Pandas است، در حالی که در اغلب موارد ساختار داده‌ها بهینه انتخاب نشده است.

کاهش مصرف حافظه با Category

فرض کنید ستونی شامل نام شهرها داریم:

df["city"]

اگر میلیون‌ها رکورد داشته باشیم، ذخیره رشته‌های تکراری حافظه زیادی مصرف می‌کند.

راه‌حل:

df["city"] = df["city"].astype("category")

مزایا:

  • کاهش چشمگیر مصرف RAM

  • افزایش سرعت GroupBy

  • افزایش سرعت فیلترها

  • بهبود عملکرد Join

بررسی حافظه قبل و بعد:

print(df.memory_usage(deep=True))

در بسیاری از پروژه‌ها کاهش ۷۰ تا ۹۰ درصدی مصرف حافظه کاملا طبیعی است.


استفاده از انواع عددی کوچک‌تر

بسیاری از ستون‌ها نیازی به int64 ندارند.

مثال:

df["age"] = df["age"].astype("int8")

محدوده int8:

-128 تا 127

یا:

df["count"] = df["count"].astype("int16")

همین موضوع درباره float نیز صدق می‌کند:

df["price"] = df["price"].astype("float32")

در دیتاست‌های چند میلیون رکوردی این تغییر می‌تواند چندین گیگابایت حافظه آزاد کند.


استفاده از Parquet به‌جای CSV

CSV فرمت محبوبی است اما برای داده‌های حجیم گزینه ایده‌آلی نیست.

مشکلات CSV:

  • حجم بالا

  • سرعت پایین خواندن

  • عدم نگهداری نوع داده‌ها

فرمت Parquet برای تحلیل داده طراحی شده است.

ذخیره:

df.to_parquet("data.parquet")

بارگذاری:

df = pd.read_parquet("data.parquet")

مزایای Parquet:

  • حجم کمتر

  • سرعت بسیار بالاتر

  • حفظ dtype

  • مناسب برای Big Data

در بسیاری از پروژه‌ها سرعت خواندن Parquet چند برابر CSV است.


استفاده از Feather

فرمت Feather نیز برای انتقال سریع DataFrame طراحی شده است.

df.to_feather("data.feather")

و:

df = pd.read_feather("data.feather")

این فرمت برای تبادل داده بین Pandas و سایر ابزارهای تحلیلی بسیار کاربردی است.


Index چیست و چرا اهمیت دارد؟

هر DataFrame دارای Index است.

print(df.index)

به‌صورت پیش‌فرض:

RangeIndex

اما در تحلیل داده‌های حجیم، انتخاب Index مناسب اهمیت زیادی دارد.

مثال:

df.set_index("user_id", inplace=True)

اکنون جستجو سریع‌تر می‌شود:

df.loc[105]

به‌جای اسکن کامل جدول، Pandas مستقیما به رکورد موردنظر دسترسی پیدا می‌کند.


چند ایندکسی در Pandas

گاهی یک ستون برای شناسایی داده کافی نیست.

مثال:

df.set_index( ["country", "city"], inplace=True )

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

مثال:

df.loc["Iran"]

یا:

df.loc[ ("Iran", "Tehran") ]

این قابلیت برای تحلیل داده‌های مالی، فروش و گزارش‌گیری بسیار ارزشمند است.


Pivot Table در Pandas

Pivot Table مشابه قابلیت Pivot در Excel عمل می‌کند.

مثال:

pd.pivot_table( df, values="sales", index="city", columns="year", aggfunc="sum" )

خروجی:

City 2024 2025

Tehran 20000 35000

Shiraz 15000 28000

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


کار با تاریخ و زمان

تحلیل داده بدون پردازش تاریخ تقریباً غیرممکن است.

تبدیل رشته به تاریخ:

df["date"] = pd.to_datetime( df["date"] )

استخراج سال:

df["year"] = df["date"].dt.year

استخراج ماه:

df["month"] = df["date"].dt.month

استخراج روز:

df["day"] = df["date"].dt.day

تحلیل سری زمانی

فرض کنید داده‌های فروش روزانه داریم.

می‌توان مجموع فروش ماهانه را محاسبه کرد:

monthly_sales = ( df.resample( "M", on="date" ) ["sales"] .sum() )

یا فروش هفتگی:

weekly_sales = ( df.resample( "W", on="date" ) ["sales"] .sum() )

این قابلیت در تحلیل رفتار کاربران و گزارش‌های مالی کاربرد فراوانی دارد.


اعمال توابع روی داده‌ها

گاهی لازم است روی هر رکورد یک عملیات انجام شود.

مثال:

df["price_with_tax"] = ( df["price"] .apply(lambda x: x * 1.1) )

اما باید توجه داشت:

apply()

معمولا کندتر از عملیات برداری است.

بهتر:

df["price_with_tax"] = ( df["price"] * 1.1 )

همیشه تا حد امکان از عملیات Vectorized استفاده کنید.


چرا حلقه‌ها در Pandas کند هستند؟

بسیاری از برنامه‌نویسان تازه‌کار چنین کدی می‌نویسند:

for index, row in df.iterrows(): ...

این روش سرعت بسیار پایینی دارد.

علت:

  • اجرای کد در سطح Python

  • از بین رفتن مزیت NumPy

  • مصرف حافظه بیشتر

بهتر است از:

groupby()
transform()
agg()

و عملیات برداری استفاده شود.


پردازش میلیون‌ها رکورد

فرض کنید فایل زیر را داریم:

50,000,000 rows

خواندن مستقیم آن ممکن است باعث کمبود حافظه شود.

راه‌حل:

total = 0 for chunk in pd.read_csv( "big.csv", chunksize=500000 ): total += chunk["sales"].sum() print(total)

در این روش حافظه تقریبا ثابت باقی می‌ماند.


استفاده از Dask برای داده‌های بسیار بزرگ

زمانی که حجم داده از ظرفیت RAM فراتر می‌رود، Dask گزینه مناسبی است.

نصب:

pip install dask

استفاده:

import dask.dataframe as dd df = dd.read_csv( "big_data.csv" )

سینتکس آن بسیار شبیه Pandas است:

df.groupby( "city" )["sales"].sum().compute()

مزیت:

  • پردازش موازی

  • استفاده از چند هسته CPU

  • مناسب برای ده‌ها یا صدها گیگابایت داده


مقایسه Pandas و Dask

ویژگی Pandas Dask

سرعت روی داده متوسط بسیار بالا بالا

مصرف RAM زیاد کمتر

پردازش موازی محدود کامل

یادگیری آسان متوسط

داده‌های چند گیگابایتی محدود مناسب


مقایسه Pandas و Polars

در سال‌های اخیر کتابخانه Polars محبوبیت زیادی پیدا کرده است.

مزایای Polars:

  • سرعت بیشتر

  • استفاده بهتر از CPU

  • مصرف حافظه کمتر

مثال:

import polars as pl

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

با این حال Pandas هنوز:

  • جامعه کاربری بزرگ‌تر

  • مستندات گسترده‌تر

  • سازگاری بیشتر

دارد.


مصورسازی داده‌ها با Pandas

یکی از مراحل مهم تحلیل داده، نمایش بصری نتایج است.

import matplotlib.pyplot as plt

نمودار خطی:

df["sales"].plot() plt.show()

نمودار میله‌ای:

df.groupby( "city" )["sales"].sum().plot.bar()

نمودار هیستوگرام:

df["price"].hist()

این نمودارها در شناسایی الگوها و ناهنجاری‌ها بسیار مفید هستند.


نمونه پروژه واقعی تحلیل فروش

فرض کنید فروشگاه اینترنتی دارای داده‌های زیر است:

  • شناسه سفارش

  • شناسه مشتری

  • محصول

  • قیمت

  • تاریخ خرید

اهداف تحلیل:

  • پرفروش‌ترین محصولات

  • بیشترین فروش ماهانه

  • مشتریان وفادار

  • میانگین ارزش سفارش

محاسبه فروش هر محصول:

df.groupby( "product" )["price"].sum()

مشتریان برتر:

df.groupby( "customer_id" )["price"].sum()

فروش ماهانه:

df.groupby( df["date"].dt.month )["price"].sum()

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


اشتباهات رایج هنگام کار با داده‌های حجیم

بارگذاری کامل فایل

اشتباه:

pd.read_csv("100GB.csv")

راه‌حل:

chunksize

استفاده زیاد از apply

اشتباه:

apply()

روی میلیون‌ها رکورد.

راه‌حل:

استفاده از عملیات برداری.


انتخاب dtype نامناسب

اشتباه:

int64

برای همه ستون‌ها.

راه‌حل:

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


استفاده از CSV برای ذخیره‌سازی

راه‌حل:

استفاده از:

  • Parquet

  • Feather


بهترین روش‌های افزایش Performance در Pandas

برای دستیابی به حداکثر کارایی:

  1. فقط ستون‌های موردنیاز را بارگذاری کنید.

  2. از Category استفاده کنید.

  3. نوع داده‌ها را بهینه کنید.

  4. از حلقه‌ها دوری کنید.

  5. از عملیات Vectorized استفاده کنید.

  6. برای فایل‌های بزرگ از Chunking استفاده کنید.

  7. داده‌ها را در فرمت Parquet ذخیره کنید.

  8. Index مناسب تعریف کنید.

  9. در پروژه‌های بزرگ Dask یا Polars را بررسی کنید.

  10. مصرف حافظه را مرتباً مانیتور کنید.

جمع‌بندی

Pandas یکی از مهم‌ترین ابزارهای تحلیل داده در اکوسیستم پایتون است و تقریباً در تمامی حوزه‌های علم داده، هوش مصنوعی، تحلیل کسب‌وکار، مهندسی داده و گزارش‌گیری مورد استفاده قرار می‌گیرد. اگرچه بسیاری از افراد Pandas را تنها برای فایل‌های کوچک مناسب می‌دانند، اما با استفاده از تکنیک‌هایی مانند بهینه‌سازی نوع داده‌ها، استفاده از Category، پردازش Chunk-Based، ذخیره‌سازی در فرمت Parquet و بهره‌گیری از ابزارهایی مانند Dask می‌توان مجموعه داده‌های بسیار بزرگ را نیز به‌صورت کارآمد تحلیل کرد.

تسلط بر Pandas نه‌تنها فرآیند تحلیل داده را ساده‌تر می‌کند، بلکه پایه‌ای قدرتمند برای ورود به حوزه‌های پیشرفته‌تر مانند مهندسی داده، ماشین لرنینگ و بیگ دیتا محسوب می‌شود.

pandasپایتونpython
۰
۰
مجتبی پاکزاد
مجتبی پاکزاد
تکنیکال تیم لید شرکت داده پردازان آبشار هستم. برای خوندن بیشتر تجربیات و مطالعاتم من رو در باورژن baversion.com دنبال کنید.
شاید از این پست‌ها خوشتان بیاید