عالم البيانات Data Scientist – الجزء الثالث

900

في هذا المقال، سوف نستكمل ما بداناه في ايضاح ما تحتاجه لتكون عالم بيانات لا أكثر ولا أقل. pokemon.csv هي البيانات التي نعمل عليها يمكنك تحميلها من هنا.

المحتوى:

  1. مؤسسة الباندا Panda

    1. استعراض الباندا Panda.
    2. بناء إطارات البيانات من الصفر.
    3. تحليل البيانات الاستطلاعي.
    4. فهرسة سلسلة الباندا Panda بناء على الوقت.
    5. إعادة تشكيل الوقت لسلسلة الباندا Panda.
  2. التلاعب في إطارات البيانات مع الباندا Panda

    1. فهرسة إطارات البيانات.
    2. تقسيم إطارات البيانات.
    3. تصفية إطارات البيانات.
    4. تحويل إطارات البيانات.
    5. فهرسة الكائنات وتسمية البيانات.
    6. الفهرسة الهرمية.
    7. تجميع اطارات البيانات.
    8. حزم والغاء حزم إطارات البيانات.
    9. اذابة اطارات البيانات.
    10. الفئات والتجميع عبر الخصائص.

1- مؤسسة الباندا Panda

i- استعراض الباندا Panda

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

عمود واحد = سلسلة series.

NAN = ليس رقمًا.

dataframe.values = numpy”القيمة لاطار البيانات”.

ii- بناء إطارات البيانات من الصفر

يمكننا إنشاء إطارات البيانات من ملف csv كما فعلنا سابقًا.

كما يمكننا بناء إطارات البيانات من القواميس dictionaries.

الوظيفة ()zip: تقوم هذه الوظيفة بإرجاع قائمة tuples، حيث تحتوي المجموعة المعينة على العنصر المعين من كُل من متواليات sequence أو تكرارات iterators.

إضافة عمود جديد.

البث: قم بإنشاء عمود جديد وقم بتعيين قيمة لعمود بأكمله.

# data frames from dictionary
country = ["Spain","France"]
population = ["11","12"]
list_label = ["country","population"]
list_col = [country,population]
zipped = list(zip(list_label,list_col))
data_dict = dict(zipped)
df = pd.DataFrame(data_dict)
df

النتيجة.

country population
0 Spain 11
1 France 12

 

 

 

 

نضيف عمود جديد.

# Add new columns
df["capital"] = ["madrid","paris"]
df

النتيجة.

country population capital
0 Spain 11 madrid
1 France 12 paris

 

 

 

 

الإذاعة”تغير و القيام بعمليات حسابية علي كل وحدات array.

df["income"] = 0 #Broadcasting entire column
df

النتيجة.

country population capital income
0 Spain 11 madrid 0
1 France 12 paris 0

 

 

 

 

iii- تحليل البيانات الاستطلاعي

المخطط.

المخطط المتعدد.

مخطط التكرار.

لنبدأ برسم مخطط للبيانات.

# Plotting all data
data1 = data.loc[:,["Attack","Defense","Speed"]]
data1.plot()

النتيجة.

C:\Users\mo7md\Desktop\Data ScienceTutorial for Beginners _ Kaggle_files\__results___99_1.png

لا يبدو جيدا اليس كذلك.

لنستعمل المخطط المتعدد.

data1.plot(subplots = True)
plt.show()

النتيجة.

C:\Users\mo7md\Desktop\Data ScienceTutorial for Beginners _ Kaggle_files\__results___100_0.png

المخطط المبعثر.

# scatter plot
data1.plot(kind = "scatter",x="Attack",y = "Defense")
plt.show()

النتيجة.

C:\Users\mo7md\Desktop\Data ScienceTutorial for Beginners _ Kaggle_files\__results___101_0.png

مخطط التكرار.

# hist plot
data1.plot(kind = "hist",y = "Defense",bins = 50,range= (0,250),normed = True)

صناديق bins: عدد الصناديق.

