Está en la página 1de 6

Machine Translated by Google

56 PROC. DEL IX CONF. PITÓN EN CIENCIA. (SCIPY 2010)

Estructuras de datos para computación estadística en Python


Wes McKinney‡ÿ

Resumen—En este documento nos ocupamos de los problemas prácticos de trabajar con conjuntos de en modelos financieros. El nombre del paquete deriva de datos de panel, que es
datos comunes a las finanzas, las estadísticas y otros campos relacionados. pandas es una nueva un término para conjuntos de datos tridimensionales que se encuentran en
biblioteca que tiene como objetivo facilitar el trabajo con estos conjuntos de datos y proporcionar un estadísticas y econometría. Esperamos que los pandas ayuden a hacer de Python
conjunto de bloques de construcción fundamentales para implementar modelos estadísticos.
científico un entorno informático estadístico más atractivo y práctico para los
Discutiremos los problemas de diseño específicos encontrados en el curso del desarrollo de pandas con
profesionales académicos y de la industria por igual.
ejemplos relevantes y algunas comparaciones con el lenguaje R.
Concluimos discutiendo posibles direcciones futuras para la computación estadística y el análisis de datos
usando Python.
Conjuntos de datos estadísticos
Términos de índice : estructura de datos, estadísticas, R
Los conjuntos de datos estadísticos suelen llegar en formato tabular, es decir,
como una lista bidimensional de observaciones y nombres para los campos de
Introducción cada observación. Por lo general, una observación se puede identificar de forma
única mediante uno o más valores o etiquetas. Mostramos un conjunto de datos
Python se usa cada vez más en aplicaciones científicas tradicionalmente
de ejemplo para un par de acciones en el transcurso de varios días. El NumPy
dominadas por [R], [MATLAB], [Stata], [SAS] y otros entornos de investigación
ndarray con dtype estructurado se puede usar para almacenar estos datos:
comerciales o de código abierto. La madurez y la estabilidad de las bibliotecas
numéricas fundamentales ([NumPy], [SciPy] y otras), la calidad de la documentación
y la disponibilidad de distribuciones de "fregadero de cocina" ([EPD], [Pythonxy]) >>> matriz

han recorrido un largo camino hacia haciendo que Python sea accesible y de datos ([('GOOG', '2009-12-28', 622.87, 1697900.0), ('GOOG', '2009-12-29',
619.40, 1424800.0), ('GOOG', '2009 -12-30', 622.73, 1465600.0),
conveniente para una amplia audiencia. Además, [matplotlib] integrado con
('GOOG', '2009-12-31', 619.98, 1219800.0), ('AAPL', '2009-12-28',
[IPython] proporciona un entorno interactivo de investigación y desarrollo con 211.61, 23003100.0), ('AAPL ', '2009-12-29', 209.10, 15868400.0),
visualización de datos adecuado para la mayoría de los usuarios. Sin embargo, la ('AAPL', '2009-12-30', 211.64, 14696800.0), ('AAPL', '2009-12-31',
210.73, 12571000.0) ],
adopción de Python para el modelado estadístico aplicado ha sido relativamente
lenta en comparación con otras áreas de la ciencia computacional.
dtype=[('elemento', '|S4'), ('fecha', '|S10'),
Un problema importante para los aspirantes a programadores estadísticos de ('precio', '<f8'), ('volumen', '<f8')])

Python en el pasado ha sido la falta de bibliotecas que implementen modelos


>>> matriz de datos['precio']
estándar y un marco cohesivo para especificar modelos. Sin embargo, en los ([622.87, 619.4, 622.73, 619.98, 211.61, 209.1,
últimos años ha habido nuevos desarrollos significativos en econometría ([StaM]), 211.64, 210.73])
estadística bayesiana ([PyMC]) y aprendizaje automático ([SciL]), entre otros
Los arreglos estructurados (o de registros) como este pueden ser efectivos en
campos. Sin embargo, todavía es difícil para muchos estadísticos elegir Python
muchas aplicaciones, pero según nuestra experiencia, no brindan el mismo nivel
en lugar de R dada la naturaleza específica del dominio del lenguaje R y la
de flexibilidad y facilidad de uso que otros entornos estadísticos.
amplitud de bibliotecas de código abierto bien examinadas disponibles para los
Un problema importante es que no se integran bien con el resto de NumPy, que
usuarios de R ([CRAN]). A pesar de este obstáculo, creemos que el lenguaje
está diseñado principalmente para trabajar con arreglos de tipos homogéneos.
Python y las bibliotecas y herramientas actualmente disponibles pueden
aprovecharse para hacer de Python un entorno superior para el análisis de datos
R proporciona la clase data.frame que puede almacenar datos de tipo mixto
y la computación estadística.
de manera similar. El lenguaje R central y sus bibliotecas de terceros se crearon
En este artículo nos ocupamos de las estructuras de datos y las herramientas
teniendo en cuenta el objeto data.frame, por lo que la mayoría de las operaciones
para trabajar con conjuntos de datos en memoria, ya que estos son bloques de
en dicho conjunto de datos son muy naturales. Un marco de datos también es
construcción fundamentales para construir modelos estadísticos. pandas es una
flexible en tamaño, una característica importante al ensamblar una colección de
nueva biblioteca Python de estructuras de datos y herramientas estadísticas
datos. El siguiente fragmento de código carga los datos almacenados en los datos
desarrollada inicialmente para aplicaciones de finanzas cuantitativas. La mayoría del archivo CSV en la variable df y agrega una nueva columna de
de nuestros ejemplos aquí provienen de series de tiempo y datos transversales que surgen
valores booleanos:

