ورقة الغش بلدي من الباندا

أخبرني أحد المعلمين ذات مرة أنه إذا كنت تبحث عن نظير مبرمج في عالم الكتب ، فقد اتضح أن المبرمجين ليسوا مثل الكتب الدراسية ، بل جدول المحتويات: لا يتذكرون كل شيء ، لكنهم يعرفون كيف يجدون بسرعة ما يحتاجون إليه.

تتيح القدرة على العثور بسرعة على أوصاف الوظائف للمبرمجين العمل بشكل منتج دون فقدان حالة الدفق. لهذا السبب قمت بإنشاء ورقة الغش المقدمة هنا pandasوأدرجت فيها ما أستخدمه كل يوم ، وأنشئ تطبيقات الويب ونماذج التعلم الآلي. هذه ليست قائمة حصرية بالميزات ، ولكنها تتضمن الوظائف التي أستخدمها كثيرًا ، وأمثلة وشروحي حول المواقف التي تكون فيها هذه الوظائف مفيدة بشكل خاص.



pandas

1. التحضير للعمل


إذا كنت ترغب في اختبار ما سيتم مناقشته هنا بشكل مستقل ، فقم بتنزيل مجموعة بيانات قاعدة بيانات توصيات أنيمي من Kaggle. قم بفك ضغطه ووضعه في نفس المجلد حيث يوجد دفتر ملاحظات Jupyter الخاص بك (فيما يلي - المفكرة).

الآن قم بتشغيل الأوامر التالية.

import pandas as pd
import numpy as np
anime = pd.read_csv('anime-recommendations-database/anime.csv')
rating = pd.read_csv('anime-recommendations-database/rating.csv')
anime_modified = anime.set_index('name')

بعد ذلك ، يجب أن تكون قادرًا على إعادة إنتاج ما سأعرضه في الأقسام التالية من هذه المواد.

2. استيراد البيانات


▍ تنزيل بيانات CSV


هنا أريد أن أتحدث عن تحويل بيانات CSV مباشرة إلى إطارات البيانات (إلى Dataframes). في بعض الأحيان عند تنزيل البيانات بتنسيق CSV ، تحتاج إلى تحديد ترميزها (على سبيل المثال ، قد يبدو encoding='ISO-8859–1'). هذا هو أول شيء يجب عليك القيام به إذا اتضح أنه بعد تحميل البيانات ، يحتوي إطار البيانات على أحرف غير قابلة للقراءة.

anime = pd.read_csv('anime-recommendations-database/anime.csv')


بيانات CSV التي تم تنزيلها

توجد وظيفة مشابهة لتحميل البيانات من ملفات Excelpd.read_excel.

▍ إنشاء إطار بيانات من البيانات المدخلة يدويًا


يمكن أن يكون هذا مفيدًا عندما تحتاج إلى إدخال بيانات بسيطة يدويًا في البرنامج. على سبيل المثال ، إذا كنت بحاجة إلى تقييم التغييرات التي تمر بها البيانات التي تمر عبر خط معالجة البيانات.

df = pd.DataFrame([[1,'Bob', 'Builder'],
                  [2,'Sally', 'Baker'],
                  [3,'Scott', 'Candle Stick Maker']], 
columns=['id','name', 'occupation'])


الإدخال اليدوي

▍ نسخ إطار البيانات


يمكن أن يكون نسخ إطارات البيانات مفيدًا في المواقف التي تحتاج فيها إلى إجراء تغييرات على هذه البيانات ، ولكنك تحتاج أيضًا إلى حفظ الأصل. إذا كانت هناك حاجة لنسخ إطارات البيانات ، فمن المستحسن القيام بذلك على الفور بعد تنزيلها.

anime_copy = anime.copy(deep=True)


نسخة من إطار البيانات

3. تصدير البيانات


▍ تصدير إلى تنسيق CSV


عند تصدير البيانات ، يتم حفظها في نفس المجلد مثل المفكرة. فيما يلي مثال على حفظ الصفوف العشرة الأولى من إطار البيانات ، ولكن ما يتم حفظه بالضبط يعتمد على المهمة المحددة.

rating[:10].to_csv('saved_ratings.csv', index=False)

