AI Notebook 2 — NumPy и pandas
Базовые операции с массивами и таблицами, масштабирование данных.
Редактировать источникNumPy и pandas
Дата - 25.02.2023
1.1. Теоретический материал – Библиотека NumPy
NumPy (NumericalPython) - это библиотека Python с открытым исходным кодом, которая используется практически во всех областях науки и техники. Это универсальный стандарт для работы с числовыми данными в Python.
Если у вас уже есть Python, вы можете установить NumPy с помощью командной строки:
pip install numpyЧтобы начать использовать NumPy необходимо импортировать соответствующую библиотеку:
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) и второй столбец. Индексация начинается с нуля.
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])Вывод:
[[ 1 2]
[ 3 4]
[ 5 6]
[ 7 8]
[ 9 10]]
8
[3 4]1.2.2 Пример
Задача: Пример. Выполнить следующее:
- Создать вектор (одномерный массив) размера 10, заполненный нулями.
- Создать вектор размера 10, заполненный единицами.
- Создать вектор размера 10, заполненный заданным числом.
- Создать вектор со значениями от 10 до 19.
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")Вывод:
[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 со случайными значениями, найти минимум, максимум и среднее значение.
import numpy as np;
Z = np.random.random((10,10))
Zmin,Zmax,Zmean = Z.min(),Z.max(),Z.mean()
print(Zmin,Zmax,Zmean)Вывод:
0.0012011415199231212 0.9992820485421907 0.463174273499521671.2.4 Пример
Задача: Задать матрицу размерности 5 на 5 и поменять 2 строки в матрице местами
A=np.arange(25).reshape(5,5)
A[[0,1]] = A [[1,0]]
print(A)Вывод:
[[ 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
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)Вывод:
nan
False
False
nan
False1.2.6 Пример
Задача: Отсортировать массив.
import numpy as np
arr = np.array([2,1,5,3,7,4,6,8])
print(np.sort(arr))Вывод:
[1 2 3 4 5 6 7 8]1.3.1 Задание
Задача: Создать 8x8 матрицу и заполнить её в шахматном порядке нулями и единицами.
import numpy as np
a = np.zeros((8,8))
a[1::2,::2] = 1
a[::2,1::2] = 1
print(a)Вывод:
[[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.
import numpy as np
x = np.zeros((5,5))
x += np.arange(5)
print(x)Вывод:
[[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 со случайными значениями.
import numpy as np
x = np.random.random((3,3,3))
print(x)Вывод:
[[[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 на границах.
import numpy as np
x = np.ones((8, 8))
x[1:-1, 1:-1] = 0
print(x)Вывод:
[[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 Задание
Задача: Создайте массив и отсортируйте его по убыванию.
import numpy as np
arr = np.array([2,1,5,3,7,4,6,8])
arr=np.sort(arr)
arr=arr[::-1]
print(arr)Вывод:
[8 7 6 5 4 3 2 1]1.3.6 Задание
Задача: Создайте матрицу, выведите ее форму, размер и размерность.
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)Вывод:
[[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]]
Форма матрицы: прямоугольная матрица
Размер: 9
Размерность: 202.1. Теоретический материал – Библиотека Pandas
Первым шагом в любом начинании в области машинного обучения является введение исходных данных в систему. Исходные данные могут вводиться вручную, содержаться в файле или храниться в интернете в каком-либо формате. Кроме того, часто требуется получить данные из нескольких источников.
Библиотека pandas – это удобный и быстрый инструмент для работы с данными, обладающий большим функционалом. Если очень кратко, тоpandas – это библиотека, которая предоставляет очень удобные с точки зрения использования инструменты для хранения данных и работе с ними. Библиотека pandas присутствует в стандартной поставке Anaconda. Если же ее там нет, то его можно установить отдельно. Для этого введите командной строке:
pip install pandasДля импорта библиотеки используйте команду:
import pandas as pdБиблиотека pandas предоставляет две ключевые структуры данных: Series и DataFrame.
Series – это одномерная структура данных, ее можно представить, как таблицу с одной строкой. С Series можно работать как с обычным массивом (обращаться по номеру индекса), и как с ассоциированным массивом, когда можно использовать ключ для доступа к элементам данных.
DataFrame – это двумерная структура. Идейно она очень похожа на обычную таблицу, что выражается в способе ее создания и работе с ее элементами.
2.2.1 Пример
Задача: Создать Series из списка Python, словаря Python, и массива Numpy (установить буквенные метки для последнего).
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)Вывод:
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: int642.2.2 Пример
Задача: Дано два Series. Напечатать их первые элементы и все элементы после третьего (во втором фрейме).
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:])Вывод:
1
5
d 4
e 5
dtype: int642.2.3 Пример
Задача: Создайте новый фрейм данных.
dataframe = pd.DataFrame()
dataframe['Имя']=['Джеки Джексон','Стивен Стивенсон']
dataframe['Возраст']=[38,25]
dataframe['Водитель']=[True,False]
dataframeВывод:
Имя Возраст Водитель
0 Джеки Джексон 38 True
1 Стивен Стивенсон 25 False2.2.4 Пример
Задача: Загрузите фрейм данных по ссылке: https://raw.githubusercontent.com/chrisalbon/simulated_datasets/master/titanic.csv
#Создать 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
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.
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 Пример
Задача: Требуется отобрать строки фрейма данных на основе некоторого условия. Необходимо сформировать новый фрейм данных из пассажиров первого класса.
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, не используя встроенную формулу.
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)Вывод:
4334931936042.3.2 Задание
Задача: Найдите в Интернете ссылку на любой csv файл и сформируйте из него фрейм данных (например, коллекцию фреймов данных можно найти здесь: https://github.com/akmand/datasets).
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.
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-масштабирование данных на основе среднего значения и стандартного отклонения: производят деление разницы между переменной и средним значением на стандартное отклонение.
При масштабировании данных мы будем использовать одну из популярных библиотек машинного обучения Scikit-learn. Библиотека содержит пакет sklearn.preprocessing, который предоставляет широкиевозможности для нормализации данных. Следует отметить, что в целом алгоритмы обучения выигрывают от стандартизации набора данных.
3.2.1. Пример
Задача: Прошкалируйте числовой признак в диапазон между двумя значениями.
#Загрузить библиотеки
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Вывод:
array([[0. ],
[0.28571429],
[0.35714286],
[0.42857143],
[1. ]])3.2.2. Пример
Задача: Преобразуйте признак, чтобы он имел среднее значение 0 и стандартное отклонение 1.
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())Вывод:
Среднее: 0
Стандартное отклонение: 1.03.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']})
Необходимо масштабировать его числовые столбцы.
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Вывод:
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 small3.3.2 Задание
Задача:
Загрузить фрейм данных по ссылке:
https://raw.githubusercontent.com/akmand/datasets/master/iris.csv
Необходимо выполнить нормализацию первого числового признака (sepal_length_cm) с использованием минимаксного преобразования, а второго (sepal_width_cm) с задействованием z-масштабирования.
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Вывод:
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]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Вывод:
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]