ISE_31.Aparyan.mai/lab1.ipynb

413 KiB
Raw Blame History

Лабораторная работа №1

7. Основные возможности библиотеки Pandas

Загрузка и сохранение данных

In [3]:
import pandas as pd
In [4]:
df = pd.read_csv("diabetes.csv")

df.head()
Out[4]:
Pregnancies Glucose BloodPressure SkinThickness Insulin BMI DiabetesPedigreeFunction Age Outcome
0 6 148 72 35 0 33.6 0.627 50 1
1 1 85 66 29 0 26.6 0.351 31 0
2 8 183 64 0 0 23.3 0.672 32 1
3 1 89 66 23 94 28.1 0.167 21 0
4 0 137 40 35 168 43.1 2.288 33 1
In [5]:
df.to_csv("new.csv", index=False)

Получение сведений о датафрейме с данными

In [6]:
df.describe()
Out[6]:
Pregnancies Glucose BloodPressure SkinThickness Insulin BMI DiabetesPedigreeFunction Age Outcome
count 768.000000 768.000000 768.000000 768.000000 768.000000 768.000000 768.000000 768.000000 768.000000
mean 3.845052 120.894531 69.105469 20.536458 79.799479 31.992578 0.471876 33.240885 0.348958
std 3.369578 31.972618 19.355807 15.952218 115.244002 7.884160 0.331329 11.760232 0.476951
min 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.078000 21.000000 0.000000
25% 1.000000 99.000000 62.000000 0.000000 0.000000 27.300000 0.243750 24.000000 0.000000
50% 3.000000 117.000000 72.000000 23.000000 30.500000 32.000000 0.372500 29.000000 0.000000
75% 6.000000 140.250000 80.000000 32.000000 127.250000 36.600000 0.626250 41.000000 1.000000
max 17.000000 199.000000 122.000000 99.000000 846.000000 67.100000 2.420000 81.000000 1.000000
In [7]:
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 768 entries, 0 to 767
Data columns (total 9 columns):
 #   Column                    Non-Null Count  Dtype  
---  ------                    --------------  -----  
 0   Pregnancies               768 non-null    int64  
 1   Glucose                   768 non-null    int64  
 2   BloodPressure             768 non-null    int64  
 3   SkinThickness             768 non-null    int64  
 4   Insulin                   768 non-null    int64  
 5   BMI                       768 non-null    float64
 6   DiabetesPedigreeFunction  768 non-null    float64
 7   Age                       768 non-null    int64  
 8   Outcome                   768 non-null    int64  
dtypes: float64(2), int64(7)
memory usage: 54.1 KB

Получение сведений о колонках датафрейма

In [8]:
df.columns
Out[8]:
Index(['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin',
       'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome'],
      dtype='object')

Вывод отельных строки и столбцов из датафрейма

In [30]:
df[["Age", "Insulin"]]
Out[30]:
Age Insulin
0 50 0
1 31 0
2 32 0
3 21 94
4 33 168
... ... ...
763 63 180
764 27 0
765 30 112
766 47 0
767 23 0

768 rows × 2 columns

In [10]:
df.iloc[3:6]
Out[10]:
Pregnancies Glucose BloodPressure SkinThickness Insulin BMI DiabetesPedigreeFunction Age Outcome
3 1 89 66 23 94 28.1 0.167 21 0
4 0 137 40 35 168 43.1 2.288 33 1
5 5 116 74 0 0 25.6 0.201 30 0
In [11]:
df[df['Insulin'] > 100]
Out[11]:
Pregnancies Glucose BloodPressure SkinThickness Insulin BMI DiabetesPedigreeFunction Age Outcome
4 0 137 40 35 168 43.1 2.288 33 1
8 2 197 70 45 543 30.5 0.158 53 1
13 1 189 60 23 846 30.1 0.398 59 1
14 5 166 72 19 175 25.8 0.587 51 1
16 0 118 84 47 230 45.8 0.551 31 1
... ... ... ... ... ... ... ... ... ...
748 3 187 70 22 200 36.4 0.408 36 1
753 0 181 88 44 510 43.3 0.222 26 1
755 1 128 88 39 110 36.5 1.057 37 1
763 10 101 76 48 180 32.9 0.171 63 0
765 5 121 72 23 112 26.2 0.245 30 0