يمكنك تصدير البيانات كملفات Excel باستخدام الوظيفة df.to_excel.

4. عرض البيانات والبحث عنها


records الحصول على سجلات n من بداية أو نهاية إطار البيانات


أولاً ، لنتحدث عن إخراج nالعناصر الأولى من إطار البيانات. غالبًا ما أستنتج عددًا من العناصر من بداية إطار البيانات في مكان ما في دفتر الملاحظات. هذا يسمح لي بالوصول بسهولة إلى هذه البيانات في حالة نسيان ما هو بالضبط في إطار البيانات. يلعب اختتام العناصر القليلة الأخيرة دورًا مشابهًا.

anime.head(3)
rating.tail(1)


البيانات من بداية إطار البيانات


بيانات من نهاية إطار البيانات

▍ حساب عدد الصفوف في إطار البيانات


الوظيفة len(),التي سأعرضها هنا ليست مدرجة pandas. ولكنها مناسبة تمامًا لحساب عدد صفوف إطارات البيانات. يمكن تخزين نتائج عمله في متغير واستخدامه عند الحاجة.

len(df)
#=> 3

▍عدد عدد القيم الفريدة في العمود


لحساب عدد القيم الفريدة في عمود ، يمكنك استخدام هذا البناء:

len(ratings['user_id'].unique())

▍ الحصول على معلومات إطار البيانات


تتضمن معلومات حول إطار البيانات معلومات عامة حوله ، مثل الرأس وعدد القيم وأنواع بيانات الأعمدة.

anime.info()


معلومات إطار البيانات

هناك وظيفة أخرى مشابهة لـdf.info-df.dtypes. يعرض فقط معلومات حول أنواع بيانات الأعمدة.

statisticsعرض الإحصائيات حول إطار البيانات


إن معرفة المعلومات الإحصائية حول إطار البيانات مفيد جدًا في المواقف التي تحتوي على الكثير من القيم العددية. على سبيل المثال ، فإن معرفة القيم المتوسطة والحد الأدنى والحد الأقصى للعمود ratingيمنحنا بعض الأفكار حول كيفية ظهور إطار البيانات ككل. هنا هو الأمر المقابل:

anime.describe()


إحصائيات إطار البيانات

ountحساب العد


من أجل حساب عدد القيم في عمود معين ، يمكنك استخدام البناء التالي:

anime.type.value_counts()


عد عدد العناصر في العمود

5. استخراج المعلومات من إطارات البيانات


▍إنشاء قائمة أو كائن سلسلة استناداً إلى قيم العمود


هذا يمكن أن يكون مفيدا في الحالات التي تريد استخراج قيم الأعمدة إلى متغيرات xو yلتدريب النموذج. تنطبق الأوامر التالية هنا:

anime['genre'].tolist()
anime['genre']


نتائج الأنمي [النوع] أمر Tolist ()


Anime ['النوع'] نتائج الفريق

▍ الحصول على قائمة القيم من الفهرس


لنتحدث عن الحصول على قوائم القيم من الفهرس. يرجى ملاحظة أنني استخدمت إطار البيانات هنا anime_modified، حيث تبدو قيم الفهرس أكثر إثارة للاهتمام.

anime_modified.index.tolist()


نتائج الفريق

▍ الحصول على قائمة قيم العمود


فيما يلي أمر يسمح لك بالحصول على قائمة بقيم الأعمدة:

anime.columns.tolist()


نتائج الفريق

6. إضافة البيانات إلى إطار البيانات وإزالتها منه


▍ توصيل عمود جديد بقيمة محددة لإطار البيانات


أحيانًا أضطر إلى إضافة أعمدة جديدة إلى إطارات البيانات. على سبيل المثال ، في الحالات التي لدي فيها مجموعات اختبار وتدريب في إطارين مختلفين للبيانات ، وقبل دمجها ، أحتاج إلى تمييزها بحيث يمكن تمييزها لاحقًا. لهذا ، يتم استخدام البناء التالي:

anime['train set'] = True

▍ إنشاء إطار بيانات جديد من مجموعة فرعية من الأعمدة


