Пакет для статистической обработки данных, по функциональности близкий к R.
import numpy as np
import pandas as pd
Одномерный набор данных. Отсутствующий данные записываются как np.nan
(в этот день термометр сломался или метеоролог был пьян); они не участвуют в вычислении средних, среднеквадратичных отклонений и т.д.
l=[1,3,5,np.nan,6,8]
s=pd.Series(l)
s
Основная информация о наборе данных: среднее, среднеквадратичное отклонение, минимум, максимум, медиана (которая отличается от среднего для несимметричных распределений).
s.describe()
Обычная индексация.
s[2]
s[2]=7
s
s[2:5]
s1=s[1:]
s1
s2=s[:-1]
s2
В сумме s1+s2
складываются данные с одинаковыми индексами. Поскольку в s1
нет данного и индексом 0, а в s2
- с индексом 5, в s1+s2
в соответствующих позициях будет NaN
.
s1+s2
К наборам данных можно применять функции из numpy
.
np.exp(s)
При создании набора данных s
мы не указали, что будет играть роль индекса. По умолчанию это последовательность целых чисел 0, 1, 2, ...
s.index
Но можно создавать наборы данных с индексом, заданным списком.
i=list('abcdef')
i
s=pd.Series(l,index=i)
s
s['c']
Если индекс - строка, то вместо s['c']
можно писать s.c
.
s.c
Набор данных можно создать из словаря.
s=pd.Series({'a':1,'b':2,'c':0})
s
Можно отсортировать набор данных.
s.sort_values()
Роль индекса может играть, скажем, последовательность дат (или времён измерения и т.д.).
d=pd.date_range('20160101',periods=10)
d
s=pd.Series(np.random.normal(size=10),index=d)
s
Операции сравнения возвращают наборы булевых данных.
s>0
Если такой булев набор использовать для индексации, получится поднабор только из тех данных, для которых условие есть True
.
s[s>0]
Кумулятивные максимумы - от первого элемента до текущего.
s.cummax()
Кумулятивные суммы.
s=s.cumsum()
s
Построим график.
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(s)
Двумерная таблица данных. Имеет индекс и набор столбцов (возможно, имеющих разные типы). Таблицу можно построить, например, из словаря, значениями в котором являются одномерные наборы данных.
d={'one':pd.Series([1,2,3],index=['a','b','c']),
'two':pd.Series([1,2,3,4],index=['a','b','c','d'])}
df=pd.DataFrame(d)
df
df.index
df.columns
Если в качестве индекса указать имя столбца, получится одномерный набор данных.
df['one']
df.one
df['one']['c']
Однако если указать диапазон индексов, то это означает диапазон строк. Причём последняя строка включается в таблицу.
df['b':'d']
Диапазон целых чисел даёт диапазон строк с такими номерами, не включая последнюю строку (как обычно при индексировании списков). Всё это кажется довольно нелогичным.
df[1:3]
Логичнее работает атрибут loc
: первая позиция - всегда индекс строки, а вторая - столбца.
df.loc['b']
df.loc['b','one']
df.loc['a':'b','one']
df.loc['a':'b',:]
df.loc[:,'one']
К таблице можно добавлять новые столбцы.
df['three']=df['one']*df['two']
df['flag']=df['two']>2
df
И удалять имеющиеся.
del df['two']
df['foo']=0.
df
Добавим копию столбца one
, в которую входят только строки до второй.
df['one_tr']=df['one'][:2]
df
df=df.loc[:,['one','one_tr']]
df
Можно объединять таблицы по вертикали и по горизонтали.
df2=pd.DataFrame({'one':{'e':0,'f':1},'one_tr':{'e':2}})
df2
pd.concat([df,df2])
df2=pd.DataFrame({'two':{'a':0,'b':1},'three':{'c':2,'d':3}})
df2
pd.concat([df,df2],axis=1)
Создадим таблицу из массива случайных чисел.
df=pd.DataFrame(np.random.randn(10,4),
columns=['A','B','C','D'])
df
df2=pd.DataFrame(np.random.randn(7,3),columns=['A','B','C'])
df+df2
2*df+3
np.sin(df)
df.describe()
df.sort_values(by='B')
Атрибут iloc
подобен loc
: первый индекс - номер строки, второй - номер столбца. Это целые числа, конец диапазона на включается (как обычно в питоне).
df.iloc[2]
df.iloc[1:3]
df.iloc[1:3,0:2]
Построим графики кумулятивных сумм - мировые линии четырёх пьяных, у которых величина каждого шага - гауссова случайная величина.
cs=df.cumsum()
cs
plt.plot(cs)