Tendo passado bastante tempo assistindo os dois r e pandasNo SO, a impressão que tenho é que as pandas
perguntas têm menos probabilidade de conter dados reproduzíveis. Isso é algo que a comunidade R tem incentivado bastante e, graças a guias como esse , os recém-chegados podem obter ajuda para montar esses exemplos. As pessoas que são capazes de ler esses guias e voltar com dados reproduzíveis geralmente terão muito mais sorte em obter respostas para suas perguntas.
Como podemos criar bons exemplos reproduzíveis para pandas
perguntas? Quadros de dados simples podem ser reunidos, por exemplo:
import pandas as pd
df = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice'],
'income': [40000, 50000, 42000]})
Mas muitos exemplos de conjuntos de dados precisam de uma estrutura mais complicada, por exemplo:
datetime
índices ou dados- Várias variáveis categóricas (existe um equivalente a R's
expand.grid()
função , que produz todas as combinações possíveis de algumas variáveis?) - Dados MultiIndex ou Painel
Para conjuntos de dados difíceis de serem simulados usando algumas linhas de código, existe um equivalente aos Rs dput()
que permitem gerar código passível de cópia para regenerar sua estrutura de dados?
df.head(N).to_dict()
, ondeN
está um número razoável, é um bom caminho a percorrer. + 1s de bônus por adicionar quebras de linha bonitas à saída. Para carimbos de data e hora, você normalmente precisará adicionarfrom pandas import Timestamp
à parte superior do código.Respostas:
Nota: As idéias aqui são bastante genéricas para Stack Overflow, na verdade perguntas .
Disclaimer: Escrever uma boa pergunta é DURO.
O bom:
inclua * exemplo pequeno DataFrame, como código executável:
ou torná-lo "copiado e colável" usando
pd.read_clipboard(sep='\s\s+')
, você pode formatar o texto para realçar Stack Overflow e usar Ctrl+ K(ou acrescentar quatro espaços a cada linha) ou colocar três tildes acima e abaixo do seu código com o seu código não identificado:teste a
pd.read_clipboard(sep='\s\s+')
si mesmo.* Eu realmente quero dizer pequeno , a grande maioria dos DataFrames de exemplo pode ter menos de 6 linhas de citação necessárias , e aposto que posso fazê-lo em 5 linhas. Você pode reproduzir o erro com
df = df.head()
, se não mexer, para ver se consegue criar um pequeno DataFrame que exiba o problema que está enfrentando.* Toda regra tem uma exceção, o óbvio é para problemas de desempenho ( caso em que definitivamente usar% timeit e possivelmente% prun ), onde deve gerar (considere usando np.random.seed por isso temos exatamente o mesmo quadro):
df = pd.DataFrame(np.random.randn(100000000, 10))
. Dizer que "tornar este código rápido para mim" não é estritamente tópico sobre o site ...escreva o resultado que você deseja (da mesma forma que acima)
Explique de onde vêm os números: o 5 é a soma da coluna B para as linhas em que A é 1.
mostre o código que você tentou:
Mas diga o que está incorreto: a coluna A está no índice e não em uma coluna.
mostre que você fez alguma pesquisa ( pesquise os documentos , pesquise StackOverflow ), forneça um resumo:
Além: a resposta aqui é usar
df.groupby('A', as_index=False).sum()
.se for relevante que você tenha colunas de carimbo de data e hora, por exemplo, você está reamostrando ou algo assim, seja explícito e aplique
pd.to_datetime
-as a uma boa medida **.** Às vezes, esse é o problema em si: eram cordas.
O mal:
não inclua um MultiIndex, que não podemos copiar e colar (veja acima), isso é uma espécie de queixa com a exibição padrão do pandas, mas mesmo assim irritante:
A maneira correta é incluir um DataFrame comum com uma
set_index
chamada:forneça informações sobre o que é ao fornecer o resultado desejado:
Seja específico sobre como conseguiu os números (o que são) ... verifique se estão corretos.
Se o seu código gerar um erro, inclua todo o rastreamento da pilha (isso pode ser editado posteriormente se for muito barulhento). Mostre o número da linha (e a linha correspondente do seu código contra a qual ele está aumentando).
O feio:
não vincule a um csv ao qual não temos acesso (idealmente, não vincule a uma fonte externa) ...
A maioria dos dados é proprietária e obtemos o seguinte: crie dados semelhantes e veja se é possível reproduzir o problema (algo pequeno).
não explique vagamente a situação em palavras, como se você tiver um DataFrame "grande", mencione alguns nomes de colunas de passagem (lembre-se de não mencionar seus tipos). Tente entrar em muitos detalhes sobre algo que é completamente sem sentido sem ver o contexto real. Presumivelmente, ninguém vai ler até o final deste parágrafo.
Os ensaios são ruins, é mais fácil com pequenos exemplos.
não inclua mais de 10 linhas (100+ ??) de dados antes de chegar à sua pergunta real.
Por favor, vemos o suficiente disso em nossos trabalhos diários. Queremos ajudar, mas não como este ... .
Faça a introdução e mostre apenas os DataFrames relevantes (ou pequenas versões deles) na etapa que está causando problemas.
De qualquer forma, divirta-se aprendendo Python, NumPy e Pandas!
fonte
pd.read_clipboard(sep='\s\s+')
dica. Quando publico perguntas de SO que precisam de um quadro de dados especial, mas facilmente compartilhado, como este, que eu o construo no Excel, copio-o para a área de transferência e instruo os SOers a fazer o mesmo. Economiza muito tempo!pd.read_clipboard(sep='\s\s+')
sugestão parece não funcionar se você estiver usando o Python em um servidor remoto, que é onde vivem muitos conjuntos de dados grandes.pd.read_clipboard(sep='\s\s+')
, e não um mais simplespd.read_clipboard()
(com o padrão‘s+’
)? O primeiro é necessário, pelo menos, dois caracteres de espaço em branco, que pode causar problemas, se existir apenas uma (por exemplo, ver tal no 's @JohnE resposta ).pd.read_clipboard()
, quando são espaços, eu façopd.read_clipboard(sep='\s+{2,}', engine='python')
:: PComo criar conjuntos de dados de amostra
Isso é principalmente para expandir a resposta de @ AndyHayden, fornecendo exemplos de como você pode criar quadros de dados de amostra. Pandas e (especialmente) numpy oferecem uma variedade de ferramentas para isso, de modo que você geralmente pode criar um fac-símile razoável de qualquer conjunto de dados real com apenas algumas linhas de código.
Depois de importar o numpy e os pandas, forneça uma semente aleatória se quiser que as pessoas possam reproduzir exatamente seus dados e resultados.
Um exemplo de pia de cozinha
Aqui está um exemplo mostrando uma variedade de coisas que você pode fazer. Todos os tipos de quadros de dados de amostra úteis podem ser criados a partir de um subconjunto disso:
Isso produz:
Algumas notas:
np.repeat
enp.tile
(colunasd
ee
) são muito úteis para criar grupos e índices de maneira muito regular. Para 2 colunas, isso pode ser usado para duplicar facilmente r's,expand.grid()
mas também é mais flexível na capacidade de fornecer um subconjunto de todas as permutações. No entanto, para 3 ou mais colunas, a sintaxe rapidamente se torna pesada.expand.grid()
consulte aitertools
solução no livro de receitas do pandas ou anp.meshgrid
solução mostrada aqui . Isso permitirá qualquer número de dimensões.np.random.choice
. Por exemplo, na colunag
, temos uma seleção aleatória de 6 datas a partir de 2011. Além disso, definindoreplace=False
podemos garantir que essas datas sejam únicas - muito úteis se quisermos usá-las como um índice com valores exclusivos.Dados falsos do mercado de ações
Além de pegar subconjuntos do código acima, você pode combinar ainda mais as técnicas para fazer praticamente qualquer coisa. Por exemplo, aqui está um pequeno exemplo que combina
np.tile
edate_range
cria dados de ticker de amostra para 4 ações que cobrem as mesmas datas:Agora, temos um conjunto de dados de amostra com 100 linhas (25 datas por ticker), mas usamos apenas quatro linhas para fazê-lo, facilitando a reprodução de todos os outros sem copiar e colar 100 linhas de código. Você pode exibir subconjuntos de dados se isso ajudar a explicar sua pergunta:
fonte
expand.grid()
, incluída no livro de receitas do pandas , você também pode incluí-la na sua resposta. Sua resposta mostra como criar conjuntos de dados mais complexos do que minhaexpand_grid()
função poderia suportar, o que é ótimo.Diário de um respondente
Meu melhor conselho para fazer perguntas seria brincar com a psicologia das pessoas que respondem a perguntas. Sendo uma dessas pessoas, posso entender por que respondo a certas perguntas e por que não respondo a outras.
Motivações
Estou motivado para responder a perguntas por vários motivos
Todas as minhas intenções mais puras são ótimas e tudo, mas fico satisfeito se responder 1 ou 30 perguntas. O que move minhas escolhas para quais perguntas responder tem um enorme componente de maximização de pontos.
Também vou dedicar tempo a problemas interessantes, mas isso é muito pouco e não ajuda um solicitante que precise de uma solução para uma pergunta não interessante. Sua melhor aposta para que eu responda a uma pergunta é servi-la em uma bandeja pronta para respondê-la com o mínimo de esforço possível. Se eu estiver olhando para duas perguntas e uma tiver código, posso copiar e colar para criar todas as variáveis necessárias ... Estou pegando essa! Voltarei ao outro se tiver tempo, talvez.
Conselho principal
Facilite para as pessoas que respondem a perguntas.
Sua reputação é mais do que apenas sua reputação.
Eu gosto de pontos (mencionei isso acima). Mas esses pontos não são realmente minha reputação. Minha reputação real é uma amálgama do que os outros no site pensam de mim. Esforço-me para ser justo e honesto e espero que outros possam ver isso. O que isso significa para um solicitante é que lembramos dos comportamentos dos solicitantes. Se você não selecionar respostas e votar em boas, lembro. Se você se comportar de maneiras que eu não gosto ou de maneiras que eu gosto, eu lembro. Isso também serve para quais perguntas eu responderei.
Enfim, eu provavelmente posso continuar, mas vou poupar todos vocês que realmente lêem isso.
fonte
O desafio Um dos aspectos mais desafiadores da resposta a perguntas de SO é o tempo necessário para recriar o problema (incluindo os dados). Perguntas que não têm uma maneira clara de reproduzir os dados têm menos probabilidade de serem respondidas. Como você está escrevendo um tempo para escrever uma pergunta e tem um problema com o qual gostaria de ajudar, você pode se ajudar facilmente, fornecendo dados que outras pessoas podem usar para ajudar a resolver seu problema.
As instruções fornecidas pelo @Andy para escrever boas perguntas sobre os pandas são um excelente ponto de partida. Para obter mais informações, consulte como perguntar e como criar exemplos mínimos, completos e verificáveis .
Indique claramente sua pergunta com antecedência. Após reservar um tempo para escrever sua pergunta e qualquer código de amostra, tente lê-la e forneça um 'Resumo executivo' para o seu leitor que resuma o problema e indique claramente a pergunta.
Pergunta original :
Dependendo da quantidade de dados, código de amostra e pilhas de erros fornecidas, o leitor precisa percorrer um longo caminho antes de entender qual é o problema. Tente reafirmar sua pergunta para que ela mesma fique no topo e forneça os detalhes necessários.
Pergunta revisada :
FORNECER DADOS DE AMOSTRA SE NECESSÁRIO !!!
Às vezes, apenas a cabeça ou a cauda do DataFrame é tudo o que é necessário. Você também pode usar os métodos propostos por @JohnE para criar conjuntos de dados maiores que podem ser reproduzidos por outras pessoas. Usando seu exemplo para gerar um DataFrame de 100 linhas dos preços das ações:
Se esses eram seus dados reais, você pode incluir apenas o cabeçalho e / ou a cauda do quadro de dados da seguinte maneira (não se esqueça de anonimizar quaisquer dados confidenciais):
Você também pode fornecer uma descrição do DataFrame (usando apenas as colunas relevantes). Isso facilita que outras pessoas verifiquem os tipos de dados de cada coluna e identifiquem outros erros comuns (por exemplo, datas como string vs. datetime64 vs. objeto):
NOTA: Se o seu DataFrame tiver um MultiIndex:
Se o seu DataFrame tiver um índice múltiplo, você deve primeiro redefinir antes de ligar
to_dict
. Você precisa recriar o índice usandoset_index
:fonte
Aqui está minha versão
dput
- a ferramenta R padrão para produzir relatórios reproduzíveis - para os PandasDataFrame
. Provavelmente falhará em quadros mais complexos, mas parece fazer o trabalho em casos simples:agora,
Observe que isso produz uma saída muito mais detalhada do que
DataFrame.to_dict
, por exemplo,vs
para
du
cima, mas conserva tipos de colunas . Por exemplo, no caso de teste acima,porque
du.dtypes
éuint8
epd.DataFrame(du.to_dict()).dtypes
éint64
.fonte
to_dict
du.equals(eval(dput(df)))
,.