PandasDFNotes Es
PandasDFNotes Es
PandasDFNotes Es
d dato
d dato
d dato
d dato
d dato
d dato
(df.index)
+'USUARIO:CONTRASEÑA@HOST/BASE DE DATOS')
e s
e s
e s
e s
e s
e s
e s
Índice de
df = pd.read_sql_table('tabla', motor)
filas
Serie
Serie
Serie
Serie
Serie
Serie
# Ejemplo 1 ...
s1 = Serie(rango(6)) s2
= s1 * s1
Un DataFrame tiene dos índices: datos con un
s2.index índice. Todos
= s2.index + 2los datos de unaíndices
# desalinear serie son del
• Normalmente, el índice de columna (df.columns) es df = pd.concat([s1,
mismo tipo. La aritméticas2], axis=1)
de las series se vectoriza
una lista de cadenas (nombres de variables) o después del primer
(menos comúnmente) números enteros # Ejemplo 2 ...
• Normalmente, el índice de fila (df.index) podría ser: s3 = Serie({'Tom':1, 'Dick':4, 'Har':9})
o Enteros - para números de caja o de fila; s4 = Serie({'Tom':3, 'Dick':2, 'Mar':5})
o Cadenas - para nombres de casos; o df = pd.concat({'A':s3, 'B':s4 }, axis=1)
o DatetimeIndex o PeriodIndex - para series
temporales
Versión 30 de abril de 2017 - [Borrador - Mark Graph - mark dot the dot graph at gmail dot com - @Mark_Graph
on twitter]. 1
Obtener un DataFrame a partir de los datos de un diccionario Python
# --- use helper method for data in rows Trabajar con todo el DataFrame
df = DataFrame.from_dict({ # datos por fila
# filas como diccionarios Eche un vistazo al contenido/estructura del DataFrame
python 'fila0' : {'col0':0, df.info() # Índice y tipos de
'col1':'A'}, dfh = df.head(i) datos
fila1 : {'col0':1, 'col1':'B'} dft = df.tail(i) # Obtener las
}, orient='index') primeras
dfs = df.describe() # resumen i filas
estadístico
cols # Obtener las
df = DataFrame.from_dict({ # datos por fila últimas i =
esquina_arriba_izquierda_df filas
# filas como listas python df.iloc[:4, :4]
fila0' : [1, 1+1j, 'A'],
fila1 : [2, 2+2j, 'B'] Atributos no indexables de DataFrame
}, orient='index') df = df.T # transponer filas y
l = df.ejes columnas
# list row and#col
(r_idx, c_idx) = df.axes de indexes
arriba
Crear datos de reproducción/falsificación (útil para pruebas) s = d f . dtypes # Tipos de datos de
# --- simple - índices enteros por columna de serie b = d f .empty # True
defecto df = para DataFrame vacío i = d f . ndim# número
DataFrame(np.random.rand(50,5)) de ejes (es 2) t = d f . shape # (número
de filas, número de columnas) i = df.size #
# --- con un índice de fila de marca de tiempo: número de filas * número de columnas a =
df = DataFrame(np.random.rand(500,5)) d f . values # obtener una matriz
df.index = pd.date_range('1/1/2005', numpy para df
Métodos de utilidad de DataFrame
periods=len(df), freq='M')
df = df.copy() # copiar un DataFrame
df = d f . rank() # clasificar cada col (por
# con índices alfabéticos de filas y
defecto) df = df.sort_values(by=col)
columnas y una variable "agrupable"
df = df.sort_values(by=[col1, col2])
import string
df = df.sort_index()
importar
random filas = df = df.astype(dtype) # conversión de tipos
52
Métodos de iteración de DataFrame
cols = 5
assert(1 <= filas <= 52) # número df.iteritems() # (col-index, Series)
mínimo/máximo de filas df = pares df.iterrows() # pares (fila-
DataFrame(np.random.randn(filas, cols), índice, Serie) # ejemplo ... iterando
columns=['c'+str(i) for i in range(cols)], sobre columnas ... for (nombre, serie)
index=list((string.ascii_uppercase + in df.iteritems():
string.ascii_lowercase)[0:filas])) print('\nCol nombre: ' + str(nombre))
df['agrupable'] = [random.choice('abcde') print('1er valor: ' + str(serie.iat[0]))
for _ in range(filas)]
Matemáticas en todo el DataFrame (no es una lista
Guardar un DataFrame completa)
df = df.abs() # valores absolutos
df = df.add(o) # añadir df, Serie o valor s =
df.count() # valores no NA/nulos
Guardar un DataFrame en un archivo CSV
df = df.cummax() # (cols eje por
df.to_csv('nombre.csv', encoding='utf-8')
defecto) df = df.cummin() # (cols eje
por defecto) df = df.cumsum() # (cols
Guardar DataFrames en un libro de Excel
eje por defecto)
from pandas import ExcelWriter
df = df.diff() # 1er diff (col def eje)
writer = ExcelWriter('nombrearchivo.xlsx')
df = d f . div(o) # div por df, Serie, valor
df1.to_excel(writer,'Hoja1')
df = d f . dot(o) # matriz producto punto
df2.to_excel(writer,'Hoja2')
s = df.max() # max of axis (col def)
writer.save()
s = df.mean() # media (col eje por
defecto) s = df.mediana() # mediana
Guardar un DataFrame en MySQL
(col p o r d e f e c t o )
importar pymysql
s = df.min() # min of axis (col def)
from sqlalchemy import crear_motor
df = df.mul(o) # mul por df Serie val
e = create_engine('mysql+pymysql://' + Nota: los métodos que#devuelven una seriepor
funcionan por
s = df.sum() eje suma (cols
'USUARIO:CONTRASEÑA@HOST/DATABASE') defecto en cols
defecto) df = df.where(df > 0.5,
df.to_sql('TABLE',e, if_exists='replace') other=np.nan)
Seleccionar/filtrar filas/carpetas en función de los
valores de las etiquetas de índice
Nota: if_exists � 'fail', 'replace', 'append' df = df.filter(items=['a', 'b']) # por
col df = df.filter(items=[5], axis=0) # por
Guardar en objetos Python fila df = df.filter(like='x') # mantener x
en
Versión 30 de abril de 2017 - [Borrador - Mark Graph - mark dot the dot graph at gmail dot com col df = df.filter(regex='x') #
- @Mark_Graph
2
on twitter].
regex en col
d = df.to_dict() # al diccionario
str = df.to_string() # a cadena
m = df.as_matrix() # to numpy matrix Nota: select toma una función booleana, para cols: axis=1
Nota: el filtro se aplica por defecto a las columnas; la
selección se aplica por defecto a las filas.
Versión 30 de abril de 2017 - [Borrador - Mark Graph - mark dot the dot graph at gmail dot com - @Mark_Graph
on twitter]. 3
Establecer valores de columna en función de criterios
Trabajar con columnas df['b'] = df['a'].where(df['a']>0, other=0)
df['d'] = df['a'].where(df.b!=0, other=df.c)
Obtener índice de columnas Nota: donde other puede ser una Serie o un escalar
y etiquetas
idx = d f . columnas # obtener índice
col label = d f .columns[0] # Conversiones de tipos de datos
etiqueta primera columna st = df['col'].astype(str)# Serie dtype
l = df.columns.tolist() # lista de a = df['col'].values # matriz
etiquetas col a = df.columns.values# numpy l = df['col'].tolist() # lista
array de etiquetas col python
Cambiar las etiquetas Nota: dtypes útiles para la conversión de series: int, float,
de las
df = columnas str
df.rename(columns={'antiguo':'nuevo','a':'1'}) Trampa: índice perdido en la conversión de Serie a array o
df.columns = ['nuevo1', 'nuevo2', 'nuevo3'] # lista
etc.
Selección de Métodos/atributos comunes a toda la columna
columnas
s = df['colNombre'] # select col to Series
df = d f [['colName']] # seleccionar col en
df
valor = df['col'].dtype # Tipo de datos
df = df[['a','b']] # seleccionar 2-plus
valor = df['col'].size # dimensiones
cols
valor = df['col'].count() col # recuento
df = df[['c','a','b']] # cambiar orden col s =
valor = df['col'].sum() no-NA
df[df.columnas[0]] # seleccionar por
valor = df['col'].prod()
número
valor = df['col'].min()
df = df[df.columnas[[0, 3, 4]]] # por
valor = df['col'].max()
números df = [ d f . c o l u m n a s [ :-1]] #
valor = df['col'].media() # también
todas menos la última col mediana()
valor = df['col'].cov(df['col2'])
s = df.pop('c') # obtener y soltar de df
s= df['col'].describe()
s=
Selección de columnas con atributos Python
df['col'].recuentos_valore
s = df.a # igual que s = df['a']
s()
Buscar etiqueta de índice para valores mín./máx. en
# no se pueden crear nuevas columnas por
atributo df.columna_existente = df.a / df.b columna
df['columna_nueva'] = df.a / df.b label = df['col1'].idxmin()
label = df['col1'].idxmax()
Trampa: los nombres de las columnas deben
ser identificadores válidos. Métodos comunes de columna por elementos
Aplicar funciones matemáticas de numpy a las columnas Comprobar si los valores de índice de las columnas
son únicos/monotónicos if df.columns.is_unique: pass # ...
df['log_data'] = np.log(df['col1']) b = df.columns.is_monotonic_increasing b
Nota: muchas más funciones matemáticas numpy = df.columns.is_monotonic_decreasing
Sugerencia: Prefiera pandas math a numpy siempre que pueda.
Versión 30 de abril de 2017 - [Borrador - Mark Graph - mark dot the dot graph at gmail dot com - @Mark_Graph
on twitter]. 5
Seleccionar una porción de filas por etiqueta/índice
Trabajar con filas [inclusivo-de : inclusivo-a [ : paso]]
df = df['a':'c'] # filas 'a' a 'c'
Obtener el índice de fila y las Trampa: no puede funcionar para filas etiquetadas con
etiquetas
idx = d f . index # obtener índice números enteros - véase
de fila label = df.index[0] # fragmento de código anterior sobre el corte de posiciones
etiqueta de la primera fila etiqueta = de enteros.
df.index[-1] # etiqueta de la
última fila l = d f . i n d e x .tolist() # Añadir una fila de totales de columna a un DataFrame
obtener como lista # Opción 1: utilizar la comprensión del
a = df.index.values # obtener como array diccionario sums = {col: df[col].sum() for
col in df} sums_df =
Cambiar el índice (de fila) DataFrame(sums,index=['Total']) df =
df.append(sums_df)
df.index = idx # nuevo índice ad
df = df.set_index('A') hoc
# col# Un nuevo # Opción 2: Todo hecho con
df = df.set_index(['A', 'B']) MultiIndex
índice pandas df =
df = df.reset_index() # reemplazar
df.append(DataFrame(df.sum(),
antiguo con nuevo # nota: índice antiguo
almacenado como col en df df.index = columns=['Total']).T)
Iteración sobre filas DataFrame
range(len(df)) # establecer con lista for (index, row) in df.iterrows(): # pasar
df = df.reindex(index=range(len(df))) Trampa: el tipo de datos de la fila
df = df.set_index(keys=['r1','r2','etc'])
df.rename(index={'old':'new'}, inplace=True) puede estar forzado.
Versión 30 de abril de 2017 - [Borrador - Mark Graph - mark dot the dot graph at gmail dot com - @Mark_Graph
on twitter]. 7
Resumen: seleccionar utilizando el índice
Trabajar con células DataFrame
Selección de una celda por etiquetas de fila y columnaUso del índice DataFrame
para seleccionar columnas
valor = df.at['fila',
'columna'] s = df['col_label'] # returns Serie
valor = df.loc['fila', 'col'] df = df[['col_label']] # devuelve DataFrame
# tricky
valor = df['col'].at['row'] df = df[['L1', 'L2']] # seleccionar cols con
lista
Nota: .at[] es la búsqueda escalar más rápida basada en etiquetas
df = d f [índice] # seleccionar cols con un
Establecer una celda por etiquetas de índice df = df[s] #
Nota: scalar devuelve Series;seleccionar con un
list &c devuelve
fila y columna 'columna'] = etiqueta
DataFrame. col Serie
df.at['fila',
valor
df.loc['fila', 'col'] = valor # tricky Utilización del índice DataFrame para seleccionar filas
df['col'].at['row'] = valor df = d f ['de':'inc_a'] # label s l i c e
df = df[3:7] # segmento
Seleccionar y cortar en etiquetas de enteros
df = df.loc['fila1':'fila3', 'col1':'col3'] df = df[df['col'] > 0.5] # Serie booleana
Nota: el "a" de este trozo es inclusivo. df = d f .loc['label'] # etiqueta
única
Establecer una sección transversal por etiquetas df = df.loc[container] # lista/Serie de
df.loc['A':'C', 'col1':'col3'] = np.nan laboratorio df = df.loc['from':'to'] #
df.loc[1:2,'col1':'col2']=np.ceros((2,2)) rebanada inclusiva df = df.loc[bs] #
df.loc[1:2,'A':'C']=othr.loc[1:2,'A':'C'] Serie booleana
Recuerde: "a" inclusivo en el corte df = d f . iloc[0] # entero
Trap: Boolean
simple df = Series
d f . i lgets
o c rows, label Series gets
[ contenedor] # cols.
Seleccionar una celda por posición lista/serie de int df = df.iloc[0:5] #
Utilización
slice del índice DataFrame para seleccionar una
exclusivo
entera
valor = df.iat[9, 3] # [row, col]
sección transversal
df = df.ix[x] # loc then iloc
valor = df.iloc[0, 0] # [row, col]
valor = df.iloc[len(df)-1, len(df.columnas)-1] # r y c pueden ser escalares, listas,
slice df.loc[r, c] # acceso a etiquetas
(fila, columna) df.iloc[r, c] # acceso
entero d f .ix[r, c] # acceso a etiqueta int
Seleccionar un rango de celdas por posición int
fallback df[c].iloc[r] # encadenado -
df = df.iloc[2:4, 2:4] # subconjunto de también para .loc
df df = df.iloc[:5, :5] # esquina
Utilizar el índice del DataFrame para seleccionar una
superior izquierda
s = df.iloc[5, :] # devuelve fila como celda
Serie df exclusivo
= df.iloc[5:6, # r y c deben ser etiquetas o enteros
Nota: "a" - igual :]
que# el
devuelve
troceado fila
de como
Serie d f . a t [r, c] # rápido escalar label
listas en python.
accessor df.iat[r, c] # fast scalar int
accessor df[c].iat[r] # encadenado -
Ajuste de celda por posición entera
también para .at
df.iloc[0, 0] = valor # [row, col]
df.iat[7, 8] = valor Métodos de indexación de DataFrame
v = d f .get_value(r, c ) # obtener por
Establecer el rango de celdas por posición f i l a , c o l df = df.set_value(r,c,v) # set
entera
df.iloc[0:3, 0:5] = valor df.iloc[1:3, by row, c o l df = d f .xs(key, axis) #
1:4] = np.ones((2, 3)) obtener sección transversal df =
df.iloc[1:3, 1:4] = np.zeros((2, 3)) d f .filter(items, like, regex, a x i s )
df.iloc[1:3, 1:4] = np.array([[1, 1, 1], df = df.select(crit, eje) (.loc, .iloc, .ix, .at
Nota: los atributos de indexación
[2, 2, 2]])
.iat) pueden utilizarse para obtener y establecer
valores en el DataFrame.
Recuerde: exclusivo en el corte Nota: los atributos de indexación .loc, iloc y .ix pueden
aceptar objetos python slice. Pero .at y .iat no.
.ix para la indexación mixta de etiquetas y
Nota: .loc también puede aceptar argumentos de serie
posiciones
valor enteras'col1']
= df.ix[5, booleanos Evitar: encadenamiento en la forma
df = df.ix[1:5, 'col1':'col3'] df[col_indexer][row_indexer] Trampa: los trozos de
etiquetas son inclusivos, los trozos de enteros son
exclusivos.
Versión 30 de abril de 2017 - [Borrador - Mark Graph - mark dot the dot graph at gmail dot com - @Mark_Graph
on twitter]. 9
Trampa: Los valores NaN en la clave de grupo se
Unir/Combinar DataFrames descartan automáticamente - nunca habrá un grupo NA.
Tres formas de unir dos DataFrames: El mecanismo "groupby" de pandas nos permite dividir
• fusión (una operación de unión similar a la de una los datos en grupos, aplicar una función a cada grupo de
base de datos/SQL) forma independiente y luego combinar los resultados.
• concat (apilar uno al lado del otro o uno encima del
otro) Iteración de grupos: normalmente no es necesaria
• combine_first (junta los dos, eligiendo los para nombre, grupo en gb:
valores de uno sobre los del otro) print (nombre, grupo)
Fusión de índices Seleccionar un grupo
df_new = pd.merge(left=df1, right=df2, dfa = df.groupby('cat').get_group('a') dfb
how='outer', left_index=True, = df.groupby('cat').get_group('b')
Cómo: 'izquierda', 'derecha', 'exterior',
right_index=True)
'interior'
Cómo: exterior=unión/todos; Aplicar una función de agregación
interior=intersección # aplicar a una columna ...
s = df.groupby('cat')['col1'].sum()
Fusión de columnas s=
df_new = pd.merge(left=df1, right=df2, d f . g r o u p b y ('cat')['col1'].agg(np.sum) #
how='left', left_on='col1', aplicar a cada columna del DataFrame s =
right_on='col2') d f .groupby('cat').agg(np.sum)
Trampa: Al unir columnas, los índices de la columna df_summary = df.groupby('cat').describe()
Los DataFrames pasados se ignoran. df_row_1s = df.groupby('cat').head(1)
Trampa: las fusiones de muchos a muchos en una
columna pueden provocar una explosión de los datos Nota: las funciones de agregación reducen la
asociados. dimensión en uno - incluyen: media, suma, tamaño,
recuento, std, var, sem, describir, primero, último, min,
Unir en índices (otra forma de fusionar) max
df_new = df1.join(other=df2, on='col1',
how='exterior') Aplicación de múltiples funciones de agregación
df_new = df1.join(other=df2,on=['a','b'], gb = df.groupby('cat')
how='exterior') # aplicar múltiples funciones a una
Nota: DataFrame.join() une índices por defecto. columna dfx = gb['col2'].agg([np.sum,
DataFrame.merge() une columnas comunes por np.mean]) # aplicar múltiples fns a
defecto. múltiples cols dfy = gb.agg({
'cat': np.count_nonzero,
La concatenación simple suele ser la mejor 'col1': [np.sum, np.mean, np.std],
'col2': [np.min, np.max]
df=pd.concat([df1,df2],axis=0)#arriba/aba
jo df = df1.append([df2, df3]) })
#arriba/abajo Nota: gb['col2'] es la abreviatura de df.groupby('cat')['col2'],
df=pd.concat([df1,df2],axis=1)#izquierda/
Trampa: puede acabar con filas o columnas sin necesidad de reagrupación.
derecha
duplicadas
Nota: concat tiene un parámetro Funciones de transformación
ignore_index # transformar a puntuaciones z de grupo,
que tienen # una media de grupo de 0, y
Combinar_primero una desviación estándar de 1. zscore =
df = df1.combinar_primero(otro=df2) lambda x: (x-x.mean())/x.std() dfz =
df.groupby('cat').transform(zscore) #
# multicombinar con python reduce() df reemplazar los datos perdidos con la
= reduce(lambda x, y: media de grupo mean_r = lambda x:
x.combinar_primero(y), x.fillna(x.mean())
[df1, df2, df3, df4, df5]) dfm = df.groupby('cat').transform(media_r)
Utiliza los valores no nulos de df1. El índice del Nota: puede aplicar múltiples funciones de
DataFrame combinado será la unión de los índices transformación de forma similar a las funciones de
de df1 y df2. agregación múltiple anteriores,
Versión 30 de abril de 2017 - [Borrador - Mark Graph - mark dot the dot graph at gmail dot com - @Mark_Graph
on twitter]. 11
Tablas dinámicas: trabajar con datos largos y
anchos Trabajar con fechas, horas y sus índices
var_name='Partido', id_vars=['Fecha',
Estas funciones funcionan con índices jerárquicos o
'Encuestador', 'Estado'])
multinivel y, a menudo, los crean;
(el MultiIndex de pandas es potente y complejo). Nota: Consulte la documentación, hay muchos
argumentos para estos métodos.
Pivotar, desapilar, apilar y fundir
Las tablas dinámicas pasan de datos de formato largo a
formato ancho
# Empecemos con datos en formato
largo from StringIO import StringIO #
python2.7 #from io import StringIO #
python 3 data =
"""Fecha,Encuestador,Estado,Partido,E
st 13/03/2014, Newspoll, NSW, red,
25 13/03/2014,
Newspoll, N S W , azul, 28
13/03/2014, Newspoll, Vic, rojo, 24
13/03/2014, Newspoll, Vic, azul, 23
13/03/2014, Galaxy, NSW, rojo, 23
13/03/2014, G a l a x y , NSW, azul,
24 13/03/2014,
Galaxy, Vic, rojo, 26
13/03/2014, G a l a x y , Vic, azul,
25 13/03/2014,
Galaxy, Qld, rojo, 21
13/03/2014, G a l a x y , Qld, azul,
27""" df =
pd.read_csv(StringIO(data),
header=0, skipinitialspace=True)
# O fundir() de vuelta al
formato largo # 1º: aplanar el
índice de la columna
wide1.columns = ['_'.join(col).strip()
for col in wide1.columns.values]
# 2º: eliminar el MultiIndex wdf =
wide1.reset_index()
# 3rd: melt away
long3 = pd.melt(wdf, value_vars=
['Est_azul', 'Est_rojo'],
Versión 30 de abril de 2017 - [Borrador - Mark Graph - mark dot the dot graph at gmail dot com - @Mark_Graph
on twitter]. 12
Fechas y tiempo - puntos y lapsos Nota: Aunque los periodos constituyen un índice muy útil,
Con su enfoque en datos de series temporales, pueden ser menos útiles en una serie.
pandas tiene un conjunto de herramientas para la
gestión de fechas y tiempo: ya sea como un punto en De cadenas no estándar a marcas de tiempo
el tiempo (un Timestamp) o como un lapso de tiempo t = ['09:08:55.7654-ENE092002',
(un Período). '15:42:02.6589-FEB082016']
s = pd.Series(pd.to_datetime(t,
t = pd.Timestamp('2013-01-01')
format="%H:%M:%S.%f-%b%d%Y"))
t = pd.Timestamp('2013-01-01 21:15:06')
t = pd.Timestamp('2013-01-01 21:15:06.7') También: %B = nombre completo del mes; %m = mes
p = pd.Period('2013-01-01', freq='M') numérico;
Nota: Las marcas de tiempo deben estar entre %y = año sin siglo; y más ...
1678 y 2261 años. (Compruebe Timestamp.max y
Fechas y hora - sellos y espacios como índices
Timestamp.min). Un índice de Timestamps es un
Una serie de marcas de tiempo o periodos DatetimeIndex. Un índice de Periodos es un
ts = ['2015-04-01', '2014-04-02'] date_strs = ['2014-01-01', '2014-04-01',
PeriodIndex.
'2014-07-01', '2014-10-01']
# Serie de marcas de tiempo (bueno)
s = pd.to_datetime(pd.Series(ts)) dti = pd.DatetimeIndex(date_strs)
df.index = pd.period_range('2015-01',
periods=len(df), freq='M')
dti = pd.to_datetime(['04-01-2012'],
dayfirst=True) # Formato de fecha
australiano
pi = pd.period_range('1960-01-01',
'2015-12-31', freq='M')
Versión 30 de abril de 2017 - [Borrador - Mark Graph - mark dot the dot graph at gmail dot com - @Mark_Graph
on twitter]. 13
Constantes de frecuencia del periodo (no es una lista Muestreo ascendente y descendente
completa) # upsample from quarterly to monthly
Nombre Descripción pi = pd.period_range('1960Q1',
U Microsegundo periods=220, freq='Q')
L Milisegundo df = DataFrame(np.random.rand(len(pi),5),
S Segundo index=pi)
T Minuto dfm = df.resample('M', convention='end')
H Hora # use ffill o bfill para rellenar con
D Día natural valores
B Día laborable
W-{MON, TUE, ...} Semana que termina el ... # Muestreo descendente de mensual a
trimestral dfq = dfm.resample('Q',
MS Calendario de inicio de mes
how='sum')
M Calendario fin de mes
QS-{JAN, FEB, ...} Inicio de trimestre con inicio de Husos horarios
año (QS - diciembre) t = ['2015-06-30 00:00:00',
Q-{JAN, FEB, ...} Final de trimestre con final de '2015-12-31 00:00:00']
año (Q - diciembre) dti = pd.to_datetime(t
AS-{JAN, FEB, ...} Comienzo del año (AS - ).tz_localize('Australia/Canberra')
diciembre) dti = dti.tz_convert('UTC')
A-{JAN, FEB, ...} Fin de año (A - diciembre) ts = pd.Timestamp('now',
tz='Europa/Londres')
De DatetimeIndex a objetos datetime de Python
dti = pd.DatetimeIndex(pd.date_range( # obtener una lista de todas
start='1/1/2011', periods=4, freq='M')) las zonas horarias import pyzt
s = Serie([1,2,3,4], index=dti) for tz in pytz.all_timezones:
na = dti.to_pydatetime() # numpy array print tz
na = s.index.to_pydatetime() # matriz numpy Nota: por defecto, las marcas de tiempo se crean sin
información de zona horaria.
Fechas y horas de Frome a Python
df['fecha'] = [x.fecha() for x in df['TS']] Selección de filas con un índice de series temporales
df['tiempo'] = [x.tiempo() for x in df['TS']] # empezar con los datos de
Nota: convierte a datatime.date o datetime.time. Pero no reproducción anteriores idx =
convierte a datetime.datetime. pd.period_range('2015-01',
periods=len(df), freq='M')
De DatetimeIndex a PeriodIndex y viceversa df.index = idx
df = DataFrame(np.random.randn(20,3))
df.index = pd.date_range('2015-01-01', february_selector = (df.index.month == 2)
periods=len(df), freq='M') february_data = df[february_selector]
dfp = df.to_period(freq='M')
dft = dfp.to_timestamp() q1_data = df[(df.index.mes >= 1) & (df.index.mes
Nota: de periodo a marca de tiempo por defecto es el <= 3)]
punto en el tiempo al inicio del periodo.
mayornov_data = df[(df.index.month == 5) |
Trabajar con un (df.index.month == 11)]
PeriodIndex
pi = pd.period_range('1960-01','2015-12',
freq='M') También:=año,
totales mes, día [del mes], hora, minuto, segundo,
df.groupby(df.index.year).sum()
na = p i . valores # numpy array de enteros día de la semana [Lun=0 .. Dom=6], semana del mes,
lp = pi.tolist() # python lista de Periodos semana del año [numerados a partir de 1], la semana
sp = Series(pi) # pandas Series de empieza el lunes], día del año [a partir de 1], ...
Periodos ss = Series(pi).astype(str) # S de
strs Atributo Series.dt
ls = Series(pi).astype(str).tolist() Las columnas de DataFrame que contienen objetos de
tipo datetime pueden manipularse con el atributo de
Obtener un intervalo de acceso .dt
marcas de tiempo
t = ['2012-04-14 04:06:56.307000',
dr = pd.date_range('2013-01-01',
'2011-05-14 06:14:24.457000',
'2013-12-31', freq='D')
'2010-06-14 08:23:07.520000']
Tratamiento de errores con fechas
# una serie de marcas de tiempo
s = pd.Series(pd.to_datetime(t))
print(s.dtype) # datetime64[ns]
print(s.dt.second) # 56, 24, 7
print(s.dt.mes) # 4, 5, 6
# a Serie de periodos de tiempo
s = pd.Series(pd.PeriodIndex(t,freq='Q'))
print(s.dtype)
Versión 30 de abril de 2017 - [Borrador - Mark Graph - mark dot the dot graph at gmail dot com - @Mark_Graph # datetime64[ns]
on twitter]. print(s.dt.quarter) 2, 2, 2 14
# 1er ejemplo devuelve cadena no
Timestamp t = pd.to_datetime('2014-02-
30')
# 2º ejemplo devuelve NaT (no un tiempo)
t = pd.to_datetime('2014-02-30', coerce=True)
# NaT like NaN tests True for isnull()
b = pd.isnull(t) # --> True
Versión 30 de abril de 2017 - [Borrador - Mark Graph - mark dot the dot graph at gmail dot com - @Mark_Graph
on twitter]. 15
Múltiples histogramas (superpuestos o apilados)
ax = df.plot.hist(bins=25, alpha=0.5) # o...
Trazado a partir del DataFrame ax = df.plot.hist(bins=25, stacked=True)
# seguido del código de trazado estándar
Importar matplotlib, elegir un estilo matplotlib anterior
import matplotlib.pyplot as plt
print(plt.style.available)
plt.style.use('ggplot')
Gráfico lineal
df1 = df.cumsum()
ax = df1.plot()
Diagrama de cajas
ax = df.plot.box(vert=False)
# seguido del código de trazado estándar Barras horizontales
anterior ax = binned['A'][(binned.index >= -4) &
(binned.index <= 4)].plot.barh()
# seguido del código de trazado estándar
anterior
ax = df.plot.box(column='c1', by='c2')
Histograma
Diagrama de densidad
ax = df['A'].plot.hist(bins=20) ax = df.plot.kde()
# seguido del código de trazado estándar # seguido del código de trazado estándar
anterior anterior
Versión 30 de abril de 2017 - [Borrador - Mark Graph - mark dot the dot graph at gmail dot com - @Mark_Graph
on twitter]. 16
Diagrama de dispersión Una línea y una barra en el mismo gráfico
ax = df.plot.scatter(x='A', y='C') En matplotlib, los gráficos de barras visualizan datos
# seguido del código de trazado estándar categóricos o discretos. Los gráficos de líneas
anterior visualizan datos continuos. Esto hace que sea difícil
obtener barras y líneas en el mismo gráfico.
Normalmente, los gráficos combinados tienen
demasiadas etiquetas, y/o las líneas y barras están
desalineadas o faltan. Es necesario engañar a
matplotlib un poco ... pandas hace este truco más fácil
# empezar con datos falsos de
crecimiento porcentual s =
pd.Series(np.random.normal(
1.02, 0.015, 40))
Gráfico circular s = s.cumprod()
dfg = (pd.concat([s / s.shift(1),
s = pd.Series(datos=[10, 20, 30],
s / s.shift(4)], axis=1) * 100) - 100
index = ['perros', 'gatos',
dfg.columns = ['Trimestral', 'Anual']
'pájaros']) ax =
dfg.index = pd.period_range('2010-Q1',
s.plot.pie(autopct='%.1f')
periods=len(dfg), freq='Q')
# seguido de la salida estándar del
# reindexar con enteros desde 0;
gráfico ... ax.set_title('Gráfico circular')
mantener viejo viejo = dfg.index
ax.set_aspect(1) # hacerlo redondo
dfg.index = range(len(dfg))
ax.set_ylabel('') # eliminar por defecto
# traza la línea desde pandas
fig = ax.figure
ax = dfg['Anual'].plot(color='azul',
fig.set_size_inches(8, 3)
label='Crecimiento anual')
fig.savefig('filename.png', dpi=125)
# traza las barras de pandas
plt.close(fig)
dfg['Quarter'].plot.bar(ax=ax,
label='Crecimiento Q/Q', width=0.8)
Versión 30 de abril de 2017 - [Borrador - Mark Graph - mark dot the dot graph at gmail dot com - @Mark_Graph
on twitter]. 17
Trabajar con datos omitidos y no finitos Trabajar con datos categóricos
Versión 30 de abril de 2017 - [Borrador - Mark Graph - mark dot the dot graph at gmail dot com - @Mark_Graph
on twitter]. 18
Regresión
Trabajar con cuerdas
import statsmodels.formula.api as sm
resultado = sm.ols(formula="col1 ~ col2
Trabajar con cuerdas +
# supongamos que df['col'] es una serie col3", data=df).fit()
de cadenas s = df['col'].str.lower() print (result.params)
s = df['col'].str.upper() print (resultado.resumen())
s = df['col'].str.len() Ejemplo sencillo de alisado mediante una aplicación
rodante
# el siguiente conjunto funciona como k3x5 = np.array([1,2,3,3,3,2,1]) / 15.0
Python df['col'] += 'suffix' # añadir s = df['A'].rolling(window=len(k3x5),
df['col'] *= 2 # duplicar min_periods=len(k3x5),
s = df['col1'] + df['col2'] # concatenar center=True).apply(
func=lambda x: (x * k3x5).sum())
La mayoría de las funciones de cadena de Python se replican en# corrige los datos finales que faltan ...
los objetos DataFrame y Series de pandas. unsmoothed s =
df['A'].where(s.isnull(), other=s)
Expresiones regulares
s=
Nota de precaución
d f [ ' c o l ' ] . s t r .contains('regex') s
= df['col'].str.startswith('regex') s Esta hoja de trucos ha sido confeccionada por
= df['col'].str.endswith('regex') incansables robots que recorren los oscuros recovecos
s = df['col'].str.replace('antiguo',
Nota: pandas tiene muchos más métodos 'nuevo') de Internet en busca de mitos ursinos y anginos de una
df['b']
regex. = df.a.str.extract('(patrón)') legendaria tierra de leche y miel donde se rumorea que
los pandas y las pitones retozan juntos. No se garantiza
que las narraciones hayan sido captadas y transcritas
Estadísticas básicas con exactitud. Utilice estas notas bajo su propia
responsabilidad. Queda advertido. No seré responsable
de lo que le ocurra a usted y a sus seres queridos
Resumen estadístico cuando sus ojos empiecen a ver lo que aquí está
escrito.
s = d f ['col1'].describe()
df1 = df.describe()
Versión: Esta hoja de trucos se actualizó por última
vez teniendo en cuenta Python 3.6 y pandas 0.19.2.
DataFrame - métodos estadísticos clave
df.corr() # correlación por pares Errores: Si encuentra algún error, envíeme un correo
df.cov() cols electrónico a [email protected]; (pero, por
df.kurt() # covarianza por pares cols
favor, no corrija mi uso de las convenciones
df.mad() # curtosis sobre cols (def)
ortográficas del inglés australiano).
df.sem() # desviación media absoluta
df.var() # error estándar de la
media
# varianza sobre cols (def)
Recuento de valores
s = df['col1'].value_counts()
Cuantiles y clasificación
cuantos = [0,05, 0,25, 0,5, 0,75, 0,95]
q = df.cuantil(cuantos)
r = df.rank()
Histograma
count, bins = np.histogram(df['col1'])
count, bins = np.histogram(df['col'],
bins=5)
count, bins = np.histogram(df['col1'],
bins=[-3,-2,-1,0,1,2,3,4])
Versión 30 de abril de 2017 - [Borrador - Mark Graph - mark dot the dot graph at gmail dot com - @Mark_Graph
on twitter]. 19