۵ تابع مفید پانداز در پایتون — راهنمای کاربردی
در کارهای روزمره پردازش داده مربوط به پروژههای یادگیری ماشین و علوم داده، کتابخانه «پانداز» (Pandas) یکی از پرکاربردترین کتابخانههای پایتون محسوب میشود. این کتابخانه همچون کتابخانه Numpy بر حوزه علوم داده، یادگیری ماشین و برنامهنویسی هوش مصنوعی حکمفرمایی میکند و تابعهای داخلی مفیدی دارد که برای کاربردهای مختلف مناسب است. در این مقاله به بررسی 5 تابع مفید پانداز در پایتون میپردازیم که موجب شده این کتابخانه چنین آوازه بلندی در میان دانشمندان داده و مهندسان یادگیری ماشین کسب کند.
تابع ()shift
فرض کنید در موقعیتی هستید که باید همه ردیفها را در یک دیتافریم شیفت کنید و یا باید از قیمت قبلی یک سهم در یک دیتافریم استفاده کنید. یا ممکن است بخواهید یک دمای میانگین برای سه روز اخیر در یک دیتاست بسازیم. در هر صورت تابع shift() یک روش مناسب برای انجام همه این کارها محسوب میشود.
تابع shift() در پانداز موجب جابجایی اندیس به تعداد پریودهای مطلوب میشود. این تابع یک پارامتر اسکالر میگیرد که «پریود» (Period) نام دارد و نشاندهنده تعداد شیفتها در محور مطلوب است. این تابع در زمان کار با دادههای سری زمانی بسیار مفید واقع میشود. میتوان از fill_value برای پر کردن فراتر از مقادیر کرانی استفاده کرد.
1import pandas as pd
2import numpy as np
3df = pd.DataFrame({'DATE': [1, 2, 3, 4, 5],
4 'VOLUME': [100, 200, 300,400,500],
5 'PRICE': [214, 234, 253,272,291]})
6print(df)
7
8 DATE VOLUME PRICE
90 1 100 214
101 2 200 234
112 3 300 253
123 4 400 272
134 5 500 291
14df.shift(1)
15DATE VOLUME PRICE
160 NaN NaN NaN
171 1.0 100.0 214.0
182 2.0 200.0 234.0
193 3.0 300.0 253.0
204 4.0 400.0 272.0
21# with fill_Value = 0
22df.shift(1,fill_value=0)
23DATE VOLUME PRICE
240 0 0 0
251 1 100 214
262 2 200 234
273 3 300 253
284 4 400 272
اکنون اگر بخواهیم قیمت سهم قبلی را به صورت یک ستون جدید بگیریم، میتوانیم از شیفت به صورت زیر استفاده کنیم:
1df['PREV_DAY_PRICE'] = df['PRICE'].shift(1,fill_value=0)
2print(df)
3DATE VOLUME PRICE PREV_DAY_PRICE
40 1 100 214 0
51 2 200 234 214
62 3 300 253 234
73 4 400 272 253
84 5 500 291 272
بدین ترتیب میتوانیم قیمت سهام میانگین را برای سه روز اخیر به صورت زیر محاسبه کرده و یک ستون فیچر جدید ایجاد کنیم:
1df['LAST_3_DAYS_AVE_PRICE'] = (df['PRICE'].shift(1,fill_value=0) +
2 df['PRICE'].shift(2,fill_value=0) +
3 df['PRICE'].shift(3,fill_value=0))/3
اینک دیتافریم باید به صورت زیر آمده باشد:
1DATE VOLUME PRICE LAST_3_DAYS_AVE_PRICE
20 1 100 214 0.000000
31 2 200 234 71.333333
42 3 300 253 149.333333
53 4 400 272 233.666667
64 5 500 291 253.000000
حتی میتوانیم پا را از این فراتر گذاشته و مقداری را از دوره زمانی بعد یا ردیف بعدی بگیریم:
df['TOMORROW_PRICE'] = df['PRICE'].shift(-1,fill_value=0)
اکنون دیتافریم باید به صورت زیر درآمده باشد:
1DATE VOLUME PRICE TOMORROW_PRICE
20 1 100 214 234
31 2 200 234 253
42 3 300 253 272
53 4 400 272 291
64 5 500 291 0
برای کسب اطلاعات بیشتر در مورد گزینهها و تنظیمات این تابع به مستندات رسمی پانداز (+) مراجعه کنید.
تابع ()value_counts
تابع ()value_counts در پانداز یک شیء بازگشت میدهد که شامل شمار مقادیر یکتا است. شیء حاصل میتواند با ترتیب صعودی یا نزولی ذخیره شود و از طریق کنترل پارامتر، NA را در آن شامل یا استثنا کرد. در ادامه این تابع را با یک مثال عملی بررسی میکنیم. این تابع میتواند برای اندیس یا سریهای پانداز مورد استفاده قرار گیرد.
1a = pd.Index([3,3,4,2,1,3, 1, 2, 3, 4, np.nan,4,6,7])
2a.value_counts()
3#Output
43.0 4
54.0 3
61.0 2
72.0 2
87.0 1
96.0 1
10dtype: int64
در ادامه مثالی از سریها میبینید:
1#In
2b = pd.Series(['ab','bc','cd',1,'cd','cd','bc','ab','bc',1,2,3,2,3,np.nan,1,np.nan])
3b.value_counts()
4#Out
5bc 3
6cd 3
71 3
83 2
9ab 2
102 2
11dtype: int64
اما این گزینه میتواند به جای شمارش دفعات ظهور یک مقدار برای تقسیم اندیس در شماره مفروض دسته (bin)-های نیمه-باز نیز مورد استفاده قرار گیرد.
1#In
2a = pd.Index([3,3,4,2,1,3, 1, 2, 3, 4, np.nan,4,6,7])
3a.value_counts(bins=4)
4#Out
5(2.5, 4.0] 7
6(0.993, 2.5] 4
7(5.5, 7.0] 2
8(4.0, 5.5] 0
9dtype: int64
برای کسب اطلاعات بیشتر در مورد گزینهها و تنظیمات این تابع به مستندات رسمی پانداز (+) مراجعه کنید.
تابع ()mask
متد ماسک یک کاربرد شرط if-else برای هر عنصر یک سری یا دیتافریم است. اگر Cond به صورت True باشد، در این صورت از مقدار Other (مقدار پیشفرض آن NaN است)، استفاده میکند؛ در غیر این صورت، مقدار اصلی را حفظ میکند. این متد ()mask کاملاً مشابه ()where است.
به دیتافریم زیر توجه کنید که میخواهیم علامت همه عناصری را که بر دو (بدون باقیمانده) بخشپذیر هستند، تغییر دهیم:
این کار با استفاده از تابع ماسک به سهولت قابل حصول است:
1df = pd.DataFrame(np.arange(15).reshape(-1, 3), columns=['A', 'B','C'])
2print(df)
3#Out
4 A B C
50 0 1 2
61 3 4 5
72 6 7 8
83 9 10 11
94 12 13 14
10#mask operation to check if element is divided by 2 without any remainder. If match change the sign of the element as original
11df.mask(df % 2 == 0,-df)
12#Out
13A B C
140 0 1 -2
151 3 -4 5
162 -6 7 -8
173 9 -10 11
184 -12 13 -14
برای کسب اطلاعات بیشتر در خصوص متد ()mask به مستندات رسمی پانداز (+) مراجعه کنید.
تابع ()nlargest
در اغلب موارد، با موقعیتهایی مواجه میشویم که باید 3 مقدار فوقانی یا پنج مقدار تحتانی برای یک سری یا دیتافریم به دست آوریم. برای نمونه فرض کنید میخواهیم سه دانشجوی برتر را بر اساس نمره نهایی بیابیم یا سه کاندیدای ضعیف را بر حسب کل آرای کسب کرده در یک انتخابات مشخص سازیم.
متدهای ()nlargest و ()nsmallest در پانداز بهترین راهحل برای چنین الزامات پردازش دادهای هستند. مثال زیر سه مورد از بیشترین قد افراد را از یک دیتافریم با 10 مشاهده نمایش میدهد:
1import pandas as pd
2import numpy as np
3df = pd.DataFrame({'HEIGHT': [170,78,99,160,160,130,155,70,70,20],
4 'WEIGHT': [50,60,70,80,90,90,90,50,60,70]},
5 index=['A','B','C','D','E','F','G','H','I','J'])
6print(df)
7HEIGHT WEIGHT
8A 170 50
9B 78 60
10C 99 70
11D 160 80
12E 160 90
13F 130 90
14G 155 90
15H 70 50
16I 70 60
17J 20 70
18dfl = df.nlargest(3,'HEIGHT')
19print(dfl)
20HEIGHT WEIGHT
21A 170 50
22D 160 80
23E 160 90
اگر دو مورد یکسان باشند، چند گزینه برای حل مشکل با استفاده از first ،last ،all وجود دارد. میتوانیم همه رخدادها را حفظ کنیم. تلاش میکنیم دو مورد از بلندترین قدها را در مثال زیر پیدا کنیم.
1dfl = df.nlargest(2,'HEIGHT',keep='all')
2print(dfl)
3HEIGHT WEIGHT
4A 170 50
5D 160 80
6E 160 90
آخرین رخداد را نگه میداریم.
1dfl = df.nlargest(2,'HEIGHT',keep='last')
2print(dfl)
3HEIGHT WEIGHT
4A 170 50
5E 160 90
رخداد نخست را نگه میداریم:
1dfl = df.nlargest(2,'HEIGHT',keep='first')
2print(dfl)
3HEIGHT WEIGHT
4A 170 50
5D 160 80
برای کسب اطلاعات بیشتر در خصوص این متد به صفحه مستندات رسمی (+) پانداز مراجعه کنید.
تابع ()nsmallest
تابع ()nsmallest نیز به طرزی مشابه عمل میکند، اما این بار از فیلتر کوچکترین استفاده میکند. در مثال زیر از گزینه وزن برای یافتن کمترین دو وزن استفاده میکنیم:
1import pandas as pd
2import numpy as np
3df = pd.DataFrame({'HEIGHT': [170,78,99,160,160,130,155,70,70,20],
4 'WEIGHT': [50,60,70,80,90,90,90,50,60,70]},
5 index=['A','B','C','D','E','F','G','H','I','J'])
6print(df)
7HEIGHT WEIGHT
8A 170 50
9B 78 60
10C 99 70
11D 160 80
12E 160 90
13F 130 90
14G 155 90
15H 70 50
16I 70 60
17J 20 70
18dfs = df.nsmallest(3,'WEIGHT')
19print(dfs)
20HEIGHT WEIGHT
21A 170 50
22H 70 50
23B 78 60
برای کسب اطلاعات بیشتر در خصوص این متد به صفحه مستندات رسمی (+) پانداز مراجعه کنید.
سخن پایانی
پنج تابع پانداز وجود دارند که نه تنها مفید و عالی هستند، بلکه کارکرد کاملاً مشخص و روشنی دارند. در این مقاله با این تابعها آشنا شدیم. شما میتوانید از این تابعها برای ایجاد سهولت در محاسبات مختلف استفاده کنید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای برنامهنویسی پایتون Python
- مجموعه آموزشهای برنامهنویسی
- گنجینه آموزشهای برنامهنویسی پایتون (Python)
- پانداس (Pandas) — از صفر تا صد
- دیتافریم (DataFrame) در کتابخانه Pandas — راهنمای مقدماتی
==