243 rows × 9 columns

Группировка и агрегация данных в датафрейме

In [12]:
group = df.groupby(['Pregnancies'])['Insulin'].mean()
group.to_frame()
Out[12]:
Insulin
Pregnancies
0 81.675676
1 98.674074
2 85.844660
3 87.453333
4 69.441176
5 57.298246
6 63.580000
7 84.466667
8 92.815789
9 62.428571
10 34.791667
11 65.454545
12 112.555556
13 27.900000
14 92.000000
15 110.000000
17 114.000000

Сортировка данных в датафрейме

In [13]:
sorted_df = df.sort_values(by='Glucose', ascending = False)
sorted_df
Out[13]:
Pregnancies Glucose BloodPressure SkinThickness Insulin BMI DiabetesPedigreeFunction Age Outcome
661 1 199 76 43 0 42.9 1.394 22 1
561 0 198 66 32 274 41.3 0.502 28 1
228 4 197 70 39 744 36.7 2.329 31 0
8 2 197 70 45 543 30.5 0.158 53 1
579 2 197 70 99 0 34.7 0.575 62 1
... ... ... ... ... ... ... ... ... ...
342 1 0 68 35 0 32.0 0.389 22 0
349 5 0 80 32 0 41.0 0.346 37 1
502 6 0 68 41 0 39.0 0.727 41 1
182 1 0 74 20 23 27.7 0.299 21 0
75 1 0 48 20 0 24.7 0.140 22 0

768 rows × 9 columns

Удаление строк/столбцов

In [14]:
df_dropped_columns = df.drop(columns=['Insulin', 'BMI'])  # Удаление столбцов 'Insulin' и 'BMI'
In [15]:
df_dropped_columns
Out[15]:
Pregnancies Glucose BloodPressure SkinThickness DiabetesPedigreeFunction Age Outcome
0 6 148 72 35 0.627 50 1
1 1 85 66 29 0.351 31 0
2 8 183 64 0 0.672 32 1
3 1 89 66 23 0.167 21 0
4 0 137 40 35 2.288 33 1
... ... ... ... ... ... ... ...
763 10 101 76 48 0.171 63 0
764 2 122 70 27 0.340 27 0
765 5 121 72 23 0.245 30 0
766 1 126 60 0 0.349 47 1
767 1 93 70 31 0.315 23 0

768 rows × 7 columns

In [16]:
df_dropped_rows = df.drop([0, 1])  # Удаление строк с индексами 0 и 1
df_dropped_rows
Out[16]:
Pregnancies Glucose BloodPressure SkinThickness Insulin BMI DiabetesPedigreeFunction Age Outcome
2 8 183 64 0 0 23.3 0.672 32 1
3 1 89 66 23 94 28.1 0.167 21 0
4 0 137 40 35 168 43.1 2.288 33 1
5 5 116 74 0 0 25.6 0.201 30 0
6 3 78 50 32 88 31.0 0.248 26 1
... ... ... ... ... ... ... ... ... ...
763 10 101 76 48 180 32.9 0.171 63 0
764 2 122 70 27 0 36.8 0.340 27 0
765 5 121 72 23 112 26.2 0.245 30 0
766 1 126 60 0 0 30.1 0.349 47 1
767 1 93 70 31 0 30.4 0.315 23 0

766 rows × 9 columns

Создание новых столбцов на основе данных из существующих столбцов датафрейма

