In [114]:
import pandas
#from pandas import *
from pandas import Series, DataFrame
import numpy as np
#import import datetime
"""
chamei o script com --pylab=inline entao nao preciso a linha abaix
caso contrario descomente-a
"""
#mport matplotlib as plt
def side_by_side(*objs, **kwds):
from pandas.core.common import adjoin
space = kwds.get('space', 4)
reprs = [repr(obj).split('\n') for obj in objs]
print(adjoin(space, *reprs))
plt.rc('figure', figsize=(10, 6))
#Obsoleto: pandas.set_printoptions(notebook_repr_html=False)
#Atual: pandas.set_option('display.notebook_repr_html', True)
pandas.set_option('display.notebook_repr_html', False)
In [13]:
#Criando uma lista simples com strings
labels = ['a', 'b','c','d','e']
# randn(5) array de 5 dados aleatorios
#Segundo argumento diz que as labels serao os indices do array
s = Series(randn(5), index=labels)
s
Out[13]:
Os Objetos Series em um comportamento semelhande aos dicionarios, sendo formadas por um pars indice-valor
In [23]:
'b' in s
Out[23]:
In [26]:
s['c']
Out[26]:
In [27]:
mapping = s.to_dict()
mapping
Out[27]:
In [31]:
# Eh possivel passar um dicionario como argumento de um Objeto Series
s = Series(mapping)
s
Out[31]:
In [33]:
# Eh possivel alterar a ordem e os indices
s = Series(mapping, index=['b','e','a','d','f'])
s
Out[33]:
Observamos que o valor para o novo indice 'f'
eh NaN, pois nao possuia valor no mapping original. Este eh o comportamento padrao para dados ausentes (missing data).
No modulo pandas
existem duas funcoes que identificam esses valores, resultando em um valor logico: isnull
e notnull
.
In [34]:
isnull(s)
Out[34]:
In [36]:
# Encontrando ela
s[isnull(s)]
Out[36]:
In [37]:
notnull(s)
Out[37]:
In [43]:
# Removendo dadso ausentes (NaN) - Lembre da imutabilidade
s.dropna()
Out[43]:
In [42]:
s.index
Out[42]:
In [45]:
df = DataFrame({
'a': np.random.randn(6),
'b': ['foo', 'bar'] * 3,
'c': np.random.randn(6)
})
In [50]:
df.index
Out[50]:
In [51]:
df.columns
Out[51]:
In [60]:
df
Out[60]:
In [100]:
# Criando e atribuindo valores a uma nova coluna
df['d'] = 5
In [62]:
df
Out[62]:
In [69]:
# Slicing ex: as ultimas duas linhas
df[-2:]
Out[69]:
In [73]:
# O metodo xs(n) retorna uma serie da linha n sendo os nomes
# das colunas seus indices
df.xs(0)
Out[73]:
In [85]:
timeit df.ix[0, 'b']
In [79]:
timeit df.get_value(2, 'b')
In [87]:
# Fatie a segunda linha ate a linha 4, nas colunas 'b' e 'c'
df.ix[2:4, ['b','c'] ]
Out[87]:
In [99]:
# Retorne as linhas em que apenas os valores da coluna c
# sejam maiores do que zero
df[df.c > 0]
Out[99]:
In [97]:
df['c'] > 0
Out[97]:
In [101]:
# Pandas pode gerar indices predefinidos, por exemplo datas
In [115]:
df = DataFrame({
'a': np.random.randn(6),
'b': ['foo', 'bar'] * 3,
'c': np.random.randn(6)},
index=date_range('1/1/2000', periods=6)
)
In [118]:
df
Out[118]:
In [121]:
df = DataFrame({
'a': np.random.randn(6),
'b': ['foo', 'bar'] * 3,
'c': np.random.randn(6)
}, columns=['a','b','c','d'])
In [124]:
df
#isnull(df)
Out[124]:
In [152]:
data = {}
for col in ['foo','bar','baz']:
for row in ['a', 'b', 'c', 'd']:
data.setdefault(col, {})[row] = rand()
data
Out[152]:
In [153]:
# Deletando um valor
del data['foo']['c']
In [154]:
DataFrame(data)
Out[154]:
Observe o valor faltante onde usamos o comando del data['foo']['c']
sendo substituido por NaN
.
In [162]:
# Lendo dados de um arquivo .csv
close_px = read_csv('dados/stock_data.csv', index_col=0, parse_dates=True)
# Comandos de terminal podem ser usados iniciando a linha com !
#!head dados/stock_data.csv
# Via funcao do pandas close_px.head()
In [167]:
close_px
Out[167]:
In [173]:
# Criando series com partes dos papeis da Apple
s1 = close_px['AAPL'][-20:]
s2 = close_px['AAPL'][-25:-10]
# Usando a funcao definida no inicio desse material para
# apresenta-las lado a lado
side_by_side(s1, s2)
In [186]:
s1 + s2
Out[186]:
Observe que na soma, onde as series nao se sobrepoe os valores sao
substituidos por valores ausentes NaN
NaN
padrao. O valor ausente, zero por exemplo:
s1.add(s2, fill_value=0)
2011-09-12 379.94
2011-09-13 384.62
2011-09-14 389.30
2011-09-15 392.96
2011-09-16 400.50
2011-09-19 823.26
2011-09-20 826.90
2011-09-21 824.28
2011-09-22 803.64
2011-09-23 808.60
2011-09-26 806.34
2011-09-27 798.52
2011-09-28 794.02
2011-09-29 781.14
2011-09-30 762.64
2011-10-03 374.60
2011-10-04 372.50
2011-10-05 378.25
2011-10-06 377.37
2011-10-07 369.80
2011-10-10 388.81
2011-10-11 400.29
2011-10-12 402.19
2011-10-13 408.43
2011-10-14 422.00
Name: AAPL, dtype: float64
In [177]:
# Selecinando apenas situacoes em que elas se sobrepoe e possuem valres
(s1 + s2).dropna()
Out[177]:
In [184]:
# Fatiar apenasultimas 10 linhas e apenas as primeiras 3 colunas
df = close_px.ix[-10:,:3]
df
Out[184]:
In [188]:
# Mostrando lado a lado s1 e s2, em que a serie s1 foi reindexada pelo
# indice da s2
side_by_side(s1.ix[s2.index], s2)
In [195]:
# Intersection
b,c = s1.align(s2, join='inner')
side_by_side(b,c)
In [194]:
#
b,c = s1.align(s2, join='outer')
side_by_side(b,c)
In [196]:
#
b,c = s1.align(s2, join='right')
side_by_side(b,c)
In [201]:
df = close_px.ix[-10:, ['AAPL','IBM','MSFT']]
df
Out[201]:
In [232]:
# Media sobre linhas axis=1 e sobre colunas axis=0
#df.apply(np.mean, axis=1)
# df.mean(1, skipna=False) ou True caso omitir valores ausentes
df.mean(1)
Out[232]:
In [233]:
# Media sobre colunas
df.mean()
Out[233]:
In [237]:
"""
Criando uma funcao que encontra os indices dos valores maximos das
series em um dataframe
"""
def peak_date(series):
return series.idxmax()
close_px.apply(peak_date)
Out[237]:
In [238]:
#
df.apply(lambda x: x.max() - x.min()) # np.ptp
Out[238]:
In [252]:
#np.log(close_px)
close_px.head(5)
Out[252]:
In [253]:
close_px.tail(5)
Out[253]:
In [255]:
!head -5 dados/stock_data.csv; echo '\n';tail -5 dados/stock_data.csv;
In [242]:
#%matplotlib inline
close_px[['AAPL','IBM','MSFT','XOM']].plot()
Out[242]:
In [260]:
#Mostrando a ultima linha
close_px.ix[-1]
Out[260]:
In [258]:
# Fechamento no ultimo dia (ultima linha)
close_px.ix[-1].plot(kind='bar')
title('Preco em %s' % close_px.index[-1])
axhline(0)
Out[258]:
In [ ]: