در کارهای روزمره پردازش داده مربوط به پروژه‌های یادگیری ماشین و علوم داده، کتابخانه «پانداز» (Pandas) یکی از پرکاربردترین کتابخانه‌های پایتون محسوب می‌شود. این کتابخانه همچون کتابخانه Numpy بر حوزه علوم داده، یادگیری ماشین و برنامه‌نویسی هوش مصنوعی حکم‌فرمایی می‌کند و تابع‌های داخلی مفیدی دارد که برای کاربردهای مختلف مناسب است. در این مقاله به بررسی 5 تابع مفید پانداز در پایتون می‌پردازیم که موجب شده این کتابخانه چنین آوازه بلندی در میان دانشمندان داده و مهندسان یادگیری ماشین کسب کند.

تابع ()shift

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

تابع shift()‎ در پانداز موجب جابجایی اندیس به تعداد پریودهای مطلوب می‌شود. این تابع یک پارامتر اسکالر می‌گیرد که «پریود» (Period) ‌نام دارد و نشان‌دهنده تعداد شیفت‌ها در محور مطلوب است. این تابع در زمان کار با داده‌های سری زمانی بسیار مفید واقع می‌شود. می‌توان از fill_value برای پر کردن فراتر از مقادیر کرانی استفاده کرد.

import pandas as pd
import numpy as np
df = pd.DataFrame({'DATE': [1, 2, 3, 4, 5],
                   'VOLUME': [100, 200, 300,400,500],
                   'PRICE': [214, 234, 253,272,291]})
print(df)
  
    DATE  VOLUME  PRICE
0     1     100    214
1     2     200    234
2     3     300    253
3     4     400    272
4     5     500    291
df.shift(1)
DATE  VOLUME  PRICE
0   NaN     NaN    NaN
1   1.0   100.0  214.0
2   2.0   200.0  234.0
3   3.0   300.0  253.0
4   4.0   400.0  272.0
# with fill_Value = 0
df.shift(1,fill_value=0)
DATE  VOLUME  PRICE
0     0       0      0
1     1     100    214
2     2     200    234
3     3     300    253
4     4     400    272

5 تابع مفید پانداز در پایتون

اکنون اگر بخواهیم قیمت سهم قبلی را به صورت یک ستون جدید بگیریم، می‌توانیم از شیفت به صورت زیر استفاده کنیم:

df['PREV_DAY_PRICE'] = df['PRICE'].shift(1,fill_value=0)
print(df)
DATE  VOLUME  PRICE  PREV_DAY_PRICE
0     1     100    214               0
1     2     200    234             214
2     3     300    253             234
3     4     400    272             253
4     5     500    291             272

بدین ترتیب می‌توانیم قیمت سهام میانگین را برای سه روز اخیر به صورت زیر محاسبه کرده و یک ستون فیچر جدید ایجاد کنیم:

df['LAST_3_DAYS_AVE_PRICE'] = (df['PRICE'].shift(1,fill_value=0) + 
                               df['PRICE'].shift(2,fill_value=0) + 
                               df['PRICE'].shift(3,fill_value=0))/3

اینک دیتافریم باید به صورت زیر آمده باشد:

DATE  VOLUME  PRICE     LAST_3_DAYS_AVE_PRICE
0     1     100    214               0.000000
1     2     200    234              71.333333
2     3     300    253             149.333333
3     4     400    272             233.666667
4     5     500    291             253.000000

حتی می‌توانیم پا را از این فراتر گذاشته و مقداری را از دوره زمانی بعد یا ردیف بعدی بگیریم:

df['TOMORROW_PRICE'] = df['PRICE'].shift(-1,fill_value=0)

اکنون دیتافریم باید به صورت زیر درآمده باشد:

DATE  VOLUME  PRICE     TOMORROW_PRICE
0     1     100    214             234
1     2     200    234             253
2     3     300    253             272
3     4     400    272             291
4     5     500    291               0

برای کسب اطلاعات بیشتر در مورد گزینه‌ها و تنظیمات این تابع به مستندات رسمی پانداز (+) مراجعه کنید.

فیلم آموزشی مرتبط

تابع ()value_counts

تابع ()value_counts در پانداز یک شیء بازگشت می‌دهد که شامل شمار مقادیر یکتا است. شی‌ء حاصل می‌تواند با ترتیب صعودی یا نزولی ذخیره شود و از طریق کنترل پارامتر، NA را در آن شامل یا استثنا کرد. در ادامه این تابع را با یک مثال عملی بررسی می‌کنیم. این تابع می‌تواند برای اندیس یا سری‌های پانداز مورد استفاده قرار گیرد.

5 تابع مفید پانداز در پایتون

a = pd.Index([3,3,4,2,1,3, 1, 2, 3, 4, np.nan,4,6,7])
a.value_counts()
#Output
3.0    4
4.0    3
1.0    2
2.0    2
7.0    1
6.0    1
dtype: int64

در ادامه مثالی از سری‌ها می‌بینید:

#In
b = pd.Series(['ab','bc','cd',1,'cd','cd','bc','ab','bc',1,2,3,2,3,np.nan,1,np.nan])
b.value_counts()
#Out
bc    3
cd    3
1     3
3     2
ab    2
2     2
dtype: int64

اما این گزینه می‌تواند به جای شمارش دفعات ظهور یک مقدار برای تقسیم اندیس در شماره مفروض دسته (bin)-های نیمه-باز نیز مورد استفاده قرار گیرد.

#In
a = pd.Index([3,3,4,2,1,3, 1, 2, 3, 4, np.nan,4,6,7])
a.value_counts(bins=4)
#Out
(2.5, 4.0]      7
(0.993, 2.5]    4
(5.5, 7.0]      2
(4.0, 5.5]      0
dtype: int64

برای کسب اطلاعات بیشتر در مورد گزینه‌ها و تنظیمات این تابع به مستندات رسمی پانداز (+) مراجعه کنید.

فیلم آموزشی مرتبط

تابع ()mask

متد ماسک یک کاربرد شرط if-else برای هر عنصر یک سری یا دیتافریم است. اگر Cond به صورت True باشد، در این صورت از مقدار Other (مقدار پیش‌فرض آن NaN است)، استفاده می‌کند؛ در غیر این صورت، مقدار اصلی را حفظ می‌کند. این متد ()mask کاملاً مشابه ()where است.

5 تابع مفید پانداز در پایتون

به دیتافریم زیر توجه کنید که می‌خواهیم علامت همه عناصری را که بر دو (بدون باقیمانده) بخش‌پذیر هستند، تغییر دهیم:

5 تابع مفید پانداز در پایتون

این کار با استفاده از تابع ماسک به سهولت قابل حصول است:

df = pd.DataFrame(np.arange(15).reshape(-1, 3), columns=['A', 'B','C'])
print(df)
#Out
    A   B   C
0   0   1   2
1   3   4   5
2   6   7   8
3   9  10  11
4  12  13  14
#mask operation to check if element is divided by 2 without any remainder. If match change the sign of the element as original
df.mask(df % 2 == 0,-df)
#Out
A   B   C
0   0   1  -2
1   3  -4   5
2  -6   7  -8
3   9 -10  11
4 -12  13 -14

برای کسب اطلاعات بیشتر در خصوص متد ()mask به مستندات رسمی پانداز (+) مراجعه کنید.

فیلم آموزشی مرتبط

تابع ()nlargest

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

متدهای ()nlargest و ()nsmallest در پانداز بهترین راه‌حل برای چنین الزامات پردازش داده‌ای هستند. مثال زیر سه مورد از بیشترین قد افراد را از یک دیتافریم با 10 مشاهده نمایش می‌دهد:

5 تابع مفید پانداز در پایتون

import pandas as pd
import numpy as np
df = pd.DataFrame({'HEIGHT': [170,78,99,160,160,130,155,70,70,20],
                   'WEIGHT': [50,60,70,80,90,90,90,50,60,70]},
                   index=['A','B','C','D','E','F','G','H','I','J'])
print(df)
HEIGHT  WEIGHT
A     170      50
B      78      60
C      99      70
D     160      80
E     160      90
F     130      90
G     155      90
H      70      50
I      70      60
J      20      70
dfl = df.nlargest(3,'HEIGHT')
print(dfl)
HEIGHT  WEIGHT
A     170      50
D     160      80
E     160      90

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

5 تابع مفید پانداز در پایتون

dfl = df.nlargest(2,'HEIGHT',keep='all')
print(dfl)
HEIGHT  WEIGHT
A     170      50
D     160      80
E     160      90

آخرین رخداد را نگه می‌داریم.

dfl = df.nlargest(2,'HEIGHT',keep='last')
print(dfl)
HEIGHT  WEIGHT
A     170      50
E     160      90

رخداد نخست را نگه می‌داریم:

dfl = df.nlargest(2,'HEIGHT',keep='first')
print(dfl)
HEIGHT  WEIGHT
A     170      50
D     160      80

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

فیلم آموزشی مرتبط

تابع ()nsmallest

تابع ()nsmallest نیز به طرزی مشابه عمل می‌کند، اما این بار از فیلتر کوچک‌ترین استفاده می‌کند. در مثال زیر از گزینه وزن برای یافتن کمترین دو وزن استفاده می‌کنیم:

import pandas as pd
import numpy as np
df = pd.DataFrame({'HEIGHT': [170,78,99,160,160,130,155,70,70,20],
                   'WEIGHT': [50,60,70,80,90,90,90,50,60,70]},
                   index=['A','B','C','D','E','F','G','H','I','J'])
print(df)
HEIGHT  WEIGHT
A     170      50
B      78      60
C      99      70
D     160      80
E     160      90
F     130      90
G     155      90
H      70      50
I      70      60
J      20      70
dfs = df.nsmallest(3,'WEIGHT')
print(dfs)
HEIGHT  WEIGHT
A     170      50
H      70      50
B      78      60

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

سخن پایانی

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

اگر این مطلب برای شما مفید بوده است، آموزش‌های زیر نیز به شما پیشنهاد می‌شوند:

==

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

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

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد.

مشاهده بیشتر