* Autor para correspondencia: wesmckinn@gmail.com > df <- read.csv('data') artículo fecha


‡ AQR Capital Management, LLC precio volumen 1 GOOG
622.87 2009-12-28
1697900 2 GOOG
2009-12-29 619.40 1424800 3 GOOG 2009-12-30
Derechos de autor © 2010 Wes McKinney. Este es un artículo de acceso abierto 622.73 1465600 4 GOOG 2009-12-31 619.98 1219800
distribuido bajo los términos de la licencia de atribución Creative Commons, que 5 AAPL 2009-12-28 211.61 23003100
permite el uso, la distribución y la reproducción sin restricciones en cualquier medio,
siempre que se acredite al autor original y la fuente.
Machine Translated by Google
ESTRUCTURAS DE DATOS PARA COMPUTACIÓN ESTADÍSTICA EN PYTHON 57

6 AAPL 2009-12-29 209.10 15868400 un conjunto ordenado. En los datos de existencias anteriores, las etiquetas de las filas son simplemente
7 AAPL 2009-12-30 211.64 14696800 números de observación secuenciales, mientras que las columnas son el campo
8 AAPL 2009-12-31 210.73 12571000
nombres

> df$ind <- df$elemento == "GOOG" Un índice almacena las etiquetas de dos maneras: como un ndarray y
> d.f. como un dict mapeando los valores (que por lo tanto deben ser únicos
artículo fecha valor volumen ind
y hashable) a los índices enteros:
1 GOOG 2009-12-28 622.87 1697900 VERDADERO
2 GOOG 2009-12-29 619.40 1424800 VERDADERO >>> índice = Índice(['a', 'b', 'c', 'd', 'e'])
3 GOOG 2009-12-30 622.73 1465600 VERDADERO >>> índice
4 GOOG 2009-12-31 619.98 1219800 VERDADERO Índice ([a, b, c, d, e], dtype=objeto)
5 AAPL 2009-12-28 211.61 23003100 FALSO >>> índice.índiceMapa
6 AAPL 2009-12-29 209.10 15868400 FALSO {'a': 0, 'b': 1, 'c': 2, 'd': 3, 'e': 4}
7 AAPL 2009-12-30 211.64 14696800 FALSO
8 AAPL 2009-12-31 210.73 12571000 FALSO La creación de este dict permite que los objetos realicen búsquedas y
determinar la pertenencia en tiempo constante.
pandas proporciona una clase DataFrame con un nombre similar que
implementa gran parte de la funcionalidad de su contraparte R, aunque >>> 'a' en índice
Verdadero
con algunas mejoras importantes (a saber, alineación de datos incorporada) que
discutiremos. Aquí cargamos el mismo archivo CSV Estas etiquetas se utilizan para proporcionar alineación al realizar
como arriba en un objeto DataFrame usando la función fromcsv manipulaciones de datos utilizando objetos con etiquetas diferentes. Existen
y de manera similar agregue la columna anterior: estructuras de datos especializadas, que representan 1, 2 y 3 dimensiones
datos, que incorporan una semántica de manejo de datos útil para facilitar tanto la
>>> datos = DataFrame.fromcsv('datos', index_col=Ninguno)
fecha 0 artículo valor volumen investigación interactiva como la creación de sistemas. Una estructura general de datos
2009-12-28
2009-12-29
1 2 GOOG 622,9 1.698e+06 n dimensional sería útil en algunos casos, pero
2009-12-30 3 2009-12-31
2009-12-28 5 4 GOOG 619,4 1.425e+06
conjuntos de datos de dimensión superior a 3 son muy poco comunes en la mayoría
2009-12-29 6 2009-12-30
2009-12-31 > >>7 GOOG 622,7 620 1.466e+06
datos['ind']==
= datos['elemento']
'GOOG' GOOG 1.22e+06 aplicaciones estadísticas y econométricas, con ser bidimensional
AAPL 211,6 2.3e+07 el más prevalente. Adoptamos un enfoque pragmático, impulsado por
AAPL 209,1 1.587e+07
necesidades de la aplicación, hasta el diseño de las estructuras de datos para
AAPL 211,6 1.47e+07
AAPL 210,7 1.257e+07 que sean tan fáciles de usar como sea posible. Además, queríamos los objetos
ser idiomáticamente similares a los presentes en otras estadísticas
entornos, como R.
Estos datos se pueden remodelar en una forma diferente para ejemplos futuros
mediante el pivote del método DataFrame:
Alineación de datos
>>> df = data.pivot('fecha', 'elemento', 'valor')
>>> df Las operaciones entre conjuntos de datos relacionados, pero de diferente tamaño, pueden
AAAL GOOG
plantear un problema ya que el usuario primero debe asegurarse de que los puntos de datos
2009-12-28 211,6 622.9
2009-12-29 209,1 619.4 están correctamente alineados. Como ejemplo, considere una serie de tiempo sobre
2009-12-30 211,6 622.7 diferentes rangos de fechas o series de datos económicos en diferentes conjuntos de
2009-12-31 210,7 620 entidades:

