🐍 کتابخانه مرجع پایتون

🐼 مبانی Pandas

Pandas یکی از قدرتمندترین کتابخانه‌های پایتون برای تحلیل و دستکاری داده است. این کتابخانه دو ساختار داده اصلی به نام‌های Series (یک‌بعدی) و DataFrame (دو‌بعدی) را ارائه می‌دهد که کار با داده‌های جدولی را بسیار ساده و کارآمد می‌کند. Pandas پایه و اساس بسیاری از پروژه‌های دیتاساینس و تحلیل داده است.

🔹 نصب و import

# نصب (در محیط واقعی)
# pip install pandas

# import کردن
import pandas as pd

# بررسی نسخه
print(pd.__version__)

🔹 آشنایی با Series

import pandas as pd

# ایجاد Series از لیست
s1 = pd.Series([10, 20, 30, 40, 50])
print("Series from list:")
print(s1)

# ایجاد Series با اندیس دلخواه
s2 = pd.Series([10, 20, 30], index=["a", "b", "c"])
print("\nSeries with custom index:")
print(s2)

# ایجاد Series از دیکشنری
s3 = pd.Series({"a": 10, "b": 20, "c": 30})
print("\nSeries from dictionary:")
print(s3)

# دسترسی به مقادیر
print(f"\nValue at index 'b': {s3['b']}")
print(f"Values: {s3.values}")
print(f"Index: {s3.index}")

🔹 ایجاد DataFrame

import pandas as pd

# از دیکشنری
data = {
    "Name": ["Saba", "Ali", "Reza", "Mina"],
    "Age": [22, 24, 20, 23],
    "City": ["Tehran", "Shiraz", "Isfahan", "Tehran"],
    "Score": [18.5, 19.0, 17.5, 20.0]
}

df = pd.DataFrame(data)
print("DataFrame from dictionary:")
print(df)

# از لیست دیکشنری‌ها
data2 = [
    {"Name": "Saba", "Age": 22, "City": "Tehran"},
    {"Name": "Ali", "Age": 24, "City": "Shiraz"}
]
df2 = pd.DataFrame(data2)
print("\nDataFrame from list of dicts:")
print(df2)

🔹 ویژگی‌های DataFrame

import pandas as pd

data = {
    "Name": ["Saba", "Ali", "Reza", "Mina"],
    "Age": [22, 24, 20, 23],
    "City": ["Tehran", "Shiraz", "Isfahan", "Tehran"],
    "Score": [18.5, 19.0, 17.5, 20.0]
}

df = pd.DataFrame(data)

print("DataFrame:")
print(df)
print(f"\nShape: {df.shape}")           # (تعداد سطرها, تعداد ستون‌ها)
print(f"Columns: {df.columns.tolist()}")
print(f"Index: {df.index.tolist()}")
print(f"Data types:\n{df.dtypes}")

# نمایش اطلاعات آماری
print("\nStatistical summary:")
print(df.describe())

# اطلاعات کلی
print("\nInfo:")
print(df.info())

🔹 دسترسی به داده‌ها

import pandas as pd

data = {
    "Name": ["Saba", "Ali", "Reza", "Mina"],
    "Age": [22, 24, 20, 23],
    "City": ["Tehran", "Shiraz", "Isfahan", "Tehran"],
    "Score": [18.5, 19.0, 17.5, 20.0]
}

df = pd.DataFrame(data)

# دسترسی به ستون‌ها
print("Column 'Name':")
print(df["Name"])
print("\nColumn 'Score':")
print(df.Score)  # روش دیگر

# دسترسی به چند ستون
print("\nColumns 'Name' and 'Age':")
print(df[["Name", "Age"]])

# دسترسی به سطرها با iloc (بر اساس اندیس عددی)
print("\nFirst 2 rows:")
print(df.iloc[:2])

print("\nRow with index 2:")
print(df.iloc[2])

# دسترسی به سطرها با loc (بر اساس اندیس نام‌گذاری شده)
print("\nRow with index 2:")
print(df.loc[2])

# ترکیب شرط و ستون
print("\nNames of students with score > 18:")
print(df[df["Score"] > 18]["Name"])

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

import pandas as pd

data = {
    "Name": ["Saba", "Ali", "Reza", "Mina", "Hossein"],
    "Age": [22, 24, 20, 23, 26],
    "City": ["Tehran", "Shiraz", "Isfahan", "Tehran", "Mashhad"],
    "Score": [18.5, 19.0, 17.5, 20.0, 16.5]
}

df = pd.DataFrame(data)

# شرط ساده
print("Students with score > 18:")
print(df[df["Score"] > 18])

# شرط چندگانه (AND)
print("\nStudents from Tehran with score > 18:")
print(df[(df["City"] == "Tehran") & (df["Score"] > 18)])

# شرط چندگانه (OR)
print("\nStudents from Tehran OR Shiraz:")
print(df[(df["City"] == "Tehran") | (df["City"] == "Shiraz")])

# استفاده از isin
cities = ["Tehran", "Isfahan"]
print("\nStudents from Tehran or Isfahan:")
print(df[df["City"].isin(cities)])

🔹 افزودن و حذف ستون‌ها

import pandas as pd

data = {
    "Name": ["Saba", "Ali", "Reza"],
    "Age": [22, 24, 20],
    "Score": [18.5, 19.0, 17.5]
}

df = pd.DataFrame(data)
print("Original DataFrame:")
print(df)

# افزودن ستون جدید
df["Grade"] = ["A", "A", "B"]
print("\nAfter adding 'Grade' column:")
print(df)

# افزودن ستون با محاسبه
df["Passed"] = df["Score"] >= 18
print("\nAfter adding 'Passed' column:")
print(df)

# حذف ستون
df = df.drop("Passed", axis=1)
print("\nAfter removing 'Passed' column:")
print(df)

# حذف چند ستون
df = df.drop(["Age", "Grade"], axis=1)
print("\nAfter removing 'Age' and 'Grade' columns:")
print(df)

🔹 کار با مقادیر گم‌شده (NaN)

import pandas as pd
import numpy as np

data = {
    "Name": ["Saba", "Ali", "Reza", "Mina"],
    "Age": [22, np.nan, 20, 23],
    "Score": [18.5, 19.0, np.nan, 20.0]
}

df = pd.DataFrame(data)
print("DataFrame with missing values:")
print(df)

# تشخیص مقادیر گم‌شده
print("\nIs null?")
print(df.isnull())

# تعداد مقادیر گم‌شده
print(f"\nMissing values per column:\n{df.isnull().sum()}")

# حذف سطرهای با مقدار گم‌شده
df_cleaned = df.dropna()
print("\nAfter dropping rows with missing values:")
print(df_cleaned)

# پر کردن مقادیر گم‌شده
df_filled = df.fillna({"Age": df["Age"].mean(), "Score": 0})
print("\nAfter filling missing values:")
print(df_filled)

🔹 گروه‌بندی با groupby

import pandas as pd

data = {
    "Name": ["Saba", "Ali", "Reza", "Mina", "Hossein"],
    "City": ["Tehran", "Shiraz", "Isfahan", "Tehran", "Mashhad"],
    "Score": [18.5, 19.0, 17.5, 20.0, 16.5]
}

df = pd.DataFrame(data)
print("DataFrame:")
print(df)

# گروه‌بندی بر اساس شهر
grouped = df.groupby("City")
print("\nGrouped by city:")
for city, group in grouped:
    print(f"\n{city}:")
    print(group)

# محاسبه میانگین نمرات هر شهر
print("\nAverage score by city:")
print(grouped["Score"].mean())

# آمار کامل
print("\nStatistics by city:")
print(grouped["Score"].agg(["count", "mean", "std", "min", "max"]))

# گروه‌بندی چندگانه
df["Gender"] = ["F", "M", "M", "F", "M"]
grouped2 = df.groupby(["City", "Gender"])
print("\nGrouped by city and gender:")
print(grouped2["Score"].mean())

🔹 مرتب‌سازی

import pandas as pd

data = {
    "Name": ["Saba", "Ali", "Reza", "Mina", "Hossein"],
    "Age": [22, 24, 20, 23, 26],
    "Score": [18.5, 19.0, 17.5, 20.0, 16.5]
}

df = pd.DataFrame(data)
print("Original DataFrame:")
print(df)

# مرتب‌سازی بر اساس یک ستون
df_sorted = df.sort_values("Score")
print("\nSorted by Score (ascending):")
print(df_sorted)

# مرتب‌سازی نزولی
df_sorted_desc = df.sort_values("Score", ascending=False)
print("\nSorted by Score (descending):")
print(df_sorted_desc)

# مرتب‌سازی بر اساس چند ستون
df_sorted_multi = df.sort_values(["Age", "Score"])
print("\nSorted by Age then Score:")
print(df_sorted_multi)

🔹 خواندن و نوشتن فایل‌ها

import pandas as pd

data = {
    "Name": ["Saba", "Ali", "Reza", "Mina"],
    "Age": [22, 24, 20, 23],
    "Score": [18.5, 19.0, 17.5, 20.0]
}

df = pd.DataFrame(data)

# نوشتن در CSV
df.to_csv("students.csv", index=False)
print("DataFrame saved to students.csv")