(range (tuble: اقل و اكثر قيم للصناديق.

(normed(boolen: تطبيع normalize أم لا.

النتيجة.

C:\Users\mo7md\Desktop\Data ScienceTutorial for Beginners _ Kaggle_files\__results___102_1.png

مخطط التكرار المتعدد مع تفعيل صفة التراكم مرة والغائها مرة.

(Cumulative(boolen: حساب التوزيع التراكمي.

# histogram subplot with non cumulative and cumulative
fig, axes = plt.subplots(nrows=2,ncols=1)
data1.plot(kind = "hist",y = "Defense",bins = 50,range= (0,250),normed = True,ax = axes[0])
data1.plot(kind = "hist",y = "Defense",bins = 50,range= (0,250),normed = True,ax = axes[1],cumulative = True)
plt.savefig('graph.png')
plt

.النتيجة

C:\Users\mo7md\Desktop\Data ScienceTutorial for Beginners _ Kaggle_files\__results___103_1.png

iv- فهرسة سلسلة الباندا Panda بناء على الوقت

سنقوم بتحويل time_list من قائمة عادية الي صيغة الوقت.

time_list = ["1992-03-08","1992-04-12"]
print(type(time_list[1])) # As you can see date is string
# however we want it to be datetime object
datetime_object = pd.to_datetime(time_list)
print(type(datetime_object))

النتيجة.

<class 'str'>
<class 'pandas.core.indexes.datetimes.DatetimeIndex'>

ولان سنستعملها في الفهرسة.

لنغلق التنبيهات في طريقنا الان.

# close warning
import warnings
warnings.filterwarnings("ignore")
# In order to practice lets take head of pokemon data and add it a time list
data2 = data.head()
date_list = ["1992-01-10","1992-02-10","1992-03-10","1993-03-15","1993-03-16"]
datetime_object = pd.to_datetime(date_list)
data2["date"] = datetime_object
# lets make date as index
data2= data2.set_index("date")
data2

النتيجة.

# Name Type 1 Type 2 HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary
date
1992-01-10 1 Bulbasaur Grass Poison 45 49 49 65 65 45.0 1 False
1992-02-10 2 Ivysaur Grass Poison 60 62 63 80 80 60.0 1 False
1992-03-10 3 Venusaur Grass Poison 80 82 83 100 100 80.0 1 False
1993-03-15 4 Mega Venusaur Grass Poison 80 100 123 122 120 80.0 1 False
1993-03-16 5 Charmander Fire NaN 39 52 43 60 50 65.0 1 False

لنختبر الفهرسة عبر الوقت.

# Now we can select according to our date index
print(data2.loc["1993-03-16"])
print(data2.loc["1992-03-10":"1993-03-16"])

النتيجة.

# 5
Name Charmander
Type 1 Fire
Type 2 NaN
HP 39
Attack 52
Defense 43
Sp. Atk 60
Sp. Def 50
Speed 65
Generation 1
Legendary False
Name: 1993-03-16 00:00:00, dtype: object
# Name Type 1 ... Speed Generation Legendary
date ...
1992-03-10 3 Venusaur Grass ... 80.0 1 False
1993-03-15 4 Mega Venusaur Grass ... 80.0 1 False
1993-03-16 5 Charmander Fire ... 65.0 1 False
[3 rows x 12 columns]

v- إعادة تشكيل الوقت لسلسلة الباندا Panda

إعادة التشكيل: طريقة إحصائية تستخدم على فترات زمنية مختلفة خلال السلسلة.

يحتاج إلى رموز لتحديد التردد مثل “M” = شهر أو “A” = سنة.

الاختزال: تقليل صفوف وقت التمر إلى تباطؤ التردد مثل من يومي إلى أسبوعي.

تكبير: زيادة صفوف وقت التاريخ إلى تردد أسرع مثل من اليومية إلى كل ساعة.

الاقحام interpolation: ادخال قيم وفقًا لطرق مختلفة مثل “خطي” أو “وقت” أو فهرس “.

لنكمل على ما بدأناه سابقا.

# We will use data2 that we create at previous part
data2.resample("A").mean()
# HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary
date
1992-12-31 2.0 61.666667 64.333333 65.0 81.666667 81.666667 61.666667 1.0 False
1993-12-31 4.5 59.500000 76.000000 83.0 91.000000 85.000000 72.500000 1.0 False

ولان لنغير لنعيد تشكيل الشهور.

data2.resample("M").mean()
# HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary
date
1992-01-31 1.0 45.0 49.0 49.0 65.0 65.0 45.0 1.0 0.0
1992-02-29 2.0 60.0 62.0 63.0 80.0 80.0 60.0 1.0 0.0
1992-03-31 3.0 80.0 82.0 83.0 100.0 100.0 80.0 1.0 0.0
1992-04-30 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1992-05-31 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1992-06-30 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1992-07-31 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1992-08-31 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1992-09-30 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1992-10-31 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1992-11-30 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1992-12-31 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1993-01-31 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1993-02-28 NaN NaN NaN NaN NaN NaN NaN NaN NaN
1993-03-31 4.5 59.5 76.0 83.0 91.0 85.0 72.5 1.0 0.0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 ستلاحظ وجود الكثير من الخانات NAN لأننا لا نملك بيانات لكل الشهور.

في الاصل (في البيانات الاصلية. ليس التي يتم إنشاؤها من قبلنا مثل data2)لا نملك كل القيم للوقت, لكن يمكننا حل هذه المشكلة مع interpolate

يمكننا الاقحام من القيمة الأولى.

data2.resample("M").first().interpolate("linear")

النتيجة.

# Name Type 1 Type 2 HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary
date
1992-01-31 1.000000 Bulbasaur Grass Poison 45.0 49.0 49.000000 65.000000 65.000000 45.0 1.0 False
1992-02-29 2.000000 Ivysaur Grass Poison 60.0 62.0 63.000000 80.000000 80.000000 60.0 1.0 False
1992-03-31 3.000000 Venusaur Grass Poison 80.0 82.0 83.000000 100.000000 100.000000 80.0 1.0 False
1992-04-30 3.083333 NaN NaN NaN 80.0 83.5 86.333333 101.833333 101.666667 80.0 1.0 NaN
1992-05-31 3.166667 NaN NaN NaN 80.0 85.0 89.666667 103.666667 103.333333 80.0 1.0 NaN
1992-06-30 3.250000 NaN NaN NaN 80.0 86.5 93.000000 105.500000 105.000000 80.0 1.0 NaN
1992-07-31 3.333333 NaN NaN NaN 80.0 88.0 96.333333 107.333333 106.666667 80.0 1.0 NaN
1992-08-31 3.416667 NaN NaN NaN 80.0 89.5 99.666667 109.166667 108.333333 80.0 1.0 NaN
1992-09-30 3.500000 NaN NaN NaN 80.0 91.0 103.000000 111.000000 110.000000 80.0 1.0 NaN
1992-10-31 3.583333 NaN NaN NaN 80.0 92.5 106.333333 112.833333 111.666667 80.0 1.0 NaN
1992-11-30 3.666667 NaN NaN NaN 80.0 94.0 109.666667 114.666667 113.333333 80.0 1.0 NaN
1992-12-31 3.750000 NaN NaN NaN 80.0 95.5 113.000000 116.500000 115.000000 80.0 1.0 NaN
1993-01-31 3.833333 NaN NaN NaN 80.0 97.0 116.333333 118.333333 116.666667 80.0 1.0 NaN
1993-02-28 3.916667 NaN NaN NaN 80.0 98.5 119.666667 120.166667 118.333333 80.0 1.0 NaN
1993-03-31 4.000000 Mega Venusaur Grass Poison 80.0 100.0 123.000000 122.000000 120.000000 80.0 1.0 False

ونستطيع أيضا اقحام المتوسط.

data2.resample("M").mean().interpolate("linear")

النتيجة.

# HP Name Type 1 Type 2 Attack Defense Sp. Atk Sp. Def Speed Generation Legendary
date
1992-01-31 1.000 45.000000 Bulbasaur Grass Poison 49.0 49.0 65.00 65.00 45.000 1.0 0.0
1992-02-29 2.000 60.000000 Ivysaur Grass Poison 62.0 63.0 80.00 80.00 60.000 1.0 0.0
1992-03-31 3.000 80.000000 Venusaur Grass Poison 82.0 83.0 100.00 100.00 80.000 1.0 0.0
1992-04-30 3.125 78.291667 NaN NaN NaN 81.5 83.0 99.25 98.75 79.375 1.0 0.0
1992-05-31 3.250 76.583333 NaN NaN NaN 81.0 83.0 98.50 97.50 78.750 1.0 0.0
1992-06-30 3.375 74.875000 NaN NaN NaN 80.5 83.0 97.75 96.25 78.125 1.0 0.0
1992-07-31 3.500 73.166667 NaN NaN NaN 80.0 83.0 97.00 95.00 77.500 1.0 0.0
1992-08-31 3.625 71.458333 NaN NaN NaN 79.5 83.0 96.25 93.75 76.875 1.0 0.0
1992-09-30 3.750 69.750000 NaN NaN NaN 79.0 83.0 95.50 92.50 76.250 1.0 0.0
1992-10-31 3.875 68.041667 NaN NaN NaN 78.5 83.0 94.75 91.25 75.625 1.0 0.0
1992-11-30 4.000 66.333333 NaN NaN NaN 78.0 83.0 94.00 90.00 75.000 1.0 0.0
1992-12-31 4.125 64.625000 NaN NaN NaN 77.5 83.0 93.25 88.75 74.375 1.0 0.0
1993-01-31 4.250 62.916667 NaN NaN NaN 77.0 83.0 92.50 87.50 73.750 1.0 0.0
1993-02-28 4.375 61.208333 NaN NaN NaN 76.5 83.0 91.75 86.25 73.125 1.0 0.0
1993-03-31 4.500 59.500000 Mega Venusaur Grass Poison 76.0 83.0 91.00 85.00 72.500 1.0 0.0

2- التلاعب في إطارات البيانات مع الباندا Panda

i- فهرسة إطارات البيانات

الفهرسة باستخدام الأقواس المربعة.

استخدام سمة العمود وتسمية الصف.

باستخدام موصل loc.

اختيار بعض الأعمدة فقط.

لنقرا ملف البيانات ونخصص رمز للفهرسة.

# read data
data = pd.read_csv('../input/pokemon.csv')
data= data.set_index("#")
data.head()

النتيجة.

Name Type 1 Type 2 HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary
#
1 Bulbasaur Grass Poison 45 49 49 65 65 45 1 False
2 Ivysaur Grass Poison 60 62 63 80 80 60 1 False
3 Venusaur Grass Poison 80 82 83 100 100 80 1 False
4 Mega Venusaur Grass Poison 80 100 123 122 120 80 1 False
5 Charmander Fire NaN 39 52 43 60 50 65 1 False

 

 

 

 

 

 

 

 

 

الفهرسة باستخدام الأقواس المربعة.

data["HP"][1]

النتيجة.

45

استخدام سمة العمود وتسمية الصف.

data.HP[1]

النتيجة.

45

باستخدام موصل loc.

data.loc[1,["HP"]]

النتيجة.

HP 45
Name: 1, dtype: object

اختيار بعض الأعمدة فقط.

data[["HP","Attack"]]

النتيجة.

HP Attack
#
1 45 49
2 60 62
3 80 82
4 80 100
5 39 52
6 58 64
7 78 84
8 78 130
9 78 104
10 44 48
11 59 63
12 79 83
13 79 103
14 45 30
15 50 20
16 60 45
17 40 35
18 45 25
19 65 90
20 65 150
21 40 45
22 63 60
23 83 80
24 83 80
25 30 56
26 55 81
27 40 60
28 65 90
29 35 60
30 60 85
771 95 65
772 78 92
773 67 58
774 50 50
775 45 50
776 68 75
777 90 100
778 57 80
779 43 70
780 85 110
781 49 66
782 44 66
783 54 66
784 59 66
785 65 90
786 55 85
787 75 95
788 85 100
789 55 69
790 95 117
791 40 30
792 85 70
793 126 131
794 126 131
795 108 100
796 50 100
797 50 160
798 80 110
799 80 160
800 80 110

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ii- تقسيم إطارات البيانات

الفرق بين اختيار الأعمدة بين إطارات البيانات والقوائم.

تقسيم وفهرسة القوائم.

التقسيم العكسي.

من نقطة معينة إلى النهاية.

الفرق بين اختيار الأعمدة بين إطارات البيانات والقوائم ف الاولى للقوائم و الثانية لإطارات البيانات.

print(type(data["HP"])) # series
print(type(data[["HP"]])) # data frames

النتيجة.

<class 'pandas.core.series.Series'>
<class 'pandas.core.frame.DataFrame'>

تقسيم وفهرسة القوائم.

data.loc[1:10,"HP":"Defense"] # 10 and "Defense" are inclusive

النتيجة.

HP Attack Defense
#
1 45 49 49
2 60 62 63
3 80 82 83
4 80 100 123
5 39 52 43
6 58 64 58
7 78 84 78
8 78 130 111
9 78 104 78
10 44 48 65

 

 

 

 

 

 

 

 

 

 

 

 

 

التقسيم العكسي.

data.loc[10:1:-1,"HP":"Defense"]

النتيجة.

HP Attack Defense
#
10 44 48 65
9 78 104 78
8 78 130 111
7 78 84 78
6 58 64 58
5 39 52 43
4 80 100 123
3 80 82 83
2 60 62 63
1 45 49 49

 

 

 

 

 

 

 

 

 

 

 

 

 

من نقطة معينة إلى النهاية.

data.loc[1:10,"Speed":]

النتيجة

HP Attack Defense
#
1 45 49 49
2 60 62 63
3 80 82 83
4 80 100 123
5 39 52 43
6 58 64 58
7 78 84 78
8 78 130 111
9 78 104 78
10 44 48 65

 

 

 

 

 

 

 

 

 

 

 

 

 

iii- تصفية إطارات البيانات

إنشاء سلسلة منطقية لدمج عوامل التصفية لكل عمود بناء عليهم.

boolean = data.HP > 200
data[boolean]

النتيجة.

Name Type 1 Type 2 HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary Name
# #
122 Chansey Normal NaN 250 5 5 35 105 50 1 False 122 Chansey
262 Blissey Normal NaN 255 10 10 75 135 55 2 False 262 Blissey

 

 

 

 

 

 

لنجرب تجميع عوامل التصفية سويا.

first_filter = data.HP > 150
second_filter = data.Speed > 35
data[first_filter & second_filter]

النتيجة

Name Type 1 Type 2 HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary
#
122 Chansey Normal NaN 250 5 5 35 105 50 1 False
262 Blissey Normal NaN 255 10 10 75 135 55 2 False
352 Wailord Water NaN 170 90 45 90 45 60 3 False
656 Alomomola Water NaN 165 75 80 40 45 65 5 False

 

 

 

 

 

 

 

ولان لنجرب التصفية بعوامل غير التي جهزناها.

data.HP[data.Speed<15]

النتيجة.

#
231 20
360 45
487 50
496 135
659 44
Name: HP, dtype: int64

iv- تحويل إطارات البيانات

وظائف Python.

وظيفة لامبدا lambda: لتطبيق الوظيفة على كل عنصر.

تحديد العمود باستخدام أعمدة أخرى.

وظائف Python.

def div(n):		
	return n/2
data.HP.apply(div)

النتيجة.

#
1 22.5
2 30.0
3 40.0
4 40.0
5 19.5
6 29.0
7 39.0
8 39.0
9 39.0
10 22.0
11 29.5
12 39.5
13 39.5
14 22.5
15 25.0
16 30.0
17 20.0
18 22.5
19 32.5
20 32.5
21 20.0
22 31.5
23 41.5
24 41.5
25 15.0
26 27.5
27 20.0
28 32.5
29 17.5
30 30.0
...
771 47.5
772 39.0
773 33.5
774 25.0
775 22.5
776 34.0
777 45.0
778 28.5
779 21.5
780 42.5
781 24.5
782 22.0
783 27.0
784 29.5
785 32.5
786 27.5
787 37.5
788 42.5
789 27.5
790 47.5
791 20.0
792 42.5
793 63.0
794 63.0
795 54.0
796 25.0
797 25.0
798 40.0
799 40.0
800 40.0
Name: HP, Length: 800, dtype: float64

وظيفة lambda.

data.HP.apply(lambda n : n/2)

النتيجة.

#
1 22.5
2 30.0
3 40.0
4 40.0
5 19.5
6 29.0
7 39.0
8 39.0
9 39.0
10 22.0
11 29.5
12 39.5
13 39.5
14 22.5
15 25.0
16 30.0
17 20.0
18 22.5
19 32.5
20 32.5
21 20.0
22 31.5
23 41.5
24 41.5
25 15.0
26 27.5
27 20.0
28 32.5
29 17.5
30 30.0
...
771 47.5
772 39.0
773 33.5
774 25.0
775 22.5
776 34.0
777 45.0
778 28.5
779 21.5
780 42.5
781 24.5
782 22.0
783 27.0
784 29.5
785 32.5
786 27.5
787 37.5
788 42.5
789 27.5
790 47.5
791 20.0
792 42.5
793 63.0
794 63.0
795 54.0
796 25.0
797 25.0
798 40.0
799 40.0
800 40.0
Name: HP, Length: 800, dtype: float64

تحديد العمود باستخدام أعمدة أخرى.

data["total_power"] = data.Attack + data.Defense
data.head()

النتيجة.

Name Type 1 Type 2 HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary total_power
#
1 Bulbasaur Grass Poison 45 49 49 65 65 45 1 False 98
2 Ivysaur Grass Poison 60 62 63 80 80 60 1 False 125
3 Venusaur Grass Poison 80 82 83 100 100 80 1 False 165
4 Mega Venusaur Grass Poison 80 100 123 122 120 80 1 False 223
5 Charmander Fire NaN 39 52 43 60 50 65 1 False 95

v- فهرسة الكائنات وتسمية البيانات

الفهرس: تسلسل التسمية.

لنعرض اسم الفهرس الخاص بنا.

# our index name is this:
print(data.index.name)

النتيجة.

#

ولان لنغيره.

data.index.name = "index_name"
data.head()

النتيجة.

Name Type 1 Type 2 HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary total_power
Index_name
1 Bulbasaur Grass Poison 45 49 49 65 65 45 1 False 98
2 Ivysaur Grass Poison 60 62 63 80 80 60 1 False 125
3 Venusaur Grass Poison 80 82 83 100 100 80 1 False 165
4 Mega Venusaur Grass Poison 80 100 123 122 120 80 1 False 223
5 Charmander Fire NaN 39 52 43 60 50 65 1 False 95

ولان إذا كنا نريد تعديل الفهرس ولا بد من ان نغيره كله.

لنأخذ نسخة من البيانات ونجعل الفهرس يبدا من 100 بدل من 1 في النسخة الجديدة.

data.head()
# first copy of our data to data3 then change index
data3 = data.copy()
# lets make index start from 100. It is not remarkable change but it is just example
data3.index = range(100,900,1)
data3.head()

النتيجة.

Name Type 1 Type 2 HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary total_power
100 Bulbasaur Grass Poison 45 49 49 65 65 45 1 False 98
101 Ivysaur Grass Poison 60 62 63 80 80 60 1 False 125
102 Venusaur Grass Poison 80 82 83 100 100 80 1 False 165
103 Mega Venusaur Grass Poison 80 100 123 122 120 80 1 False 223
104 Charmander Fire NaN 39 52 43 60 50 65 1 False 95

vi- الفهرسة الهرمية

وضع الفهرسة بشكل هرمي.

data = pd.read_csv('../input/pokemon.csv')
data.head()

النتيجة.

# Name Type 1 Type 2 HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary
0 1 Bulbasaur Grass Poison 45 49 49 65 65 45 1 False
1 2 Ivysaur Grass Poison 60 62 63 80 80 60 1 False
2 3 Venusaur Grass Poison 80 82 83 100 100 80 1 False
3 4 Mega Venusaur Grass Poison 80 100 123 122 120 80 1 False
4 5 Charmander Fire NaN 39 52 43 60 50 65 1 False

كما ترون هناك فهرس. ومع ذلك، نريد تعيين عمود واحد أو أكثر ليكون فهرسًا.

سنقوم بتحديد type 1 ليكون الفهرس الخارجي وtype 2 ليكون الفهرس الداخلي.

data1 = data.set_index(["Type 1","Type 2"])
data1.head(100)

النتيجة.

# Name HP Attack Defense Sp. Atk Sp. Def Speed Generation Legendary
Type 1 Type 2 Type 1
Grass Poison 1 Bulbasaur 45 49 49 65 65 45 1 FALSE Grass
Poison 2 Ivysaur 60 62 63 80 80 60 1 FALSE
Poison 3 Venusaur 80 82 83 100 100 80 1 FALSE
Poison 4 Mega Venusaur 80 100 123 122 120 80 1 FALSE
Fire NaN 5 Charmander 39 52 43 60 50 65 1 FALSE Fire
NaN 6 Charmeleon 58 64 58 80 65 80 1 FALSE
Flying 7 Charizard 78 84 78 109 85 100 1 FALSE
Dragon 8 Mega Charizard X 78 130 111 130 85 100 1 FALSE
Flying 9 Mega Charizard Y 78 104 78 159 115 100 1 FALSE
Water NaN 10 Squirtle 44 48 65 50 64 43 1 FALSE Water
NaN 11 Wartortle 59 63 80 65 80 58 1 FALSE
NaN 12 Blastoise 79 83 100 85 105 78 1 FALSE
NaN 13 Mega Blastoise 79 103 120 135 115 78 1 FALSE
Bug NaN 14 Caterpie 45 30 35 20 20 45 1 FALSE Bug
NaN 15 Metapod 50 20 55 25 25 30 1 FALSE
Flying 16 Butterfree 60 45 50 90 80 70 1 FALSE
Poison 17 Weedle 40 35 30 20 20 50 1 FALSE
Poison 18 Kakuna 45 25 50 25 25 35 1 FALSE
Poison 19 Beedrill 65 90 40 45 80 75 1 FALSE
Poison 20 Mega Beedrill 65 150 40 15 80 145 1 FALSE
Normal Flying 21 Pidgey 40 45 40 35 35 56 1 FALSE Normal
Flying 22 Pidgeotto 63 60 55 50 50 71 1 FALSE
Flying 23 Pidgeot 83 80 75 70 70 101 1 FALSE
Flying 24 Mega Pidgeot 83 80 80 135 80 121 1 FALSE
NaN 25 Rattata 30 56 35 25 35 72 1 FALSE
NaN 26 Raticate 55 81 60 50 70 97 1 FALSE
Flying 27 Spearow 40 60 30 31 31 70 1 FALSE
Flying 28 Fearow 65 90 65 61 61 100 1 FALSE
Poison NaN 29 Ekans 35 60 44 40 54 55 1 FALSE Poison
NaN 30 Arbok 60 85 69 65 79 80 1 FALSE
Psychic NaN 71 Alakazam 55 50 45 135 95 120 1 FALSE Psychic
NaN 72 Mega Alakazam 55 50 65 175 95 150 1 FALSE
Fighting NaN 73 Machop 70 80 50 35 35 35 1 FALSE Fighting
NaN 74 Machoke 80 100 70 50 60 45 1 FALSE
NaN 75 Machamp 90 130 80 65 85 55 1 FALSE
Grass Poison 76 Bellsprout 50 75 35 70 30 40 1 FALSE Grass
Poison 77 Weepinbell 65 90 50 85 45 55 1 FALSE
Poison 78 Victreebel 80 105 65 100 70 70 1 FALSE
Water Poison 79 Tentacool 40 40 35 50 100 70 1 FALSE Water
Poison 80 Tentacruel 80 70 65 80 120 100 1 FALSE
Rock Ground 81 Geodude 40 80 100 30 30 20 1 FALSE Rock
Ground 82 Graveler 55 95 115 45 45 35 1 FALSE
Ground 83 Golem 80 120 130 55 65 45 1 FALSE
Fire NaN 84 Ponyta 50 85 55 65 65 90 1 FALSE Fire
NaN 85 Rapidash 65 100 70 80 80 105 1 FALSE
Water Psychic 86 Slowpoke 90 65 65 40 40 15 1 FALSE Water
Psychic 87 Slowbro 95 75 110 100 80 30 1 FALSE

vii- تجميع اطارات البيانات

أداة لتجميع البيانات.

dic = {"treatment":["A","A","B","B"],"gender":["F","M","F","M"],
"response":[10,45,5,9],"age":[15,4,72,65]}
df = pd.DataFrame(dic)
df

النتيجة.

treatment gender response age
0 A F 10 15
1 A M 45 4
2 B F 5 72
3 B M 9 65

 

 

 

 

 

 

لنجربها.

df.pivot(index="treatment",columns = "gender",values="response")

النتيجة.

gender F M
treatment
A 10 45
B 5 9

 

 

 

 

 

viii- حزم والغاء حزم إطارات البيانات

التعامل مع مؤشرات تسمية متعددة للفهرسة.

المستوى level: مستوى توقف الفهرسة.

مستوى المبادلة sawplevel: التبادل بين الفهرس الداخلي والخارجي.

ولان هيا لنغير نظلم الفهرسة هذا.

df1 = df.set_index(["treatment","gender"])
df1

النتيجة.

response age
treatment gender
A F 10 15
M 45 4
B F 5 72
M 9 65

 

 

 

 

 

 

 

لنجرب تقليل مستوي الفهرسة الي صفر

df1.unstack(level=0)

النتيجة.

response age
treatment A B A B
gender
F 10 5 15 72
M 45 9 4 65

 

 

 

 

 

 

المزيد.

df1.unstack(level=1)

النتيجة.

response age
gender F M F M
treatment
A 10 45 15 4
B 5 9 72 65

 

 

 

 

 

 

والان لنبدل بينهم.

df2 = df1.swaplevel(0,1)
df2

النتيجة.

response age
gender treatment
F A 10 15
M A 45 4
F B 5 72
M B 9 65

 

 

 

 

 

 

 

 

ix- اذابة اطارات البيانات

عكس العملية السابقة تماما “التجميع”.

df

النتيجة.

treatment gender response age
0 A F 10 15
1 A M 45 4
2 B F 5 72
3 B M 9 65
M B 9 65

 

 

 

 

 

 

 

والان لنجرب الاذابة.

pd.melt(df,id_vars="treatment",value_vars=["age","response"])

النتيجة.

treatment variable value
0 A age 15
1 A age 4
2 B age 72
3 B age 65
4 A response 10
5 A response 45
6 B response 5
7 B response 9

 

 

 

 

 

 

 

 

 

 

x- الفئات والتجميع عبر الخصائص

df

النتيجة.

treatment gender response age
0 A F 10 15
1 A M 45 4
2 B F 5 72
3 B M 9 65
M B 9 65

 

 

 

 

 

 

 

وفقا لان صفة treatment تأخذ المتوسط الاحصائي من بقية الصفات.

df.groupby("treatment").mean()   # mean is aggregation / reduction method

النتيجة.

response age
treatment
A 27.5 9.5
B 7.0 68.5

 

 

 

 

 

وهناك أيضا إحصاءات اخري.

df.groupby("treatment").age.max()

النتيجة.

treatment
A 15
B 72
Name: age, dtype: int64

يمكننا أيضا اختيار أكثر من صفة.

df.groupby("treatment")[["age","response"]].min()

النتيجة.

age response
treatment
A 4 10
B 65 5

 

 

 

 

 

df.info()

النتيجة.

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 4 columns):
treatment 4 non-null object
gender 4 non-null object
response 4 non-null int64
age 4 non-null int64
dtypes: int64(2), object(2)
memory usage: 208.0+ bytes

كما ترون صفة gender هي كائن

ومع ذلك ، إذا استخدمنا groupby ، فيمكننا تحويلها إلى categorical.

لأن categorical تستخدم ذاكرة أقل ، تسريع العمليات مثل groupby

 

المصدر: DATA SCIENTIST, Kaggle

تعليقات