AI Notebook 2 — NumPy и pandas

Базовые операции с массивами и таблицами, масштабирование данных.

Редактировать источник

NumPy и pandas

Дата - 25.02.2023

1.1. Теоретический материал – Библиотека NumPy

NumPy (NumericalPython) - это библиотека Python с открытым исходным кодом, которая используется практически во всех областях науки и техники. Это универсальный стандарт для работы с числовыми данными в Python.

Если у вас уже есть Python, вы можете установить NumPy с помощью командной строки:

code
pip install numpy

Чтобы начать использовать NumPy необходимо импортировать соответствующую библиотеку:

code
import numpy as np*

Основным объектом NumPy является однородный многомерный массив (в numpy называется numpy.ndarray). Это многомерный массив элементов (обычно чисел), одного типа.

Наиболее важные атрибуты объектов ndarray:

ndarray.ndim - число измерений (чаще их называют "оси") массива.

ndarray.shape - размеры массива, его форма. Это кортеж натуральных чисел, показывающий длину массива по каждой оси. Для матрицы из n строк и m столбов, shape будет (n,m). Число элементов кортежа shape равно ndim.

ndarray.size - количество элементов массива. Очевидно, равно произведению всех элементов атрибута shape.

ndarray.dtype - объект, описывающий тип элементов массива. Можно определить dtype, используя стандартные типы данных Python. NumPy здесь предоставляет целый букет возможностей, как встроенных, например: bool_, character, int8, int16, int32, int64, float8, float16, float32, float64, complex64, object_, так и возможность определить собственные типы данных, в том числе и составные.

ndarray.itemsize - размер каждого элемента массива в байтах.

ndarray.data - буфер, содержащий фактические элементы массива.

Обычно не нужно использовать этот атрибут, так как обращаться к элементам массива проще всего с помощью индексов.

Подробнее о массивах в NumPy можно найти в официальной документации https://numpy.org/doc/stable/user/absolute_beginners.html

1.2.1 Пример

Задача: Создать массив 5x2. Вывести все значения массива, значение элемента с индексом (3,1) и второй столбец. Индексация начинается с нуля.

python
import numpy as np
x=np.array([[1,2],[3,4],[5,6],[7,8],[9,10]])
print(x)
print(x[3][1])
print(x[1])

Вывод:

code
[[ 1  2]
 [ 3  4]
 [ 5  6]
 [ 7  8]
 [ 9 10]]
8
[3 4]

1.2.2 Пример

Задача: Пример. Выполнить следующее:

  1. Создать вектор (одномерный массив) размера 10, заполненный нулями.
  2. Создать вектор размера 10, заполненный единицами.
  3. Создать вектор размера 10, заполненный заданным числом.
  4. Создать вектор со значениями от 10 до 19.
python
a = np.zeros(10)
b = np.ones(10)
c = np.full(10, 5)
d = np.arange(10, 20)
print(a,"\n", b,"\n", c,"\n", d,"\n")

Вывод:

code
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
 [1. 1. 1. 1. 1. 1. 1. 1. 1. 1.] 
 [5 5 5 5 5 5 5 5 5 5] 
 [10 11 12 13 14 15 16 17 18 19] 

1.2.3 Пример

Задача: Создать массив 10x10 со случайными значениями, найти минимум, максимум и среднее значение.

python
import numpy as np;
Z = np.random.random((10,10))
Zmin,Zmax,Zmean = Z.min(),Z.max(),Z.mean()
print(Zmin,Zmax,Zmean)

Вывод:

code
0.0012011415199231212 0.9992820485421907 0.46317427349952167

1.2.4 Пример

Задача: Задать матрицу размерности 5 на 5 и поменять 2 строки в матрице местами

python
A=np.arange(25).reshape(5,5)
A[[0,1]] = A [[1,0]]
print(A)

Вывод:

code
[[ 5  6  7  8  9]
 [ 0  1  2  3  4]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

1.2.5 Пример

Задача: Выяснить результат следующих выражений: 0 * np.nan np.nan == np.nan np.inf > np.nan np.nan - np.nan 0.3 == 3 * 0.1

python
print(0*np.nan)
print(np.nan == np.nan)
print(np.inf>np.nan)
print(np.nan - np.nan)
print(0.3 == 3 * 0.1)

Вывод:

code
nan
False
False
nan
False

1.2.6 Пример

Задача: Отсортировать массив.

python
import numpy as np
arr = np.array([2,1,5,3,7,4,6,8])
print(np.sort(arr))

Вывод:

code
[1 2 3 4 5 6 7 8]

1.3.1 Задание

Задача: Создать 8x8 матрицу и заполнить её в шахматном порядке нулями и единицами.

python
import numpy as np
a = np.zeros((8,8))
a[1::2,::2] = 1
a[::2,1::2] = 1
print(a)

Вывод:

code
[[0. 1. 0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0. 1. 0.]
 [0. 1. 0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0. 1. 0.]
 [0. 1. 0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0. 1. 0.]
 [0. 1. 0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0. 1. 0.]]

1.3.2 Задание

Задача: Создать 5x5 матрицу со значениями в строках от 0 до 4. Для создания необходимо использовать функцию arrange.

code
import numpy as np
x = np.zeros((5,5))
x += np.arange(5)
print(x)

Вывод:

code
[[0. 1. 2. 3. 4.]
 [0. 1. 2. 3. 4.]
 [0. 1. 2. 3. 4.]
 [0. 1. 2. 3. 4.]
 [0. 1. 2. 3. 4.]]

1.3.3 Задание

Задача: Создать массив 3x3x3 со случайными значениями.

python
import numpy as np
x = np.random.random((3,3,3))
print(x)

Вывод:

code
[[[0.12103427 0.58612308 0.97128317]
  [0.85425347 0.05382162 0.24655898]
  [0.62425414 0.42687911 0.88727021]]

 [[0.89520018 0.6148935  0.34365111]
  [0.4170647  0.74841712 0.53984955]
  [0.44451711 0.42021953 0.81843469]]

 [[0.52503207 0.5691061  0.32632757]
  [0.63784264 0.08092314 0.28269851]
  [0.36876011 0.05424346 0.48220954]]]

1.3.4 Задание

Задача: Создать матрицу с 0 внутри, и 1 на границах.

python
import numpy as np
x = np.ones((8, 8))
x[1:-1, 1:-1] = 0
print(x)

Вывод:

code
[[1. 1. 1. 1. 1. 1. 1. 1.]
 [1. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 0. 0. 0. 1.]
 [1. 0. 0. 0. 0. 0. 0. 1.]
 [1. 1. 1. 1. 1. 1. 1. 1.]]

1.3.5 Задание

Задача: Создайте массив и отсортируйте его по убыванию.

python
import numpy as np
arr = np.array([2,1,5,3,7,4,6,8])
arr=np.sort(arr)
arr=arr[::-1]
print(arr)

Вывод:

code
[8 7 6 5 4 3 2 1]

1.3.6 Задание

Задача: Создайте матрицу, выведите ее форму, размер и размерность.

python
import numpy as np
import random
x = random.randint(1,10)
y = random.randint(1,10)
A = np.zeros((x, y), int)
print(A)
if x == y:
 print('Форма матрицы: квадратная матрица')
else:
  print('Форма матрицы: прямоугольная матрица')
print("Размер: ",x+y)
print('Размерность: ', x *y)

Вывод:

code
[[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]
Форма матрицы: прямоугольная матрица
Размер:  9
Размерность:  20

2.1. Теоретический материал – Библиотека Pandas

Первым шагом в любом начинании в области машинного обучения является введение исходных данных в систему. Исходные данные могут вводиться вручную, содержаться в файле или храниться в интернете в каком-либо формате. Кроме того, часто требуется получить данные из нескольких источников.

Библиотека pandas – это удобный и быстрый инструмент для работы с данными, обладающий большим функционалом. Если очень кратко, тоpandas – это библиотека, которая предоставляет очень удобные с точки зрения использования инструменты для хранения данных и работе с ними. Библиотека pandas присутствует в стандартной поставке Anaconda. Если же ее там нет, то его можно установить отдельно. Для этого введите командной строке:

code
pip install pandas

Для импорта библиотеки используйте команду:

code
import pandas as pd

Библиотека pandas предоставляет две ключевые структуры данных: Series и DataFrame.

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

DataFrame – это двумерная структура. Идейно она очень похожа на обычную таблицу, что выражается в способе ее создания и работе с ее элементами.

2.2.1 Пример

Задача: Создать Series из списка Python, словаря Python, и массива Numpy (установить буквенные метки для последнего).

python
import pandas as pd
lst = [1,2,3,4,5]
d={'a':1,'b':2,'c':3}
ndarr = np.array([1,2,3,4,5])

s1=pd.Series(lst)
s2=pd.Series(d)
s3=pd.Series(ndarr,['a','b','c','d','e'])

print(s1)
print(s2)
print(s3)

Вывод:

code
0    1
1    2
2    3
3    4
4    5
dtype: int64
a    1
b    2
c    3
dtype: int64
a    1
b    2
c    3
d    4
e    5
dtype: int64

2.2.2 Пример

Задача: Дано два Series. Напечатать их первые элементы и все элементы после третьего (во втором фрейме).

python
s1=pd.Series([1,2,3,4,5],['a','b','c','d','e'])
s2=pd.Series([5,4,3,2,1])
print(s1['a'])
print(s2[0])
print(s1[3:])

Вывод:

code
1
5
d    4
e    5
dtype: int64

2.2.3 Пример

Задача: Создайте новый фрейм данных.

python
dataframe = pd.DataFrame()
dataframe['Имя']=['Джеки Джексон','Стивен Стивенсон']
dataframe['Возраст']=[38,25]
dataframe['Водитель']=[True,False]
dataframe

Вывод:

code
                Имя  Возраст  Водитель
0     Джеки Джексон       38      True
1  Стивен Стивенсон       25     False

2.2.4 Пример

Задача: Загрузите фрейм данных по ссылке: https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv

python
#Создать url -адрес
url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'
#Загрузить  данные
dataframe = pd.read_csv(url)
#показать 5 строк
dataframe.head(5)

2.2.5 Пример

Задача: Пронализировать характеристики фрейма данных.

Одна из самых простых вещей, которые мы можем сделать после загрузки данных, – это взглянуть на первые несколько строк с помощью метода head. На последние строки можно посмотреть с помощью функции tail. Мы также можем взглянуть на количество строк и столбцов: dataframe.shape. Кроме того, используя метод describe, мы можем получить описательную статистику для любых числовых столбцов.

Более подробно с возможностями работы с фреймами данных можно узнать по ссылке ниже:

https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.html

python
import pandas as pd

url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'
dataframe = pd.read_csv(url)

print('\n',dataframe.head(2))
print()
print('\n',dataframe.tail(3))
print('\n',dataframe.shape)
print('\n',dataframe.describe())

2.2.6 Пример

Задача: Выберите индивидуальные данные или срезы фрейма данных.

Для выбора одной или нескольких строк, либо значений, можно использовать методы 1ос или iloc.

python
import pandas as pd

url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'
dataframe = pd.read_csv(url)

dataframe.iloc[1:4]

2.2.7 Пример

Задача: Требуется отобрать строки фрейма данных на основе некоторого условия. Необходимо сформировать новый фрейм данных из пассажиров первого класса.

python
import pandas as pd

url = 'https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv'
dataframe = pd.read_csv(url)

dataframe[dataframe['PClass'] == '1st'].head(2)

2.3.1 Задание

Задача: Найдите евклидово расстояние между двумя Series (точками) a и b, не используя встроенную формулу.

python
import pandas as pd
a=pd.Series([765,65])
b=pd.Series([54,456])

vk=(((a[0]-b[0])**2+(a[1]-b[1])**2))**2
print(vk)

Вывод:

text
433493193604

2.3.2 Задание

Задача: Найдите в Интернете ссылку на любой csv файл и сформируйте из него фрейм данных (например, коллекцию фреймов данных можно найти здесь: https://github.com/akmand/datasets).

python
import pandas as pd
url = 'https://raw.githubusercontent.com/akmand/datasets/main/anneal.csv'
dataframe = pd.read_csv(url)
dataframe.head(5)

2.3.3 Задание

Задача: Проделайте с получившемся из предыдущего задания фреймом данных те же действия, что и в примерах 2.2.5-2.2.7.

python
import pandas as pd

url='https://raw.githubusercontent.com/akmand/datasets/main/anneal.csv'
dataframe=pd.read_csv(url)

print(dataframe.head(2))
print(dataframe.tail(3))
print(dataframe.shape)
print(dataframe.describe())
print(dataframe.iloc[1:4])

3.1. Теоретический материал – Работа с числовыми данными

Количественные данные что-то измеряют – будь то размер класса, ежемесячные продажи или оценки учащихся. Естественным способом представления этих величин является численным (например, 150 студентов, $529 392 продаж).

Нормализация данных— это общепринятая задача предобработки в машинном обучении. Многие алгоритмы предполагают, что все признаки находятся в единой шкале, как правило, от 0 до 1 или от -1 до 1.

Существует множество способов нормализации значений признаков, чтобы масштабировать их к единому диапазону и использовать в различных моделях машинного обучения. В зависимости от используемой функции, их можно разделить на 2 большие группы: линейные и нелинейные. При нелинейной нормализации в расчетных соотношениях используются функции логистической сигмоиды или гиперболического тангенса. В линейной нормализации изменение переменных осуществляется пропорционально, по линейному закону.

На практике наиболее распространены следующие методы нормализации признаков:

Мин и макс – линейное преобразование данных в диапазоне [0..1], где минимальное и максимальное масштабируемые значения соответствуют 0 и 1 соответственно;

Z-масштабирование данных на основе среднего значения и стандартного отклонения: производят деление разницы между переменной и средним значением на стандартное отклонение.

image.png

При масштабировании данных мы будем использовать одну из популярных библиотек машинного обучения Scikit-learn. Библиотека содержит пакет sklearn.preprocessing, который предоставляет широкиевозможности для нормализации данных. Следует отметить, что в целом алгоритмы обучения выигрывают от стандартизации набора данных.

3.2.1. Пример

Задача: Прошкалируйте числовой признак в диапазон между двумя значениями.

python
#Загрузить библиотеки
import numpy as np
from sklearn import preprocessing

#Создать признак
feature = np.array([[-500.5],[-100.1],[0],[100.1],[900.9]])
#Создать шкалировщик
minmax_scale = preprocessing.MinMaxScaler(feature_range = (0,1))

#Прошкалировать признак
scaled_feature = minmax_scale.fit_transform(feature)

#Показать шкалированный признак
scaled_feature

Вывод:

code
array([[0.        ],
       [0.28571429],
       [0.35714286],
       [0.42857143],
       [1.        ]])

3.2.2. Пример

Задача: Преобразуйте признак, чтобы он имел среднее значение 0 и стандартное отклонение 1.

python
x=np.array([[-1000.1],[-200.2],[500.5],[600.6],[9000.9]])
#Создать шкалировщик
scaler = preprocessing.StandardScaler()
#Преобразовать признак
standardized = scaler.fit_transform(x)
#Показать признак
standardized

#Мы можем увидеть эффект стандартизации, обратившись к среднему 
#значению и стандартному отклонению результата нашего решения:

print("Среднее:",round(standardized.mean()))
print("Стандартное отклонение:", standardized.std())

Вывод:

code
Среднее: 0
Стандартное отклонение: 1.0

3.2.3. Пример

Задача: Дан фрейм данных

dfTest = pd.DataFrame({'A':[14.00,90.20,90.95,96.27,91.21],

'B':[103.02,107.26,110.35,114.23,114.68],

'C':['big','small','big','small','small']})

Необходимо масштабировать его числовые столбцы.

python
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
dfTest = pd.DataFrame({'A':[14.00,90.20,90.95,96.27,91.21],
 'B':[103.02,107.26,110.35,114.23,114.68],
 'C':['big','small','big','small','small']})

dfTest[['A','B']] = scaler.fit_transform(dfTest[['A','B']])
dfTest

Вывод:

code
          A         B      C
0  0.000000  0.000000    big
1  0.926219  0.363636  small
2  0.935335  0.628645    big
3  1.000000  0.961407  small
4  0.938495  1.000000  small

3.3.2 Задание

Задача:

Загрузить фрейм данных по ссылке:

https://raw.githubusercontent.com/akmand/datasets/master/iris.csv

Необходимо выполнить нормализацию первого числового признака (sepal_length_cm) с использованием минимаксного преобразования, а второго (sepal_width_cm) с задействованием z-масштабирования.

python
import pandas as pd
from sklearn import preprocessing
from sklearn.preprocessing import MinMaxScaler

url='https://raw.githubusercontent.com/akmand/datasets/master/iris.csv'
dataframe=pd.read_csv(url)
scaler = MinMaxScaler()
dataframe[['sepal_length_cm']] = scaler.fit_transform(dataframe[['sepal_length_cm']])
dataframe

Вывод:

code
     sepal_length_cm  sepal_width_cm  petal_length_cm  petal_width_cm  \
0           0.222222             3.5              1.4             0.2   
1           0.166667             3.0              1.4             0.2   
2           0.111111             3.2              1.3             0.2   
3           0.083333             3.1              1.5             0.2   
4           0.194444             3.6              1.4             0.2   
..               ...             ...              ...             ...   
145         0.666667             3.0              5.2             2.3   
146         0.555556             2.5              5.0             1.9   
147         0.611111             3.0              5.2             2.0   
148         0.527778             3.4              5.4             2.3   
149         0.444444             3.0              5.1             1.8   

       species  
0       setosa  
1       setosa  
2       setosa  
3       setosa  
4       setosa  
..         ...  
145  virginica  
146  virginica  
147  virginica  
148  virginica  
149  virginica  

[150 rows x 5 columns]
python
import pandas as pd
from sklearn import preprocessing
from sklearn.preprocessing import StandardScaler

url='https://raw.githubusercontent.com/akmand/datasets/master/iris.csv'
dataframe=pd.read_csv(url)
scaler= StandardScaler()
dataframe[['sepal_width_cm']] = scaler.fit_transform(dataframe[['sepal_width_cm']])
dataframe

Вывод:

text
     sepal_length_cm  sepal_width_cm  petal_length_cm  petal_width_cm  \
0                5.1        1.032057              1.4             0.2   
1                4.9       -0.124958              1.4             0.2   
2                4.7        0.337848              1.3             0.2   
3                4.6        0.106445              1.5             0.2   
4                5.0        1.263460              1.4             0.2   
..               ...             ...              ...             ...   
145              6.7       -0.124958              5.2             2.3   
146              6.3       -1.281972              5.0             1.9   
147              6.5       -0.124958              5.2             2.0   
148              6.2        0.800654              5.4             2.3   
149              5.9       -0.124958              5.1             1.8   

       species  
0       setosa  
1       setosa  
2       setosa  
3       setosa  
4       setosa  
..         ...  
145  virginica  
146  virginica  
147  virginica  
148  virginica  
149  virginica  

[150 rows x 5 columns]