Más allá de los datos de observación, uno también encontrará con frecuencia >>> s1 >>> s2

datos categóricos, que se pueden utilizar para dividir los identificadores en AAPL 0,044 IBM 0,050 AAAL 0,025
SAP 0,101 GOOG 0,113
C 0,138 BARRA 0.158
agrupaciones más amplias. Por ejemplo, los tableros de cotizaciones pueden categorizarse
SCGLY 0,037 BAR
0,200 DB C 0.028
por su industria o país de constitución. Aquí tenemos 0,281 DB 0,087
creó un objeto DataFrame que almacena el país y la industria F 0,004
GOOG 0.154
clasificaciones para un grupo de acciones:
IBM 0.034
>>> gatos
industria del país VW 0.040
AAPL EE. UU. TECNOLOGÍA

IBM A NOSOTROS TECNOLOGÍA Se podría optar por alinear (o reindexar) explícitamente uno de estos
SAVIA Delaware TECNOLOGÍA
Objetos de la serie 1D con el otro antes de agregarlos, usando el
GOOG EE. UU. TECNOLOGÍA
método de reindexación:
C A NOSOTROS ALETA

SCGLY FR ALETA
>>> s1.reindex(s2.index)
BAR Reino Unido ALETA AAPL 0.0440877763224
base de datos Delaware ALETA BARRA 0.199741007422
vw Delaware AUTO C 0.137747485628
RNO FR AUTO DB 0.281070058049
F A NOSOTROS AUTO F Yaya
TM JP AUTO GOOG 0.112861123629
IBM 0.0496445829129
Usaremos estos objetos arriba para ilustrar características de interés.
Sin embargo, a menudo nos parece preferible simplemente ignorar el estado de
alineación de datos:
modelo de datos de pandas
>>> s1 + s2
Las estructuras de datos de pandas vinculan internamente los ejes de un ndarray
AAPL 0.0686791008184
con matrices de etiquetas únicas. Estas etiquetas se almacenan en instancias de BAR 0.358165479807
la clase Index, que es una subclase ndarray 1D que implementa C 0.16586702944
Machine Translated by Google
58 PROC. DEL IX CONF. PITÓN EN CIENCIA. (SCIPY 2010)

base de datos 0.367679872693 Similar a la función is.na de R, que detecta NA (No disponible)
F Yaya valores, pandas tiene funciones API especiales isnull y notnull
GOOG 0.26666583847
para determinar la validez de un punto de datos. Estos contrastan con
IBM 0.0833057542385
SAVIA Yaya numpy.isnan en el sentido de que se pueden usar con dtypes otros
SCGLY Yaya que flotar y también detectar algunos otros marcadores de "falta"
vw Yaya
que ocurren en la naturaleza, como el valor de Python Ninguno.

Aquí, los datos se han alineado automáticamente en función de su >>> es nulo(s1 + s2)
etiquetas y se suman. El objeto de resultado contiene la unión. AAPL Falso
BAR Falso
de las etiquetas entre los dos objetos para que no haya información
C Falso
perdió. Discutiremos el uso de NaN (No es un número) para representar base de datos Falso
datos faltantes en la siguiente sección. F Verdadero