يمكن أن يكون هذا مفيدًا إذا كنت تريد حفظ عدة أعمدة لإطار بيانات ضخم في إطار البيانات الجديد ، ولكنك لا تريد كتابة أسماء الأعمدة التي تريد حذفها.

anime[['name','episodes']]


نتيجة الأمر

▍ حذف الأعمدة المحددة


قد تكون هذه التقنية مفيدة إذا كنت بحاجة إلى إزالة أعمدة قليلة فقط من إطار البيانات. إذا كنت بحاجة إلى حذف العديد من الأعمدة ، فقد تكون هذه المهمة شاقة للغاية ، لذلك أفضل هنا استخدام الفرصة الموضحة في القسم السابق.

anime.drop(['anime_id', 'genre', 'members'], axis=1).head()


نتائج الفريق

▍إضافة صف بمجموع القيم من الصفوف الأخرى إلى إطار البيانات


لتوضيح هذا المثال ، سنقوم بشكل مستقل بإنشاء إطار بيانات صغير ملائم للعمل معه. الشيء الأكثر إثارة للاهتمام هنا هو التصميم df.sum(axis=0)، الذي يسمح لك بالحصول على مجموع القيم من صفوف مختلفة. 

df = pd.DataFrame([[1,'Bob', 8000],
                  [2,'Sally', 9000],
                  [3,'Scott', 20]], columns=['id','name', 'power level'])
df.append(df.sum(axis=0), ignore_index=True)


نتيجة الأمر يسمح لك

أمر العرضdf.sum(axis=1)بجمع القيم في الأعمدة.

تنطبق آلية مماثلة أيضًا لحساب متوسط ​​القيم. على سبيل المثال -df.mean(axis=0).

7. دمج إطارات البيانات


▍ تسلسل إطارين للبيانات


هذه التقنية قابلة للتطبيق في الحالات التي يوجد فيها إطاران للبيانات مع نفس الأعمدة التي تحتاج إلى الجمع.

في هذا المثال ، قمنا أولاً بتقسيم إطار البيانات إلى قسمين ، ثم دمج هذه الأجزاء مرة أخرى:

df1 = anime[0:2]
df2 = anime[2:4]
pd.concat([df1, df2], ignore_index=True)


Dataframe df1


إطار البيانات df2


Dataframe يجمع بين df1 و df2

frames دمج إطارات البيانات


الوظيفة df.mergeالتي سننظر إليها هنا تشبه صلة SQL اليسرى. يتم استخدامه عند الحاجة إلى دمج إطارين للبيانات في عمود معين.

rating.merge(anime, left_on=’anime_id’, right_on=’anime_id’, suffixes=(‘_left’, ‘_right’))


نتائج الفريق

8. التصفية


▍ الحصول على صفوف بقيم المؤشر المطلوبة


قيم الفهرس لإطار البيانات anime_modifiedهي أسماء الأنمي. لاحظ كيف نستخدم هذه الأسماء لتحديد أعمدة معينة.

anime_modified.loc[['Haikyuu!! Second Season','Gintama']]


نتائج الفريق

▍ الحصول على سلاسل بمؤشرات رقمية


تختلف هذه التقنية عن تلك الموضحة في القسم السابق. عند استخدام الوظيفة ، df.ilocيتم تعيين فهرس للسطر الأول 0، والثاني هو فهرس 1، وهكذا. يتم تعيين هذه الفهارس للصفوف حتى إذا تم تعديل إطار البيانات واستخدام قيم السلسلة في عمود الفهرس الخاص به.

يسمح لك البناء التالي بتحديد الصفوف الثلاثة الأولى من إطار البيانات:

anime_modified.iloc[0:3]


نتائج الفريق

▍ الحصول على الصفوف بقيم عمود معينة


للحصول على صفوف لإطار بيانات في حالة وجود قائمة بقيم الأعمدة ، يمكنك استخدام الأمر التالي:

anime[anime['type'].isin(['TV', 'Movie'])]


نتائج الأمر

إذا كنا مهتمين بمعنى واحد - يمكنك استخدام هذا التصميم:

anime[anime[‘type’] == 'TV']

▍ الحصول على شريحة إطار البيانات


تشبه هذه التقنية الحصول على شريحة من القائمة. وبالتحديد ، نتحدث عن الحصول على جزء من إطار بيانات يحتوي على صفوف تتوافق مع تكوين فهرس معين.

