۵ تابع مفید پانداز در پایتون — راهنمای کاربردی

در کارهای روزمره پردازش داده مربوط به پروژههای یادگیری ماشین و علوم داده، کتابخانه «پانداز» (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
اکنون اگر بخواهیم قیمت سهم قبلی را به صورت یک ستون جدید بگیریم، میتوانیم از شیفت به صورت زیر استفاده کنیم:
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 را در آن شامل یا استثنا کرد. در ادامه این تابع را با یک مثال عملی بررسی میکنیم. این تابع میتواند برای اندیس یا سریهای پانداز مورد استفاده قرار گیرد.
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 است.
به دیتافریم زیر توجه کنید که میخواهیم علامت همه عناصری را که بر دو (بدون باقیمانده) بخشپذیر هستند، تغییر دهیم:
این کار با استفاده از تابع ماسک به سهولت قابل حصول است:
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 مشاهده نمایش میدهد:
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 وجود دارد. میتوانیم همه رخدادها را حفظ کنیم. تلاش میکنیم دو مورد از بلندترین قدها را در مثال زیر پیدا کنیم.
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
برای کسب اطلاعات بیشتر در خصوص این متد به صفحه مستندات رسمی (+) پانداز مراجعه کنید.
سخن پایانی
پنج تابع پانداز وجود دارند که نه تنها مفید و عالی هستند، بلکه کارکرد کاملاً مشخص و روشنی دارند. در این مقاله با این تابعها آشنا شدیم. شما میتوانید از این تابعها برای ایجاد سهولت در محاسبات مختلف استفاده کنید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی پایتون Python
- مجموعه آموزشهای برنامهنویسی
- گنجینه آموزشهای برنامهنویسی پایتون (Python)
- پانداس (Pandas) — از صفر تا صد
- دیتافریم (DataFrame) در کتابخانه Pandas — راهنمای مقدماتی
==