Claramente, el usuario paga gastos generales lineales siempre que los datos automáticos GOOG Falso
IBM Falso
se produce la alineación y buscamos minimizar esa sobrecarga para el
SAVIA Verdadero
medida posible. La reindexación se puede evitar cuando los objetos Index SCGLY Verdadero

se comparten, lo que puede ser una estrategia eficaz en aplicaciones sensibles al vw Verdadero

rendimiento. [Cython], una herramienta ampliamente utilizada para Tenga en cuenta que el valor NA de R es distinto de NaN. Mientras que la adición
la creación de extensiones de Python C, se ha utilizado para acelerar estos
de un valor NA especial para NumPy sería útil, lo más probable es
algoritmos centrales.
demasiado específico del dominio para merecer su inclusión.

Manejo de datos faltantes


Combinar o unir conjuntos de datos
Es común que a un conjunto de datos le falten observaciones. Para
Combinar, unir o fusionar conjuntos de datos relacionados es un proceso bastante
ejemplo, un grupo de series de tiempo económicas relacionadas almacenadas en un
operación común. Al hacerlo, estamos interesados en asociar
DataFrame puede comenzar en diferentes fechas. Llevar a cabo cálculos en presencia
observaciones de un conjunto de datos con otro a través de una clave de combinación de
de datos faltantes puede conducir a problemas complicados.
algún tipo. Para datos 2D indexados de manera similar, las etiquetas de fila sirven como
código y una considerable pérdida de rendimiento. Elegimos usar NaN como
una clave natural para la función de unión:
se opuso a usar NumPy MaskedArrays por razones de rendimiento
>>> df1 >>> df2
(que están más allá del alcance de este documento), ya que NaN se propaga
AAPL GOOG MSFT YHOO
en operaciones de punto flotante de forma natural y puede ser fácilmente 2009-12-24 209 2009-12-28 211.6 618.5 2009-12-24 31 16.72
detectado en algoritmos. Si bien esto conduce a un buen rendimiento, 622.9 2009-12-29 209.1 619.4 2009-12-30 211.6 2009-12-28 31.17 16.88

viene con inconvenientes: a saber, que NaN no se puede usar en matrices de tipo 622.7 2009-12-31 210.7 620 2009-12-29 31.39 16.92
2009-12-30 30.96 16.98
entero, y no es un valor "nulo" intuitivo en objeto o cadena
arreglos
Consideramos el uso de NaN como un detalle de implementación y >>> df1.join(df2)
GOOG
AAPL MSFT YHOO
intentar proporcionar al usuario las funciones API adecuadas para
2009-12-24 209 618.5 31 16.72
realizar operaciones comunes en puntos de datos faltantes. Desde el 2009-12-28 211.6 622.9 31.17 16.88
ejemplo anterior, podemos usar el método válido para descartar 2009-12-29 209,1 619,4 31,39 16,92

datos, o podríamos usar fillna para reemplazar los datos que faltan con un 2009-12-30 211.6 622.7 30.96 16.98
2009-12-31 210.7 620 Yaya Yaya
valor específico:
Uno podría estar interesado en unirse a algo que no sea el
>>> (s1 + s2).válido()
AAPL 0.0686791008184 índice también, como los datos categóricos que presentamos en un
BARRA 0.358165479807 sección anterior:
C 0.16586702944
BD 0.367679872693 >>> data.join(gatos, en='elemento')
GOOG 0.26666583847 país fecha industria artículo valor
IBM 0.0833057542385 0 EE. UU. 2009-12-28 TECNOLOGÍA GOOG 622.9
1 EE. UU. 2009-12-29 TECNOLOGÍA GOOG 619.4

>>> (s1 + s2).fillna(0) 2 US 2009-12-30 TECNOLOGÍA GOOG 622.7


AAPL 0.0686791008184 3 US 2009-12-31 TECNOLOGÍA GOOG 620
BARRA 0.358165479807 4 EE. UU. 2009-12-28 TECNOLOGÍA AAPL 211.6
C 0.16586702944 5 EE. UU. 2009-12-29 TECNOLOGÍA AAPL 209.1
BD 0.367679872693 6 EE. UU. 2009-12-30 TECNOLOGÍA AAPL 211.6
F 0.0 7 EE. UU. 2009-12-31 TECNOLOGÍA AAPL 210.7
GOOG 0.26666583847
IBM 0.0833057542385 Esto es similar a una operación de combinación SQL entre dos tablas.
SAP 0.0
SCGLY 0.0
VW 0.0 Variables categóricas y operaciones "Agrupar por"
Uno podría querer realizar una operación (por ejemplo, una agregación) en un
Los métodos comunes de ndarray se han reescrito automáticamente
subconjunto de un conjunto de datos determinado por una variable categórica.
excluir los datos faltantes de los cálculos:
Por ejemplo, supongamos que deseamos calcular el valor medio por
>>> (s1 + s2).suma() industria para un conjunto de datos de existencias:
1.3103630754662747
>>> s >>> indicador
>>> (s1 + s2).cuenta() AAPL 0,044 IBM 0,050 TECNOLOGIA AAPL
6 IBM TECNOLOGÍA
Machine Translated by Google
ESTRUCTURAS DE DATOS PARA COMPUTACIÓN ESTADÍSTICA EN PYTHON 59

SAVIA 0,101 SAVIA TECNOLOGÍA >>> grunfeld


GOOG 0,113 0,138 TECNOLOGÍA GOOG cápita 2,8 empresa valor año
C SCGLY C ALETA 53,8 97,8 12345 inversión 3078 1935
0,037 0,200 0,281 0,040 ALETA SCGLY 0 10,5 183,2 6 7 8 9 10 317,6 1362 1935
BAR BAR ALETA 20 6,5 100,2 12345 209,9 1171 1935
base de datos base de datos ALETA 40 1,8 162 4,5 6 7 8 9 10 33,1 417.5 1935
vw vw AUTO 60 52,6 50,5 40,29 157.7 1935
RNO AUTOMÁTICO 80 104,4 10,2 39,68 197 138 1935
F AUTO 100 204 15,8 20,36 191.5 1935
TM AUTO 120 125 0,8 174 24,43 290.6 1935
140 4,71 12,93 70.91 1935
Este concepto de "agrupar por" es una característica integrada de muchos lenguajes orientados 160 26,63 4662 1935

a datos, como R y SQL. En R, cualquier vector de datos no numéricos se puede usar como 180 2,54 1807 1936
1 21 391,8 2016 1936
entrada para una función de agrupación como
41 355,3 45 837.8 1936
como tapply: 61 72,76 167.9 1936
81 50,73 210.3 1936
> etiquetas
101 25,98 200.1 1936
[1] GOOG GOOG GOOG GOOG AAPL AAPL AAPL AAPL
121 23,21 516 291.1 1936
Niveles: AAPL GOOG
141 25,9 87.94 1936
> datos
161 23,39 2 1936
[1] 622,87 619,40 622,73 619,98 211,61 209,10
181 1936
211,64 210,73
...

> tapply(datos, etiquetas, media)


GOOG AAPL En realidad, estos datos son tridimensionales, con empresa, año y artículo (datos
210.770 621.245 nombre de campo) siendo las tres claves únicas que identifican un punto de datos.
Los datos de panel presentados en formato tabular a menudo se denominan
pandas te permite hacer esto de manera similar:
formato apilado o largo. Nos referimos a la forma verdaderamente tridimensional
>>> data.groupby(etiquetas).agregado(np.media) como la forma ancha. pandas proporciona clases para operar en ambos:
AAPL 210.77
GOOG 621.245 >>> lp = LongPanel.fromRecords(grunfeld, 'año',
'firma')
Se puede usar groupby para expresar de forma concisa operaciones sobre datos relacionales, >>> wp = lp.toWide()
como contar el tamaño de los grupos: >>> wpp
<clase 'pandas.core.panel.WidePanel'>
>>> s.groupby(ind).agregado(largo) Dimensiones: 3 (elementos) x 20 (mayor) x 10 (menor)
AUTO 1
Elementos: capital a valor
ALETA 4
Eje mayor: 1935 a 1954
TECNOLOGÍA 4 Eje menor: 1 a 10

En el caso más general, groupby usa una función o mapeo Ahora, con los datos en forma tridimensional, podemos examinar la
para producir agrupaciones a partir de uno de los ejes de un objeto pandas . Por
elementos de datos por separado o calcular estadísticas descriptivas más fácilmente
devolviendo un objeto GroupBy podemos admitir más operaciones que
(aquí la función head solo muestra las primeras 10 filas del
solo agregación. Aquí podemos restar las medias de la industria de un dato
DataFrame para el elemento de capital):
establecer:

>>> wp['capital'].head()
degradar = lambda x: x - x.media() 1935 1936 1 2,8 265 2 52,6 1937 1938 1939
402,2 3 156,9 761,5 4 209,25922,4
203,4 53,8 213,8 97.8
def group_demean(obj, función de tecla): 1020 6 207,2 1099 7 255,2 1208
303,78 50,5 132,6 104.4
agrupado = obj.groupby(keyfunc) 1430 9 264,1 6 201 2777 118,1 264,8 118
volver agrupado.transformar (demean) 260,2 306,9 156.2
312,7 351,1 172.6
>>> group_demean(s1, ind) 254,2 357,8 186.6
AAPL -0.0328370881632 261,4 342,1 220.9
BAR 0.0358663891836 298,7 444,2 287.8
C -0.0261271326111 301,8 623,6 319.9
base de datos 0.11719543981 279,1 669,7 321.3
GOOG 0.035936259143
IBM -0.0272802815728
De esta forma, calcular estadísticas de resumen, como la serie de tiempo
SAVIA 0.024181110593
media para cada par (artículo, empresa), se puede realizar fácilmente:
SCGLY -0.126934696382
vw 0.0
>>> wp.media(eje='principal')
inversión de capital 140,8 valor
1 98,45 153,9 131,5 205,4134,8 923.8
Manipulación de datos del panel (3D)
2 244,2 115,8 269,9 109,9132,2
281,7 1142
Un conjunto de datos sobre un conjunto de personas o entidades durante un intervalo de tiempo 3 301,7 169,7 344,8 173,3196,7
389,2 1140
4 428,5 197,4 872.1
se conoce comúnmente como datos de panel; es decir, para cada entidad sobre un
5 998.9
intervalo de fechas observamos un conjunto de variables. Estos datos se pueden encontrar 6 1056
ambos en forma balanceada (mismo número de observaciones de tiempo para cada 7 1148

individual) o desequilibrada (diferente número de observaciones). 8 1068


9 1236
Las manipulaciones de datos de panel son importantes para construir entradas para
10 1233
rutinas de estimación estadística, como la regresión lineal. Considerar
el conjunto de datos de Grunfeld [Grun] utilizado con frecuencia en econometría Como ejemplo de aplicación de estas estructuras de datos de panel, considere
(ordenados por año): construcción de variables ficticias (columnas de 1 y 0 que identifican
Machine Translated by Google
60 PROC. DEL IX CONF. PITÓN EN CIENCIA. (SCIPY 2010)

fechas o entidades) para regresiones lineales. Especial para desequilibrados Durante varios años , scikits.timeseries [SciTS] ha sido
datos de panel, esto puede ser una tarea difícil. Ya que tenemos todos los disponible para usuarios científicos de Python. Está construido sobre el rayo MaskedAr
datos de etiquetado necesarios aquí, podemos implementar fácilmente tal y está diseñado para series de tiempo de frecuencia fija. mientras forzaba
operación como un método de instancia. Los datos a ser de frecuencia fija pueden permitir un mejor rendimiento en algunos
áreas, en general hemos encontrado que ese criterio es bastante rígido en
práctica. El usuario de scikits.timeseries también debe alinear explícitamente
Implementación de modelos estadísticos
datos; las operaciones que involucran datos no alineados producen resultados poco intuitivos.
Al aplicar un modelo estadístico, preparación y limpieza de datos
Al diseñar pandas , esperábamos hacer trabajar con el tiempo.
puede ser una de las tareas más tediosas o que consumen más tiempo. Idealmente
datos de la serie intuitivos sin agregar demasiada sobrecarga al
la mayoría de este trabajo estaría a cargo del modelo
modelo de datos subyacente. Las estructuras de datos de pandas tienen en cuenta
clase en sí. En R, mientras que los datos de NA se pueden excluir automáticamente
la fecha y la hora, pero no hacen suposiciones sobre las fechas. En cambio, cuando
de una regresión lineal, uno debe alinear los datos y poner
cuestiones de frecuencia o regularidad, el usuario tiene la capacidad de generar
en un data.frame o preparar una colección de 1D
intervalos de fechas o conformar un conjunto de series temporales a un determinado
arreglos que son todos de la misma longitud.
frecuencia. Para ello, tenemos la clase DateRange (que es
Usando pandas, el usuario puede evitar gran parte de esta preparación de datos.
también una subclase de Index, por lo que no es necesaria la conversión) y el
trabajar. Como modelo ejemplar que aprovecha el modelo de datos de pandas ,
clase DateOffset, cuyas subclases implementan varios
implementamos la regresión de mínimos cuadrados ordinarios tanto en el
incrementos de tiempo específicos de dominio y propósito. Aquí generamos un
caso estándar (sin hacer suposiciones sobre el contenido de la
intervalo de fechas entre el 1/1/2000 y el 1/1/2010 en el "mes hábil
regresores) y el caso del panel, que tiene opciones adicionales para
fin" frecuencia BMonthEnd:
permitir variables ficticias de entidad y tiempo. Frente al usuario es un
función única, ols, que infiere el tipo de modelo a estimar >>> Intervalo de fechas('1/1/2000', '1/1/2010',
basado en las entradas: desplazamiento=BFinDeMes())
<clase 'pandas.core.daterange.DateRange'>
>>> modelo = ols(y=Y, x=X) compensación: <1 fin de mes empresarial>
>>> modelo.beta [2000-01-31 00:00:00, ..., duración: 120 2009-12-31 00:00:00]
AAPL 0.187984100742
GOOG 0.264882582521
0.207564901899
Se puede usar una instancia de DateOffset para convertir un objeto
Intercepción de MSFT -0.000896535166817
que contiene datos de series de tiempo, como un DataFrame como en nuestro anterior
Si la variable de respuesta Y es un DataFrame (2D) o dict de 1D ejemplo, a una frecuencia diferente usando la función asfreq:
Series, se ejecutará una regresión de panel en datos apilados (agrupados).
Entonces, la x tendría que ser WidePanel, LongPanel, >>> mensual = df.asfreq(BMonthEnd())
AAPL GOOG MSFT YHOO
o un dict de objetos DataFrame. Dado que estos objetos contienen todos 2009-08-31 168,2 2009-09-30 461,7 24,54 14.61
de la información necesaria para construir las matrices de diseño para 185,3 2009-10-30 188,5 2009-11-30 495,9 25,61 17.81