anime[1:3]


نتائج الفريق

▍ التصفية حسب القيمة


من إطارات البيانات ، يمكنك تحديد الصفوف التي تطابق الشرط المحدد. يرجى ملاحظة أن استخدام هذه الطريقة يحافظ على قيم الفهرس الموجودة.

anime[anime['rating'] > 8]


نتائج الفريق

9. الفرز


لفرز إطارات البيانات حسب قيم الأعمدة ، يمكنك استخدام الوظيفة df.sort_values:

anime.sort_values('rating', ascending=False)


نتائج الفريق

10. التجميع


▍Df.groupby دالة وحساب عدد السجلات


إليك كيفية حساب عدد السجلات ذات القيم المختلفة في الأعمدة:

anime.groupby('type').count()


نتائج الفريق

function دالة df.groupby وتجميع الأعمدة بطرق مختلفة


انتبه إلى ما يتم استخدامه هنا reset_index(). خلاف ذلك ، typeيصبح العمود عمود فهرس. في معظم الحالات ، أوصي بالقيام بنفس الشيء.

anime.groupby(["type"]).agg({
  "rating": "sum",
  "episodes": "count",
  "name": "last"
}).reset_index()

▍ قم بإنشاء جدول محوري


لاستخراج بعض البيانات من إطار البيانات ، لا يوجد شيء أفضل من الجدول المحوري. يرجى ملاحظة أنني هنا قمت بتصفية إطار البيانات بجدية ، مما أدى إلى تسريع إنشاء الجدول المحوري.

tmp_df = rating.copy()
tmp_df.sort_values('user_id', ascending=True, inplace=True)
tmp_df = tmp_df[tmp_df.user_id < 10
tmp_df = tmp_df[tmp_df.anime_id < 30]
tmp_df = tmp_df[tmp_df.rating != -1]
pd.pivot_table(tmp_df, values='rating', index=['user_id'], columns=['anime_id'], aggfunc=np.sum, fill_value=0)


نتائج الفريق

11. تنظيف البيانات


▍ اكتب إلى الخلايا التي تحتوي على قيمة NaN لبعض القيم الأخرى


نتحدث هنا عن كتابة القيم 0إلى الخلايا التي تحتوي على القيمة NaN. في هذا المثال ، نقوم بإنشاء نفس الجدول المحوري كما كان من قبل ، ولكن بدون استخدام fill_value=0. ثم استخدم وظيفة fillna(0)لتحل محل القيم NaNمع 0.

pivot = pd.pivot_table(tmp_df, values='rating', index=['user_id'], columns=['anime_id'], aggfunc=np.sum)
pivot.fillna(0)


جدول يحتوي على قيم NaN


نتائج استبدال قيم NaN بـ 0

12. ميزات مفيدة أخرى


pling أخذ عينات عشوائية من مجموعة بيانات


أستخدم الوظيفة في df.sampleكل مرة أحتاج فيها إلى مجموعة صغيرة عشوائية من الصفوف من إطار بيانات كبير. إذا تم استخدام معلمة frac=1، فإن الوظيفة تسمح لك بالحصول على تمثيلي لإطار البيانات الأصلي ، والذي سيتم خلط صفوفه.

anime.sample(frac=0.25)


نتائج الفريق

▍تحديد صفوف إطار البيانات


يتيح لك البناء التالي التكرار عبر صفوف إطار البيانات:

for idx,row in anime[:2].iterrows():
    print(idx, row)


نتائج الفريق

exceed تجاوزت مكافحة معدل البيانات IOPub الخطأ


إذا واجهت خطأ IOPub data rate exceeded، فحاول استخدام الأمر التالي عند بدء Jupyter Notebook:

jupyter notebook — NotebookApp.iopub_data_rate_limit=1.0e10

ملخص


لقد تحدثت هنا عن بعض pandasالحيل المفيدة لاستخدام بيئة Jupyter Notebook. آمل أن تكون ورقة الغش الخاصة بي في متناول اليدين.

القراء الأعزاء! هل هناك أي فرص pandasلا يمكنك تخيل عملك اليومي بدونها؟


All Articles