Типы ответов
Типы признаков
Обобщающая способность
Задачи анализа данных
import numpy as np
A = np.arange(15).reshape(3, 5)
A
array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
Транспонирование матрицы
A.T
array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 7, 12], [ 3, 8, 13], [ 4, 9, 14]])
B = np.arange(6).reshape(2, 3)
B
array([[0, 1, 2], [3, 4, 5]])
Конкатенация:
np.concatenate((A.T, B), axis=0)
array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 7, 12], [ 3, 8, 13], [ 4, 9, 14], [ 0, 1, 2], [ 3, 4, 5]])
np.concatenate((A, B.T), axis=1)
array([[ 0, 1, 2, 3, 4, 0, 3], [ 5, 6, 7, 8, 9, 1, 4], [10, 11, 12, 13, 14, 2, 5]])
В чем разница между concatenate и vstack/hstack? Stackoverflow!
Изменение размера матрицы (количество элементов должно оставаться тем же)
np.arange(6).reshape(2, 3)
array([[0, 1, 2], [3, 4, 5]])
Если задать один один из параметров равным -1, то он будет вычислен автоматически
np.arange(6).reshape(2, -1)
array([[0, 1, 2], [3, 4, 5]])
Вытягивание в вектор
np.ravel(A)
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
np.ravel(A, order='F')
array([ 0, 5, 10, 1, 6, 11, 2, 7, 12, 3, 8, 13, 4, 9, 14])
?np.ravel
Логические операции
A = np.arange(10).reshape(2, 5)
A
array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]])
Применить одно условие достаточно просто
A[A > 4]
array([5, 6, 7, 8, 9])
Если нужно сделать несколько условий?
A[A > 4 and A < 6]
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-44-2852d2c8b339> in <module>() ----> 1 A[A > 4 and A < 6] ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
A[np.logical_and(A > 4, A < 8)]
array([5])
Чтобы нейти все ненулевые элементы матрицы:
A.nonzero()
(array([0, 0, 0, 0, 1, 1, 1, 1, 1]), array([1, 2, 3, 4, 0, 1, 2, 3, 4]))
A[A.nonzero()]
array([1, 2, 3, 4, 5])
?np.nonzero
Ещё один тип данных в NumPy — matrix. Является производным классом от ndarray, в связи с чем можно использовать все методы и функции, применимые к array. Однако:
A = np.arange(0, 4).reshape(2, 2)
B = np.arange(3, 7).reshape(2, 2)
A * B
array([[ 0, 4], [10, 18]])
a = np.matrix(A)
b = np.matrix(B)
a * b
matrix([[ 5, 6], [21, 26]])
import pandas as pd
data = pd.read_csv('titanic.csv')
data.head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35 | 1 | 0 | 113803 | 53.1000 | C123 | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35 | 0 | 0 | 373450 | 8.0500 | NaN | S |
data.columns
Index([u'PassengerId', u'Survived', u'Pclass', u'Name', u'Sex', u'Age', u'SibSp', u'Parch', u'Ticket', u'Fare', u'Cabin', u'Embarked'], dtype='object')
data.shape
(891, 12)
data['Survived'].head()
0 0 1 1 2 1 3 1 4 0 Name: Survived, dtype: int64
data['Pclass'].unique()
array([3, 1, 2])
data[['Survived', 'Pclass']][:10]
Survived | Pclass | |
---|---|---|
0 | 0 | 3 |
1 | 1 | 1 |
2 | 1 | 3 |
3 | 1 | 1 |
4 | 0 | 3 |
5 | 0 | 3 |
6 | 0 | 1 |
7 | 0 | 3 |
8 | 1 | 3 |
9 | 1 | 2 |
Если хочется делать неожиданные срезы по столбцам и строкам одновременно, можно воспользоваться методом iloc: он работает с целочисленной индексацией
data.iloc[1:3, 1:3]
Survived | Pclass | |
---|---|---|
1 | 1 | 1 |
2 | 1 | 3 |
Группировка позволяет объединять данные и считать по ним общую статистику. Для группировки данных есть метод groupby, который возвращает специальный объект.
data.groupby('Sex')
<pandas.core.groupby.DataFrameGroupBy object at 0x10bf46510>
data.groupby('Pclass')['Fare'].describe()
Pclass 1 count 216.000000 mean 84.154687 std 78.380373 min 0.000000 25% 30.923950 50% 60.287500 75% 93.500000 max 512.329200 2 count 184.000000 mean 20.662183 std 13.417399 min 0.000000 25% 13.000000 50% 14.250000 75% 26.000000 max 73.500000 3 count 491.000000 mean 13.675550 std 11.778142 min 0.000000 25% 7.750000 50% 8.050000 75% 15.500000 max 69.550000 dtype: float64
data.groupby('Sex')['Survived'].value_counts()
Sex Survived female 1 233 0 81 male 0 468 1 109 dtype: int64
data.groupby(['Sex', 'Pclass'])['Survived'].value_counts()
Sex Pclass Survived female 1 1 91 0 3 2 1 70 0 6 3 0 72 1 72 male 1 0 77 1 45 2 0 91 1 17 3 0 300 1 47 dtype: int64
data.groupby(['Pclass', 'Sex'])['Survived'].value_counts()
Pclass Sex Survived 1 female 1 91 0 3 male 0 77 1 45 2 female 1 70 0 6 male 0 91 1 17 3 female 0 72 1 72 male 0 300 1 47 dtype: int64
male = data[data['Sex'] == 'male']
female = data[data['Sex'] == 'female']
pd.concat([male, female]).head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22 | 1 | 0 | A/5 21171 | 7.2500 | NaN | S |
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35 | 0 | 0 | 373450 | 8.0500 | NaN | S |
5 | 6 | 0 | 3 | Moran, Mr. James | male | NaN | 0 | 0 | 330877 | 8.4583 | NaN | Q |
6 | 7 | 0 | 1 | McCarthy, Mr. Timothy J | male | 54 | 0 | 0 | 17463 | 51.8625 | E46 | S |
7 | 8 | 0 | 3 | Palsson, Master. Gosta Leonard | male | 2 | 3 | 1 | 349909 | 21.0750 | NaN | S |
pd.concat([male.iloc[1:3], female]).head()
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
4 | 5 | 0 | 3 | Allen, Mr. William Henry | male | 35 | 0 | 0 | 373450 | 8.0500 | NaN | S |
5 | 6 | 0 | 3 | Moran, Mr. James | male | NaN | 0 | 0 | 330877 | 8.4583 | NaN | Q |
1 | 2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Th... | female | 38 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
2 | 3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26 | 0 | 0 | STON/O2. 3101282 | 7.9250 | NaN | S |
3 | 4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35 | 1 | 0 | 113803 | 53.1000 | C123 | S |
data['Age'][:20]
0 22 1 38 2 26 3 35 4 35 5 NaN 6 54 7 2 8 27 9 14 10 4 11 58 12 20 13 39 14 14 15 55 16 2 17 NaN 18 31 19 NaN Name: Age, dtype: float64
data['Age'].describe()
count 714.000000 mean 29.699118 std 14.526497 min 0.420000 25% 20.125000 50% 28.000000 75% 38.000000 max 80.000000 Name: Age, dtype: float64
count у метода describe вернет количество объектов, имеющих значение данного признака
чтобы посмотреть какие объекты имеют пропуски можно воспользоваться методом isnull
data['Age'].isnull()[:20]
0 False 1 False 2 False 3 False 4 False 5 True 6 False 7 False 8 False 9 False 10 False 11 False 12 False 13 False 14 False 15 False 16 False 17 True 18 False 19 True Name: Age, dtype: bool
data[data['Age'].isnull()][:10]
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
5 | 6 | 0 | 3 | Moran, Mr. James | male | NaN | 0 | 0 | 330877 | 8.4583 | NaN | Q |
17 | 18 | 1 | 2 | Williams, Mr. Charles Eugene | male | NaN | 0 | 0 | 244373 | 13.0000 | NaN | S |
19 | 20 | 1 | 3 | Masselmani, Mrs. Fatima | female | NaN | 0 | 0 | 2649 | 7.2250 | NaN | C |
26 | 27 | 0 | 3 | Emir, Mr. Farred Chehab | male | NaN | 0 | 0 | 2631 | 7.2250 | NaN | C |
28 | 29 | 1 | 3 | O'Dwyer, Miss. Ellen "Nellie" | female | NaN | 0 | 0 | 330959 | 7.8792 | NaN | Q |
29 | 30 | 0 | 3 | Todoroff, Mr. Lalio | male | NaN | 0 | 0 | 349216 | 7.8958 | NaN | S |
31 | 32 | 1 | 1 | Spencer, Mrs. William Augustus (Marie Eugenie) | female | NaN | 1 | 0 | PC 17569 | 146.5208 | B78 | C |
32 | 33 | 1 | 3 | Glynn, Miss. Mary Agatha | female | NaN | 0 | 0 | 335677 | 7.7500 | NaN | Q |
36 | 37 | 1 | 3 | Mamee, Mr. Hanna | male | NaN | 0 | 0 | 2677 | 7.2292 | NaN | C |
42 | 43 | 0 | 3 | Kraeff, Mr. Theodor | male | NaN | 0 | 0 | 349253 | 7.8958 | NaN | C |
Для удаления объектов с пропусками можно воспользоваться методом dropna. В отличии от None, nan нельзя сравнивать сам с собой. Сравните:
None == None
True
np.nan == np.nan
False
new_data = data.dropna()
new_data.shape
(183, 12)
Если нужно удалить только объекты, имеющие пропуски в определенных колонкач, можно в параметре subset указать колонки, на которые обращать внимание:
new_data = data.dropna(subset=['Age'])
new_data.shape
(714, 12)
Чтобы сохранить данные можно воспользоваться методом to_csv:
new_data.to_csv("titanic2.csv")
%pylab inline
import matplotlib.pyplot as plt
Populating the interactive namespace from numpy and matplotlib
x = linspace(1, 10, 20)
y = x ** 3
matplotlib позволяет строить как непрерывные линии:
plot(x, y)
[<matplotlib.lines.Line2D at 0x10d1c6350>]
Так и отдельно точки:
scatter(x, y)
<matplotlib.collections.PathCollection at 0x10d007d10>
И все вместе!
plot(x, y, 'bo-')
[<matplotlib.lines.Line2D at 0x1100c1e90>]
Но вернемся к реальным данным. Иногда хочется посмотреть на данные, "не отходя" от pandas:
data['Age'].hist()
<matplotlib.axes._subplots.AxesSubplot at 0x10e431310>
?pd.DataFrame.hist
data['Age'].hist(bins=20)
<matplotlib.axes._subplots.AxesSubplot at 0x10e4a5dd0>
Группировки также работают (параметр by):
data['Age'].hist(by=data['Sex'])
array([<matplotlib.axes._subplots.AxesSubplot object at 0x10f868b10>, <matplotlib.axes._subplots.AxesSubplot object at 0x10fa00050>], dtype=object)
Такие гистограммы не удобно сравнивать, хотя бы потому что они имеют разный масштаб по оси y. Испраим это:
data['Age'].hist(by=data['Sex'], sharey=True)
array([<matplotlib.axes._subplots.AxesSubplot object at 0x1113f0190>, <matplotlib.axes._subplots.AxesSubplot object at 0x111578990>], dtype=object)
Аналогично можно задать одинаковый масштаб по оси x:
data['Age'].hist(by=data['Sex'], sharey=True, sharex=True)
array([<matplotlib.axes._subplots.AxesSubplot object at 0x10d9ffdd0>, <matplotlib.axes._subplots.AxesSubplot object at 0x10e0cef10>], dtype=object)
Но все же строить более сложные графики лучше с помощью matplotlib:
bins = 20
index = np.arange(bins)
male = plt.hist(data[data['Sex'] == 'male']['Age'].dropna(), bins=bins, alpha=0.6, label='male')
female = plt.hist(data[data['Sex'] == 'female']['Age'].dropna(), bins=bins, alpha=0.6, label='female')
plt.legend()
plt.xlabel('Age')
plt.ylabel('Scores')
plt.title('Age by gender')
plt.legend()
plt.show()
Если нужно сравнить данные по процентому соотношению, можно задать параметр normed:
bins = 20
index = np.arange(bins)
male = plt.hist(data[data['Sex'] == 'male']['Age'].dropna(), bins=bins, alpha=0.6, normed=True, label='male')
male = plt.hist(data[data['Sex'] == 'female']['Age'].dropna(), bins=bins, alpha=0.6, normed=True, label='female')
plt.xlabel('Age')
plt.ylabel('Scores')
plt.title('Age by gender')
plt.legend()
plt.show()
Не забывайте, что порой играет роль как мы смотрим на данные.