la regresión, no hay nada de qué preocuparse por el usuario (excepto 199,9 2009-12-31 210,7 536,1 27,61 15.9
583 620 29,41 14.97
la formulación del modelo).
30,48 16.78
La función ols también es capaz de estimar un movimiento
regresión lineal de ventana para datos de series de tiempo. esto puede ser util Algunas cosas que no se logran fácilmente en scik its.timeseries se pueden hacer
para estimar relaciones estadísticas que cambian con el tiempo: usando el modelo DateOffset, como
derivar compensaciones personalizadas sobre la marcha o cambiar los datos mensuales hacia adelante
>>> modelo = ols(y=Y, x=X, window_type='rolling',
ventana=250) por un número de días hábiles usando la función de cambio:
>>> modelo.beta
<clase 'pandas.core.matrix.DataFrame'<> >>> desplazamiento = Minuto(12)
Índice: 1103 entradas Columnas de , 2005-08-16 a 2009-12-31
>>> Intervalo de fechas ('18/6/2010 8:00:00',
datos:
'18/6/2010 12:00:00',
AAPL 1103 valores no nulos
desplazamiento = desplazamiento)
GOOG 1103 valores no nulos
<clase 'pandas.core.daterange.DateRange'>
Tipo de 1103 valores no nulos compensación: <12 Minutos>
intercepción de 1103 valores no nulos
[2010-06-18 08:00:00, ..., duración: 21 2010-06-18 12:00:00]
MSFT: float64 (4)

Aquí hemos estimado una regresión de ventana móvil con un tamaño de ventana de
>>> mensual.shift(5, offset=Bahía())
250 períodos de tiempo. Los coeficientes de regresión resultantes AAPL GOOG MSFT YHOO
almacenados en model.beta ahora son un marco de datos de series temporales. 2009-09-07 168,2 461,7 24,54 14,61
2009-10-07 185,3 495,9 25,61 17,81
2009-11-06 188,5 536,1 27,61 15,9
2009-12-07 199,9 583 210,7 620 29,41 14,97
Manejo de fecha/hora
2010-01-07 30,48 16,78
En aplicaciones que involucran datos de series de tiempo, manipulaciones en fechas
y los tiempos pueden ser bastante tediosos e ineficientes. herramientas para trabajar Dado que pandas usa el objeto de fecha y hora incorporado de Python, uno
con fechas en MATLAB, R y muchos otros lenguajes son torpes podría prever problemas de rendimiento con conjuntos de datos de series temporales
o subdesarrollado. Dado que Python tiene un tipo de fecha y hora incorporado muy grandes o de alta frecuencia. Para la mayoría de las aplicaciones generales
fácilmente accesible tanto a nivel de Python como de C/Cython, nuestro objetivo financieras o econométricas, no podemos justificar la complicación
para crear funciones de fecha y hora eficientes y fáciles de usar. Cuando manejo de fecha y hora para resolver estos problemas; especializado
el dtype NumPy datetime64 ha madurado, por supuesto, será necesario crear herramientas en tales casos. Esto puede ser de hecho ser
reevaluar nuestra estrategia de manejo de fechas cuando corresponda. una vía fructífera para el trabajo de desarrollo futuro.
Machine Translated by Google
ESTRUCTURAS DE DATOS PARA COMPUTACIÓN ESTADÍSTICA EN PYTHON 61

