Habiendo pasado una cantidad de tiempo decente viendo ambos r y pandasEn SO, la impresión que obtengo es que pandas
es menos probable que las preguntas contengan datos reproducibles. Esto es algo que la comunidad R ha sido muy buena para alentar, y gracias a guías como esta , los recién llegados pueden obtener ayuda para armar estos ejemplos. Las personas que pueden leer estas guías y regresar con datos reproducibles a menudo tendrán mucha mejor suerte al obtener respuestas a sus preguntas.
¿Cómo podemos crear buenos ejemplos reproducibles para pandas
preguntas? Se pueden juntar marcos de datos simples, por ejemplo:
import pandas as pd
df = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice'],
'income': [40000, 50000, 42000]})
Pero muchos conjuntos de datos de ejemplo necesitan una estructura más complicada, por ejemplo:
datetime
índices o datos- Múltiples variables categóricas (¿hay un equivalente a la
expand.grid()
función de R , que produce todas las combinaciones posibles de algunas variables dadas?) - MultiIndex o Panel de datos
Para conjuntos de datos que son difíciles de simular usando algunas líneas de código, ¿hay un equivalente a R dput()
que le permita generar código que se pueda copiar y pegar para regenerar su estructura de datos?
df.head(N).to_dict()
, dondeN
hay un número razonable, es una buena manera de hacerlo. Bonus + 1 para agregar saltos de línea bonita a la salida. Para las marcas de tiempo, generalmente solo necesitará agregarfrom pandas import Timestamp
al principio del código.Respuestas:
Nota: Las ideas aquí son bastante genéricas para Stack Overflow, de hecho preguntas .
Descargo de responsabilidad: escribir una buena pregunta es DURO.
El bueno:
incluya un pequeño * DataFrame de ejemplo, ya sea como código ejecutable:
o hacerlo "copiar y pegar" usando
pd.read_clipboard(sep='\s\s+')
, puede formatear el texto para resaltar el desbordamiento de pila y usar Ctrl+ K(o anteponer cuatro espacios a cada línea), o colocar tres tildes arriba y abajo de su código con su código sin sangría:pd.read_clipboard(sep='\s\s+')
ponte a prueba* Realmente media pequeña , la gran mayoría de las tramas de datos de ejemplo podría ser menos de 6 filas cita requerida , y apuesto a que puedo hacerlo en 5 filas. ¿Puede reproducir el error con
df = df.head()
, si no jugar, para ver si puede hacer un pequeño DataFrame que muestre el problema que enfrenta?* Cada regla tiene una excepción, la más obvia es para problemas de rendimiento ( en cuyo caso, sin duda utilizar% timeit y posiblemente% prun ), donde se debe generar (np.random.seed considerar el uso de lo que tenemos exactamente el mismo marco):
df = pd.DataFrame(np.random.randn(100000000, 10))
. Decir que "hacer que este código sea rápido para mí" no es estrictamente el tema del sitio ...escriba el resultado que desea (de manera similar a lo anterior)
Explica de dónde provienen los números: el 5 es la suma de la columna B para las filas donde A es 1.
muestra el código que has probado:
Pero diga qué es incorrecto: la columna A está en el índice en lugar de una columna.
demuestre que ha investigado un poco ( busque en los documentos , busque StackOverflow ), brinde un resumen:
Aparte: la respuesta aquí es usar
df.groupby('A', as_index=False).sum()
.si es relevante que tengas columnas de marca de tiempo, por ejemplo, si estás remuestreando o algo así, entonces sé explícito y aplícalo
pd.to_datetime
como medida **.** A veces este es el problema en sí: eran cadenas.
El malo:
no incluye un MultiIndex, que no podemos copiar y pegar (ver arriba), esto es una queja con la visualización predeterminada de los pandas pero molesta:
La forma correcta es incluir un DataFrame ordinario con una
set_index
llamada:proporcione una idea de lo que es cuando da el resultado que desea:
Sea específico sobre cómo obtuvo los números (qué son) ... verifique que sean correctos.
Si su código arroja un error, incluya todo el seguimiento de la pila (esto se puede editar más adelante si es demasiado ruidoso). Muestre el número de línea (y la línea correspondiente de su código contra el cual está aumentando).
El feo:
no enlace a un csv al que no tengamos acceso (idealmente no enlace a una fuente externa en absoluto ...)
La mayoría de los datos son propietarios , obtenemos eso: invente datos similares y vea si puede reproducir el problema (algo pequeño).
no explique la situación vagamente en palabras, como si tuviera un DataFrame que es "grande", mencione algunos de los nombres de columna al pasar (asegúrese de no mencionar sus tipos). Intenta entrar en muchos detalles sobre algo que no tiene sentido sin ver el contexto real. Presumiblemente, nadie va a leer hasta el final de este párrafo.
Los ensayos son malos, es más fácil con pequeños ejemplos.
no incluya 10+ (100+ ??) líneas de mezcla de datos antes de llegar a su pregunta real.
Por favor, vemos suficiente de esto en nuestros trabajos diarios. Queremos ayudar, pero no como esto ... .
Corte la introducción y solo muestre los DataFrames relevantes (o versiones pequeñas de ellos) en el paso que le está causando problemas.
De todos modos, ¡diviértete aprendiendo Python, NumPy y Pandas!
fuente
pd.read_clipboard(sep='\s\s+')
propina. Cuando publico preguntas SO que necesitan un marco de datos especial pero fácil de compartir, como este, lo construyo en Excel, lo copio a mi portapapeles y luego le indico a SOers que haga lo mismo. ¡Ahorra mucho tiempo!pd.read_clipboard(sep='\s\s+')
sugerencia no parece funcionar si está utilizando Python en un servidor remoto, que es donde viven muchos conjuntos de datos grandes.pd.read_clipboard(sep='\s\s+')
, y no es más simplepd.read_clipboard()
(con el valor predeterminado‘s+’
)? El primero necesita al menos 2 caracteres de espacio en blanco, lo que puede causar problemas si solo hay 1 (por ejemplo, ver esto en la respuesta de @JohnE ).pd.read_clipboard()
, cuando hay espacios, lo hagopd.read_clipboard(sep='\s+{2,}', engine='python')
:: PCómo crear conjuntos de datos de muestra
Esto es principalmente para ampliar la respuesta de @ AndyHayden al proporcionar ejemplos de cómo puede crear marcos de datos de muestra. Los pandas y (especialmente) numpy le brindan una variedad de herramientas para esto, de modo que generalmente puede crear un facsímil razonable de cualquier conjunto de datos real con solo unas pocas líneas de código.
Después de importar numpy y pandas, asegúrese de proporcionar una semilla aleatoria si desea que las personas puedan reproducir exactamente sus datos y resultados.
Un ejemplo de fregadero de cocina
Aquí hay un ejemplo que muestra una variedad de cosas que puede hacer. Se podrían crear todo tipo de marcos de datos de muestra útiles a partir de un subconjunto de esto:
Esto produce:
Algunas notas:
np.repeat
ynp.tile
(columnasd
ye
) son muy útiles para crear grupos e índices de una manera muy regular. Para 2 columnas, esto se puede utilizar para duplicar fácilmente r'sexpand.grid()
pero también es más flexible en la capacidad de proporcionar un subconjunto de todas las permutaciones. Sin embargo, para 3 o más columnas, la sintaxis se vuelve rápidamente difícil de manejar.expand.grid()
vea laitertools
solución en el libro de cocina de los pandas o lanp.meshgrid
solución que se muestra aquí . Esos permitirán cualquier cantidad de dimensiones.np.random.choice
. Por ejemplo, en la columnag
, tenemos una selección aleatoria de 6 fechas de 2011. Además, al establecerreplace=False
podemos asegurar que estas fechas son únicas, muy útiles si queremos usar esto como un índice con valores únicos.Datos falsos del mercado de valores
Además de tomar subconjuntos del código anterior, puede combinar aún más las técnicas para hacer casi cualquier cosa. Por ejemplo, aquí hay un breve ejemplo que combina
np.tile
ydate_range
crea datos de muestra para 4 acciones que cubren las mismas fechas:Ahora tenemos un conjunto de datos de muestra con 100 líneas (25 fechas por ticker), pero solo hemos usado 4 líneas para hacerlo, lo que facilita la reproducción de todos los demás sin copiar y pegar 100 líneas de código. Luego puede mostrar subconjuntos de datos si esto ayuda a explicar su pregunta:
fuente
expand.grid()
que está incluida en el libro de cocina de los pandas , también podría incluirla en su respuesta. Su respuesta muestra cómo crear conjuntos de datos más complejos de lo queexpand_grid()
podría manejar mi función, lo cual es genial.Diario de un respondedor
Mi mejor consejo para hacer preguntas sería jugar con la psicología de las personas que responden preguntas. Al ser una de esas personas, puedo dar una idea de por qué respondo ciertas preguntas y por qué no respondo otras.
Motivaciones
Estoy motivado para responder preguntas por varias razones
Todas mis intenciones más puras son geniales, pero obtengo esa satisfacción si respondo 1 pregunta o 30. Lo que impulsa mis elecciones para qué preguntas responder tiene un gran componente de maximización de puntos.
También dedicaré tiempo a problemas interesantes, pero eso es poco y distante entre sí y no ayuda a quien pregunta y necesita una solución a una pregunta no interesante. Su mejor apuesta para que responda una pregunta es responderla en un plato maduro para que pueda responderla con el menor esfuerzo posible. Si estoy viendo dos preguntas y una tiene código, puedo copiar y pegar para crear todas las variables que necesito ... ¡Estoy tomando esa! Volveré al otro si tengo tiempo, tal vez.
Consejo principal
Facilite a las personas que responden preguntas.
Su reputación es más que solo su reputación.
Me gustan los puntos (lo mencioné anteriormente). Pero esos puntos no son realmente mi reputación. Mi verdadera reputación es una amalgama de lo que otros en el sitio piensan de mí. Me esfuerzo por ser justo y honesto y espero que otros puedan ver eso. Lo que eso significa para un autor de la pregunta es que recordamos los comportamientos de los participantes. Si no selecciona respuestas y vota buenas respuestas, lo recuerdo. Si te comportas de una manera que no me gusta o de una forma que me gusta, lo recuerdo. Esto también juega a qué preguntas responderé.
De todos modos, probablemente pueda continuar, pero les perdonaré a todos los que realmente leen esto.
fuente
El desafío Uno de los aspectos más difíciles de responder a las preguntas de SO es el tiempo que lleva recrear el problema (incluidos los datos). Las preguntas que no tienen una forma clara de reproducir los datos tienen menos probabilidades de ser respondidas. Dado que se está tomando el tiempo para escribir una pregunta y tiene un problema con el que le gustaría recibir ayuda, puede ayudarse fácilmente al proporcionar datos que otros pueden usar para ayudar a resolver su problema.
Las instrucciones proporcionadas por @Andy para escribir buenas preguntas de Pandas son un excelente lugar para comenzar. Para obtener más información, consulte cómo preguntar y cómo crear ejemplos mínimos, completos y verificables .
Indique claramente su pregunta por adelantado. Después de tomarse el tiempo para escribir su pregunta y cualquier código de muestra, intente leerlo y proporcione un 'Resumen Ejecutivo' para su lector que resuma el problema y que establezca claramente la pregunta.
Pregunta original :
Dependiendo de la cantidad de datos, código de muestra y pilas de errores proporcionados, el lector debe recorrer un largo camino antes de comprender cuál es el problema. Intente volver a plantear su pregunta para que la pregunta esté en la parte superior y luego proporcione los detalles necesarios.
Pregunta revisada :
PROPORCIONE DATOS DE MUESTRA SI ES NECESARIO !!!
A veces, solo la cabeza o la cola del DataFrame es todo lo que se necesita. También puede usar los métodos propuestos por @JohnE para crear conjuntos de datos más grandes que otros puedan reproducir. Usando su ejemplo para generar un DataFrame de 100 filas de precios de acciones:
Si estos fueron sus datos reales, es posible que desee incluir el encabezado y / o la cola del marco de datos de la siguiente manera (asegúrese de anonimizar los datos confidenciales):
Es posible que también desee proporcionar una descripción del DataFrame (utilizando solo las columnas relevantes). Esto facilita que otros verifiquen los tipos de datos de cada columna e identifiquen otros errores comunes (por ejemplo, fechas como cadena frente a fecha y hora 64 frente a objeto):
NOTA: Si su DataFrame tiene un MultiIndex:
Si su DataFrame tiene un índice múltiple, primero debe reiniciar antes de llamar
to_dict
. Luego debe volver a crear el índice conset_index
:fuente
Aquí está mi versión de
dput
- la herramienta estándar R para producir informes reproducibles - para PandasDataFrame
s. Probablemente fallará para marcos más complejos, pero parece hacer el trabajo en casos simples:ahora,
Tenga en cuenta que esto produce un resultado mucho más detallado que
DataFrame.to_dict
, por ejemplo,vs
para
du
arriba, pero conserva los tipos de columna . Por ejemplo, en el caso de prueba anterior,porque
du.dtypes
esuint8
ypd.DataFrame(du.to_dict()).dtypes
esint64
.fuente
to_dict
du.equals(eval(dput(df)))
,.