%matplotlib inline
Numpy — библиотека для научных вычислений, которая предоставляет эффективные массивы. Массивы в numpy называтют ndarray
(от N-dimensional array).
ndarray
состоят из трёх частей:
Ниже показаны простейшие операции с numpy-массивом:
# Импорт numpy
import numpy as np
# Пример 1D-массива
x = np.array([1, 2, 3], np.int32) # Создаем массив
x = np.append(x, np.int32(4)) # Добавить в конец массива
(type(x),
x.shape, # форма массива
x.dtype, # тип элемента
x[2], # извлечь элемент по индексу
x[:2] # slice (подмассив)
)
Массивы в numpy производительней списков.
# Списки vs Numpy: список
%timeit a = [i**2 for i in range(1000)]
# Списки vs Numpy: numpy-массив
%timeit b = np.arange(1000)**2
Хранилище данных ndarray
— непрерывная последовательность байт. К ней можно получить прямой доступ.
# Хранилище данных в массиве numpy
type(x.data), x.data
NB! memoryview
— специальный встроенный тип в Python, который даёт эффектинвый доступ к памяти объектов. Если необыходимо выделить участок подпамяти, то это происходит без копирования.
# Атрибуты массива в numpy
x.__array_interface__, x.flags
Для каких-то экзотических случаев может быть полезно использовать внешний data buffer.
# Numpy-массив на внешнем data buffer
s = b"Hello"
y=np.frombuffer(s, dtype=np.int8)
y, id(s), y.__array_interface__["data"][0]
Обратите внимание на адрес байтовой строки (id
в CPython) и адрес data buffer.
Страйд (англ. stride) — шаг, с которым извлекаются элементы массива.
# Схема индексирования
x = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
],
np.int32)
x.strides # вернёт (3*4, 4), где 4 — длина одного элемента в байтах
Некоторые модификации массивов numpy сводятся к изменению страйдов.
# Реврс массива numpy — изменние страйда
x = np.array([1,2,3], np.int8)
x.strides, x[::-1].strides
# Изменение формы массива numpy — изменние страйда
x = np.array([[1,2,3],
[4,5,6],
],
np.int8)
x.strides, x.reshape(6,1), x.reshape(6,1).strides
# Индексация по маске
x = np.array([1,2,3], np.int8)
x[[False, True, False]]
# Индексация по по маске, заданной функцией
x = np.arange(1, 10)
x[x%2==0]
# Индексация по списку индексов
x = np.array([1,2,3], np.int8)
x[[1,2]]
# Полэлементное произведение матриц и матричное произведение (dot)
a = np.array([[1,2],[3,4]])
b = np.array([[1,0],[0,1]])
print(a*b , a.dot(b), sep='\n\n')
# Сумма, среднее, максимальное значение, индекс максимального значения массива
x = np.random.rand(10)
(
x,
x.sum(),
x.mean(),
x.max(),
x.argmax()
)
# Broadcasting — если размеры массивов не совпадают, то операции размножаются
a = np.array([[1,2],[3,4]])
b = np.array([[0,1]])
a+b
# Пример FFT с numpy-массивом
import matplotlib.pyplot as plt
w = 2*0.5*np.pi
time = np.arange(0,10,0.125)
sigl = np.sin(w*time)
spct = np.fft.fft(sigl)
freq = np.fft.fftfreq(time.shape[-1])
plt.subplot(2, 1, 1)
plt.plot(time, sigl) # Сигнал
plt.subplot(2, 1, 2)
plt.plot(freq, np.real(spct * np.conjugate(spct))) # Спектр
Pandas — библиотека для анализа данных, надстройка над numpy. Основные структуры данных в Pandas — Series
(1D) и DataFrame
(2D).
# Импорт Pandas
import pandas as pd
# Series в Pandas
pd.Series([1, 3, 5, np.nan, 6, 8])
Pandas умеет обрабатывать пропуски в данных (NaN).
DataFrame — это набор series.
# DataFrame в Pandas
pd.DataFrame({'one': pd.Series([1., 2., 3.]),
'two': pd.Series([1., 2., 3., 4.])})
Ниже приведен пример некоторых шагов анализа внешнего датасета. Для примера использован датасет с чаевыми.
# Загрузка датасета в pandas
dataset = pd.read_csv("https://raw.github.com/pandas-dev/pandas/master/pandas/tests/data/tips.csv")
dataset.head() # Показать первые несколько строк датасета
В DataFrame можно добавить новые колонки.
# Новая колонка — чаевые как процент от суммы чека
dataset["tip%"]=dataset["tip"]/dataset["total_bill"]*100
Простейший анализ — описательная статистика. Описательная статистика применима к числовым данным.
# Описательная статистика для числовых колонок
dataset.describe()
# Сложный запрос в Pandas
dataset.groupby(by="sex")[["tip%"]].mean()
# Простейшая визуализация данных с Seaborn: boxplot по дням недели и полу
import seaborn as sns
import matplotlib.pyplot as plt
sns.boxplot(x="day", y="tip%", hue="sex", data=dataset, palette="Set1")
# Визуализация данных с Seaborn: scatterplot + линейная регрессия + гистограммы
import seaborn as sns
import matplotlib.pyplot as plt
sns.jointplot(x="total_bill", y="tip%", data=dataset, kind="reg")
%load_ext watermark
%watermark -d -u -v -iv