لازم به ذکره این دوره نسخه ترجمه شده دوره ماشین لرنینگ سایت SoloLearn هست و من فقط ترجمه اون رو انجام دادم.
در این پارت ما با کتابخونه Numpy آشنا میشیم
در واقع Numpy یه پکیج پایتونه که باهاش جدول های مقادیر عددی و لیست هارو دستکاری میکنیم. باهاش میشه کلی محاسبات آماری انجام داد. همچنین ما تو Numpy به لیست یا جدول دیتا یه آرایه Numpy یا Numpy Array میگیم.
ما معمولا این دیتارو به صورت دیتافریم Pandas میگیریم و به آرایه Numpy تبدیلش میکنیم. دیتافریم های Pandas از این جهت خیلی خوبن که ما اسم ستون ها و بقیه اطلاعات متنی رو داریم که باعث میشه خوندنشون برای آدما خیلی راحت باشه. یه دیتافریم Pandas، در عین حال که خوندنش برای آدما آسونه؛ فرمت ایده آل برای انجام محاسبات نیست. آرایه های Numpy درسته که خوندنشون برای آدما سخت تره، اما فرمتی که دارن باعث میشه بتونیم محاسبات لازم رو روشون انجام بدیم.
" در واقع Numpy یه ماژول پایتون برای انجام محاسبات روی جدول های دیتاست. منشا Pandas، Numpy هست"
ما معمولا درحالی شروع به کار میکنیم که دیتامون به شکل یه دیتافریم Pandas هست، ولی بعدش نیاز پیدا میکنیم که دیتامون رو به شکل آرایه Numpy در بیاریم.
در واقع این کار توسط اتریبیوتِ (attribute) values انجام میشه.
بیاید ستون Fare(کرایه) رو به یه آرایه Numpy تبدیل کنیم.
اول یادآوری میکنم که با استفاده از یه جفت Bracket ما ستون Fare رو سلکت میکنیم:
df[‘fare’]
بعد از اتریبیوت values استفاده میکنیم تا مقادیر رو به صورت یه آرایه Numpy بگیریم.
df[‘Fare’].values
کد کامل:
import pandas as pd
df = pd.read_csv('https://sololearn.com/uploads/files/titanic.csv')
print(df['Fare'].values)
و این چیزیه که آرایه بالا به نظر میاد:
array([ 7.25 , 71.2833, 7.925, 53.1, 8.05, 8.4583,...
نتیجه یه آرایه 1 بعدی هست. اینو ازونجا میتونیم بگیم که فقط 1 مجموعه Bracket ( [] ) داریم و آرایه مون فقط بطور افقی ادامه پیدا میکنه.
اتریبیوت values یه سری Pandas اون رو به صورت یه آرایه Numpy به ما میده
اگر ما به جای یه سری Pandas یه دیتافریم Pandas داشته باشیم، ما بازم میتونیم از اتریبیوت values استفاده کنیم اما ایندفعه بهمون یه آرایه Numpy 2 بعدی برمیگردونه.
یادتون باشه ما برای ساختن یه دیتافریم Pandas از سینتکس زیر استفاده میکنیم:
df[[‘Pclass’, ‘Fare’, ‘Age’]]
دوباره، ما برای گرفتن یه آرایه Numpy ازش، از اتریبیوت values استفاده میکنیم.
df[‘Pclass’, ‘Fare’, ‘Age’]].values
کد کامل:
import pandas as pd
df = pd.read_csv('https://sololearn.com/uploads/files/titanic.csv')
print(df[['Pclass', 'Fare', 'Age']].values)
این چیزیه که آرایه بالا به نظر میرسه:
array([[ 3. , 7.25 , 22. ],
[ 1. , 71.2833, 38. ],
[ 3. , 7.925 , 26. ],
... ,
[ 3. , 23.45 , 7. ],
[ 1. , 30. , 26. ],
[ 3. , 7.75 , 32. ]])
این یه آرایه 2 بعدیه؛ اینو ازونجا میتونیم بگیم که 2 مجموعه Bracket ( [] ) داریم و هم آرایه مون افقی و هم عمودی گسترش پیدا میکنه.
اتریبیوت values اگر روی یه دیتافریم Pandas اعمال بشه، یه آرایه 2بعدی به ما برمیگردونه.
ما برای مشخص کردن اندازه (size) آرایه Numpy مون از اتریبیوت Shape استفاده میکنیم. در واقع این اتریبیوت به ما میگه که آرایه ما چند ستون و ردیف داره.
بیاید اول یه آرایه با استفاده از Pclass و Fare و Ageبسازیم:
arr = df[[‘Pclass’, ‘Fare’, ‘Age’]].values
اگر ما به shape نگاه کنیم، تعداد ستون ها و ردیف هارو بهمون نشون میده:
print(arr.shape)
خروجی: (887,3)
این نتیجه این معنی رو میده که ما 887 ردیف و 3 ستون داریم.
"از اتریبیوت Shape برای پیدا کردن تعداد ردیف ها و ستون های یه آرایه Numpy استفاده کنید. شما همچنین میتونید از shape روی یک دیتافریم Pandas استفاده کنید ( df.shape )."
از یک آرایه Numpy انتخاب کنیم!
بیاید فرض کنیم ما آرایه Numpy زیر رو ساختیم:
arr = df[[‘Pclass’, ‘Fare’, ‘Age’]].values
ما میتونیم یه عنصر(المنت/element) منفرد رو از یه ارایهNumpy به شکل زیر انتخاب کنیم:
arr[0, 1]
این به معنی ستون دوم ( ایندکس(شاخص) از 0 شروع میشه پس 1 به معنی ستون دومه) ردیف اول ( ایندکس 0) هست. (یادتون باشه سینتکس بصورت (rows, columns) هست یعنی اول ردیف و بعد ستون رو وارد میشه)
پس، کرایه اولین مسافر 7.25 بوده که خروجی کد بالاست?
ما همچنین میتونیم کل ردیف اول رو از مسافر اول بگیریم( ایندفعه بدون مشخص کردن یه ستون خاص):
print(arr[0])
برای مشخص کردن یه ستون منفرد، مثلا در این مورد ستون Age، باید از یه سینتکس خاص استفاده کنیم(توضیحات اضافه : اسم این سینتکس slicing به معنی برش زدن هست و در زبان پایتون معمولا برای جدا کردن قسمتی از string ها یا list ها کاربرد داره، خصوصا تو List ها) :
print(arr[ : , 2])
این سینتکس میتونه به این شکل تفسیر بشه که ما داریم همه ردیف هارو میگیریم، اما فقط از ستون با ایندکس 2 ( یعنی ستون چندم؟).
"با استفاده از سینتکس های متفاوت در میان Bracketها، ما میتونیم مقادیر منفرد، ردیف کامل یا ستون کامل رو انتخاب (جدا) کنیم."
بعضی وقتا ما میخوایم تمام ردیف هاییو انتخاب کنیم که یه سری خصوصیات ( criteria ) خاصی دارن.
مثلا در این مثال ما تمام ردیف هایی ( مسافر هایی) که بچه ان ( در واقع در ستون Age مقداری کمتر از 18 دارن) رو انتخاب میکنیم.
یادآوری نحوه انتخاب کردن و ساخت آرایه اون:
arr = df[[‘Pclass’, ‘Fare’, ‘Age’]].values
یادتون باشه که ما ستون Age رو به شکل زیر ازآرایه میگیریم:
arr[ : , 2]
ما اول چیزیو میسازیم که بهش Mask میگیم. در واقع Mask یه آرایه از مقادیر Boolean (True/False) که بهمون میگه آیا این مسافر بچه/کودک هست یا نه.
mask = arr[:, 2] < 18
بیاید یه نگاهی به آرایه mask بندازیم تا مطمئن بشیم میفهمیم چی به چیه:
array([False, False, False, False, False, False, False, True, False,...
مقدار False در واقع به معنی بالغ بودن فرد (مسافر) و مقدار True به معنی بچه بودن اونه، پس 7 مسافر اول ما فرد بزرگسال/بالغ بودن ولی هشتمین مسافر ما یک کودکه و نهمین مسافر ما بازم یه بزرگساله.
حالا ما از mask استفاده میکنیم تا فقط اون مقادیری رو انتخاب کنیم که برامون مهمن:
arr[mask]
حالا بیاید به این آرایه جدید نگاه کنیم:
array([[3., 21.075, 2.],
[2., 30.0708, 14.],
[3., 16.7, 4.],
[3., 7.8542, 14.],
اگه یادتون باشه ستون سوم سن مسافرین بود، پس تمام ردیف های اینجا متعلق به مسافر هاییه که کودک هستن. ( توضیحات اضافه: درواقع ما اینجا اومدیم از arr فقط اطلاعات مسافرانی رو جمع آوری کردیم که کودک بودن. یعنی تک تک ردیف های این آرایه آخری، Pclass و Fare و Age کودکان بودن نه بزرگسالان مابین اونها)
عموما ما نیازی نداریم که متغیر mask رو تعریف کنیم و کل کار بالا رو میتونیم تو یه خط انجام بدیم:
arr[arr[:, 2] <18]
کد کامل:
import pandas as pd
df = pd.read_csv('https://sololearn.com/uploads/files/titanic.csv')
# take first 10 values for simplicity
arr = df[['Pclass', 'Fare', 'Age']].values[:10]
mask = arr[:, 2] < 18
print(arr[mask])
print(arr[arr[:, 2] < 18])
"یه ماسک یه آرایه Boolean هست که بهمون میگه کدام مقادیر آرایه مورد نظر ما هستن"
فرض کنید میخوایم ببینیم چندتا از مسافرینمون کودک ان. ما همچنان همون تعریف آرایه قبل و داریم و همونطوری باید بچه هارو انتخاب کنیم:
arr = df[['Pclass', 'Fare', 'Age']].values
mask = arr[:, 2] < 18
یادتون باشه که مقادیر True به عنوان 1 و مقادیر False به عنوان 0 تفسیر میشن. ما میتونیم این آرایه رو جمع بزنیم و این در واقع معادل شمردن مقادیر True هست.
(توضیحات اضافه: چون False های ما 0 هستن عملا جمع زدنشون تفاوتی ایجاد نمیکنه و sum ما فقط نتیجه جمع زده شدن True ها ( 1 ها) هست.)
print(mask.sum())
همچنان، ما اونقدرا به متغیر mask نیاز نداریم:
print((arr[:,2] < 18).sum())
کد کامل:
import pandas as pd
df = pd.read_csv('https://sololearn.com/uploads/files/titanic.csv')
# take first 10 values for simplicity
arr = df[['Pclass', 'Fare', 'Age']].values[:10]
mask = arr[:, 2] < 18
print(arr[mask])
print(arr[arr[:, 2] < 18])
جمع زدن یه آرایه مقادیر بولین به ما تعداد مقادیر Trueرو میده