# خواندن از CSV
df_loaded = pd.read_csv("students.csv")
print("\nDataFrame loaded from CSV:")
print(df_loaded)

# نوشتن در Excel (نیاز به openpyxl)
# df.to_excel("students.xlsx", index=False)

# خواندن از Excel
# df_excel = pd.read_excel("students.xlsx")

🔹 توابع کاربردی

import pandas as pd

data = {
    "Name": ["Saba", "Ali", "Reza", "Mina"],
    "Age": [22, 24, 20, 23],
    "Score": [18.5, 19.0, 17.5, 20.0]
}

df = pd.DataFrame(data)

# apply: اعمال تابع روی ستون
df["Score_Rounded"] = df["Score"].apply(lambda x: round(x))
print("After applying function (round):")
print(df)

# map: نگاشت مقادیر
city_map = {"Saba": "Tehran", "Ali": "Shiraz", "Reza": "Isfahan", "Mina": "Tehran"}
df["City"] = df["Name"].map(city_map)
print("\nAfter mapping names to cities:")
print(df)

# drop_duplicates: حذف تکراری‌ها
df_dup = pd.DataFrame({
    "Name": ["Saba", "Saba", "Ali", "Reza"],
    "Age": [22, 22, 24, 20]
})
df_unique = df_dup.drop_duplicates()
print("\nOriginal:")
print(df_dup)
print("\nAfter removing duplicates:")
print(df_unique)

🔹 ادغام داده‌ها با merge

import pandas as pd

# DataFrame اول: دانشجویان
df1 = pd.DataFrame({
    "student_id": [1, 2, 3, 4],
    "name": ["Saba", "Ali", "Reza", "Mina"],
    "age": [22, 24, 20, 23]
})

# DataFrame دوم: نمرات
df2 = pd.DataFrame({
    "student_id": [1, 2, 3, 4],
    "score": [18.5, 19.0, 17.5, 20.0],
    "city": ["Tehran", "Shiraz", "Isfahan", "Tehran"]
})

print("Students:")
print(df1)
print("\nScores:")
print(df2)

# ادغام (مشابه JOIN در SQL)
merged = pd.merge(df1, df2, on="student_id")
print("\nMerged DataFrame:")
print(merged)

# left join (حفظ همه سطرهای df1)
df3 = pd.DataFrame({
    "student_id": [1, 2, 3],
    "score": [18.5, 19.0, 17.5]
})
merged_left = pd.merge(df1, df3, on="student_id", how="left")
print("\nLeft merge:")
print(merged_left)

🔹 مثال جامع: تحلیل داده فروش

import pandas as pd
import numpy as np

# ایجاد داده فروش تصادفی
np.random.seed(42)
dates = pd.date_range("2024-01-01", periods=100)
products = ["Product A", "Product B", "Product C", "Product D", "Product E"]

data = {
    "Date": np.random.choice(dates, 500),
    "Product": np.random.choice(products, 500),
    "Quantity": np.random.randint(1, 20, 500),
    "Price": np.random.uniform(10, 100, 500).round(2)
}

df = pd.DataFrame(data)
df["Revenue"] = df["Quantity"] * df["Price"]

print("Sales Data (first 5 rows):")
print(df.head())

# ۱. مجموع فروش هر محصول
product_sales = df.groupby("Product")["Revenue"].sum().sort_values(ascending=False)
print("\nTotal revenue by product:")
print(product_sales)

# ۲. میانگین قیمت هر محصول
avg_price = df.groupby("Product")["Price"].mean()
print("\nAverage price by product:")
print(avg_price)

# ۳. فروش روزانه
daily_sales = df.groupby("Date")["Revenue"].sum()
print(f"\nDaily sales (first 5 days):")
print(daily_sales.head())

# ۴. بهترین روز فروش
best_day = daily_sales.idxmax()
best_day_revenue = daily_sales.max()
print(f"\nBest day: {best_day.strftime('%Y-%m-%d')} with ${best_day_revenue:.2f}")

# ۵. محصولات با فروش بالای ۵۰۰۰
top_products = product_sales[product_sales > 5000]
print(f"\nProducts with revenue > 5000:")
print(top_products)

# ۶. ماتریس همبستگی
correlation = df[["Quantity", "Price", "Revenue"]].corr()
print("\nCorrelation matrix:")
print(correlation)

# ۷. پرفروش‌ترین روز هفته
df["Weekday"] = df["Date"].dt.day_name()
weekday_sales = df.groupby("Weekday")["Revenue"].sum().sort_values(ascending=False)
print("\nRevenue by weekday:")
print(weekday_sales)

📌 نکات کلیدی

← قبلی: مبانی NumPy → بعدی: مبانی Matplotlib ↑ بازگشت به فهرست متوسط