In [17]:
df['Glucose-BP'] = df['Glucose'] - df['BloodPressure']
In [18]:
df
Out[18]:
Pregnancies Glucose BloodPressure SkinThickness Insulin BMI DiabetesPedigreeFunction Age Outcome Glucose-BP
0 6 148 72 35 0 33.6 0.627 50 1 76
1 1 85 66 29 0 26.6 0.351 31 0 19
2 8 183 64 0 0 23.3 0.672 32 1 119
3 1 89 66 23 94 28.1 0.167 21 0 23
4 0 137 40 35 168 43.1 2.288 33 1 97
... ... ... ... ... ... ... ... ... ... ...
763 10 101 76 48 180 32.9 0.171 63 0 25
764 2 122 70 27 0 36.8 0.340 27 0 52
765 5 121 72 23 112 26.2 0.245 30 0 49
766 1 126 60 0 0 30.1 0.349 47 1 66
767 1 93 70 31 0 30.4 0.315 23 0 23

768 rows × 10 columns

Удаление строк с пустыми значениями

In [19]:
print(df.isna().sum())
Pregnancies                 0
Glucose                     0
BloodPressure               0
SkinThickness               0
Insulin                     0
BMI                         0
DiabetesPedigreeFunction    0
Age                         0
Outcome                     0
Glucose-BP                  0
dtype: int64
In [20]:
df.dropna() #Тк.пустых строк нет, мы ничего не удалили
Out[20]:
Pregnancies Glucose BloodPressure SkinThickness Insulin BMI DiabetesPedigreeFunction Age Outcome Glucose-BP
0 6 148 72 35 0 33.6 0.627 50 1 76
1 1 85 66 29 0 26.6 0.351 31 0 19
2 8 183 64 0 0 23.3 0.672 32 1 119
3 1 89 66 23 94 28.1 0.167 21 0 23
4 0 137 40 35 168 43.1 2.288 33 1 97
... ... ... ... ... ... ... ... ... ... ...
763 10 101 76 48 180 32.9 0.171 63 0 25
764 2 122 70 27 0 36.8 0.340 27 0 52
765 5 121 72 23 112 26.2 0.245 30 0 49
766 1 126 60 0 0 30.1 0.349 47 1 66
767 1 93 70 31 0 30.4 0.315 23 0 23

768 rows × 10 columns

Заполнение пустых значений на основе существующих данных

In [21]:
df.fillna(df.mean(), inplace=True)
df.fillna(df.median(), inplace=True)

Мы обрабатываем пустые значения для каждого столбца отдельно

Мы можем заполнить пропуски средним или медианой, если это числовой столбец

Мы заполняем средним, если в колонке нет выбросов

Если столбец категориальный, то мы можем заполнить пропуски модой (самым часто встречающимся значением)

Если пропусков мало, то их можно просто удалить.

8. Возможности визуализации

In [22]:
import matplotlib.pyplot as plt
In [31]:
#Линейная диаграмма
plt.figure(figsize=(10, 5))
df['Glucose'].plot(title='Line Plot (Glucose)')
plt.show()
No description has been provided for this image
In [24]:
#Гистограмма
plt.figure(figsize=(8, 5))
df.plot.hist(column=["Age"], bins=80)
plt.show()
<Figure size 800x500 with 0 Axes>
No description has been provided for this image
In [25]:
plt.figure(figsize=(8, 5))
df['Age'].value_counts().plot(kind='bar', title='Bar Plot (Age)')
plt.show()
No description has been provided for this image
In [26]:
plt.figure(figsize=(8, 5))
df["BMI"].plot(kind = "box", title='Ящик с усами')
plt.show()
No description has been provided for this image
In [32]:
plt.figure(figsize=(8, 5))
df[['Glucose', 'BMI']].plot(kind='area', alpha=0.2, title='Area Plot (Glucose, BMI)')
plt.show()
<Figure size 800x500 with 0 Axes>
No description has been provided for this image
In [28]:
df.plot.scatter(x="Age", y="Glucose")
Out[28]:
<Axes: xlabel='Age', ylabel='Glucose'>
No description has been provided for this image
In [29]:
plt.figure(figsize=(8, 5))
df['Outcome'].value_counts().plot(kind='pie', autopct='%1.1f%%', title='Pie Chart (Outcome)')
plt.show()
No description has been provided for this image