Paquetes relacionados [Estado] StatCorp. 2010, software estadístico Stata: Versión 11 http://
www.stata.com
Recientemente han aparecido otros paquetes de Python que [SAS] Instituto SAS Inc., Sistema SAS, http://www.sas.com
proporcionar una funcionalidad similar a pandas. Entre estos, la
([Larry]) es el más similar, ya que implementa un ndarray etiquetado
objeto con la intención de imitar de cerca las matrices NumPy. esto se destaca
en contraste con nuestro enfoque, que está impulsado por la práctica
consideraciones de series de tiempo y datos transversales encontrados en
finanzas, econometría y estadística. Las referencias incluyen un
acoplar otros paquetes de interés ([Tab], [pydataframe]).
Si bien pandas proporciona algunos modelos de regresión lineal útiles,
no pretende ser exhaustivo. Planeamos trabajar de cerca
con los desarrolladores de scikits.statsmodels ([StaM]) para
mejorar la cohesión de las herramientas de modelado estadístico en Python.
Es probable que los pandas pronto se conviertan en una dependencia "ligera" de
scikits.statsmodels; la eventual creación de un superpaquete para
modelado estadístico que incluye pandas, scikits.statsmodels y
algunas otras bibliotecas tampoco están fuera de discusión.

Conclusiones

Creemos que en los próximos años habrá una gran oportunidad para atraer
usuarios que necesiten herramientas de análisis de datos estadísticos.
a Python que podría haber elegido previamente R, MATLAB o
otro entorno de investigación. Mediante el diseño robusto, fácil de usar
estructuras de datos que son coherentes con el resto de Python científico
stack, podemos hacer de Python una opción convincente para el análisis de datos
aplicaciones En nuestra opinión, los pandas representan un paso sólido en el
dirección correcta.

REFERENCIAS
[pandas] W. McKinney, AQR Capital Management, pandas: una pitón
biblioteca de análisis de datos, http://pandas.sourceforge.net
[Larry] K. Goodman. la/larry: ndarray con ejes etiquetados, http://larry.
sourceforge.net/
[SciTS] M. Knox, P. Gerard-Marchant, scikits.timeseries: tiempo de Python
análisis de series, http://pytseries.sourceforge.net/
[Estado] S. Seabold, J. Perktold, J. Taylor, scikits.statsmodels: estadístico
modelado en Python, http://statsmodels.sourceforge.net
[SciL] D. Cournapeau, et al., scikits.learn: aprendizaje automático en
Python, http://scikit-learn.sourceforge.net
[PyMC] C. Fonnesbeck, A. Patil, D. Huard, PyMC: Cadena de Markov
Montecarlo para Python, http://code.google.com/p/pymc/
[Pestaña] D. Yamins, E. Angelino, tabular: estructura de datos tabarray para
datos 2D, http://parsemydata.com/tabular/
[NumPy] T. Oliphant, http://numpy.scipy.org
[SciPy] E. Jones, T. Oliphant, P. Peterson, http://scipy.org
[matplotlib] J. Hunter, et al., matplotlib: trazado de Python, http://matplotlib.
sourceforge.net/
[EPD] Enthought, Inc., EPD: Distribución de Enthought Python, http://
www.enthought.com/products/epd.php
[Pitonxia] P. Raybaut, Python(x,y): distribución de Python con orientación científica,
http://www.pythonxy.com/
[CRAN] El Proyecto R para Computación Estadística, http://cran.r-project.
org/
[citón] G. Ewing, RW Bradshaw, S. Behnel, DS Seljebotn, et al.,
El compilador de Cython, http://cython.org
[IPython] F. Perez, et al., IPython: un entorno informático interactivo,
http://ipython.scipy.org
[Grun] Batalgi, conjunto de datos de Grunfeld, http://www.wiley.com/legacy/
wileychi/baltagi/
[aburrido] J. Taylor, F. Perez, et al., nipy: Neuroimagen en Python, http:
//nipy.sourceforge.net
[pydataframe] A. Straw, F. Finkernagel, pydataframe, http://code.google.com/
p/pydataframe/
[R] Equipo central de desarrollo de R. 2010, R: un lenguaje y entorno para la
computación estadística, http://www.R-project.org
[MATLAB] The MathWorks Inc. 2010, MATLAB, http://www.mathworks.
com

También podría gustarte