Après avoir passé un temps décent à regarder à la fois r et pandasbalises sur SO, l'impression que j'ai, c'est que les pandas
questions sont moins susceptibles de contenir des données reproductibles. C'est quelque chose que la communauté R a été assez bonne pour encourager, et grâce à des guides comme celui-ci , les nouveaux arrivants peuvent obtenir de l'aide pour rassembler ces exemples. Les personnes capables de lire ces guides et de revenir avec des données reproductibles auront souvent beaucoup plus de chance d'obtenir des réponses à leurs questions.
Comment créer de bons exemples reproductibles de pandas
questions? Des trames de données simples peuvent être assemblées, par exemple:
import pandas as pd
df = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice'],
'income': [40000, 50000, 42000]})
Mais de nombreux exemples de jeux de données nécessitent une structure plus complexe, par exemple:
datetime
indices ou données- Plusieurs variables catégorielles (existe-t-il un équivalent à la
expand.grid()
fonction de R , qui produit toutes les combinaisons possibles de certaines variables données?) - Données MultiIndex ou Panel
Pour les jeux de données difficiles à simuler à l'aide de quelques lignes de code, existe-t-il un équivalent aux R dput()
qui vous permet de générer du code collable pour régénérer votre infrastructure de données?
df.head(N).to_dict()
, oùN
est un nombre raisonnable est une bonne façon de procéder. Bonus + 1 pour l'ajout de jolis sauts de ligne à la sortie. Pour les horodatages, vous aurez généralement juste besoin d'ajouterfrom pandas import Timestamp
en haut du code.Réponses:
Remarque: Les idées ici sont assez génériques pour Stack Overflow, en effet des questions .
Avertissement: écrire une bonne question est DIFFICILE.
Le bon:
inclure un petit * exemple DataFrame, soit sous forme de code exécutable:
ou le rendre "copiable et collable" en utilisant
pd.read_clipboard(sep='\s\s+')
, vous pouvez formater le texte pour mettre en surbrillance Stack Overflow et utiliser Ctrl+ K(ou ajouter quatre espaces à chaque ligne), ou placer trois tildes au-dessus et en dessous de votre code avec votre code sans indentation:testez-
pd.read_clipboard(sep='\s\s+')
vous.* Je veux vraiment dire petit , la grande majorité des exemples de DataFrames pourraient être moins de 6 lignes de citation nécessaires , et je parie que je peux le faire en 5 lignes. Pouvez-vous reproduire l'erreur avec
df = df.head()
, sinon tripoter pour voir si vous pouvez composer un petit DataFrame qui présente le problème auquel vous êtes confronté.* Chaque règle a une exception, la plus évidente est des problèmes de performance ( dans ce cas , certainement utiliser% timeit et peut - être% Prun ), où vous devez générer (envisager d' utiliser np.random.seed nous avons donc le cadre exactement le même):
df = pd.DataFrame(np.random.randn(100000000, 10))
. Dire que "faire ce code rapidement pour moi" n'est pas strictement un sujet pour le site ...écrivez le résultat que vous désirez (comme ci-dessus)
Expliquez la provenance des nombres: le 5 est la somme de la colonne B pour les lignes où A est 1.
montrez le code que vous avez essayé:
Mais dites ce qui est incorrect: la colonne A est dans l'index plutôt que dans une colonne.
montrez que vous avez fait des recherches ( recherchez dans les documents , recherchez StackOverflow ), donnez un résumé:
À part: la réponse ici est d'utiliser
df.groupby('A', as_index=False).sum()
.s'il est pertinent que vous ayez des colonnes d'horodatage, par exemple que vous rééchantillonnez ou quelque chose, soyez explicite et appliquez-
pd.to_datetime
leur pour faire bonne mesure **.** Parfois, c'est le problème lui-même: c'était des cordes.
Le mauvais:
ne pas inclure un MultiIndex, que nous ne pouvons pas copier-coller (voir ci-dessus), c'est une sorte de grief avec l'affichage par défaut des pandas mais néanmoins ennuyeux:
La bonne façon est d'inclure un DataFrame ordinaire avec un
set_index
appel:donnez un aperçu de ce que c'est lorsque vous donnez le résultat souhaité:
Soyez précis sur la façon dont vous avez obtenu les chiffres (quels sont-ils) ... vérifiez bien qu'ils sont corrects.
Si votre code génère une erreur, incluez la trace de pile entière (cela peut être édité plus tard s'il est trop bruyant). Montrez le numéro de ligne (et la ligne correspondante de votre code contre laquelle il s'élève).
Le moche:
ne pas lier à un csv auquel nous n'avons pas accès (idéalement ne pas lier à une source externe du tout ...)
La plupart des données sont propriétaires, nous obtenons cela: Créez des données similaires et voyez si vous pouvez reproduire le problème (quelque chose de petit).
n'expliquez pas vaguement la situation avec des mots, comme vous avez un DataFrame qui est "grand", mentionnez quelques noms de colonnes en passant (assurez-vous de ne pas mentionner leurs dtypes). Essayez d'entrer dans beaucoup de détails sur quelque chose qui n'a aucun sens sans voir le contexte réel. Vraisemblablement, personne ne va même lire jusqu'à la fin de ce paragraphe.
Les essais sont mauvais, c'est plus facile avec de petits exemples.
n'incluez pas 10+ (100+ ??) lignes de transfert de données avant d'arriver à votre question réelle.
S'il vous plaît, nous en voyons suffisamment dans nos emplois de jour. Nous voulons aider, mais pas comme ça ... .
Coupez l'intro et montrez simplement les DataFrames pertinents (ou leurs petites versions) à l'étape qui vous pose problème.
Quoi qu'il en soit, amusez-vous à apprendre Python, NumPy et Pandas!
la source
pd.read_clipboard(sep='\s\s+')
pointe. Lorsque je poste des questions SO qui nécessitent une trame de données spéciale mais facilement partagée, comme celle-ci, je la construis dans Excel, la copie dans mon presse-papiers, puis demande aux SOers de faire de même. Économise tellement de temps!pd.read_clipboard(sep='\s\s+')
suggestion ne semble pas fonctionner si vous utilisez Python sur un serveur distant, où vivent de nombreux ensembles de données volumineux.pd.read_clipboard(sep='\s\s+')
, et pas plus simplepd.read_clipboard()
(avec la valeur par défaut‘s+’
)? Le premier besoin d' au moins 2 caractères blancs, ce qui peut causer des problèmes s'il y a seulement 1 (par exemple , voir par exemple dans le de » @JohnE la réponse ).pd.read_clipboard()
, quand ce sont des espaces, je faispd.read_clipboard(sep='\s+{2,}', engine='python')
:: PComment créer des exemples de jeux de données
Il s'agit principalement d'étendre la réponse de @ AndyHayden en fournissant des exemples de la façon dont vous pouvez créer des exemples de trames de données. Les pandas et (en particulier) numpy vous offrent une variété d'outils pour cela, de sorte que vous pouvez généralement créer un fac-similé raisonnable de tout ensemble de données réel avec seulement quelques lignes de code.
Après avoir importé numpy et pandas, assurez-vous de fournir une graine aléatoire si vous voulez que les gens puissent reproduire exactement vos données et résultats.
Un exemple d'évier de cuisine
Voici un exemple montrant une variété de choses que vous pouvez faire. Toutes sortes d'exemples de trames de données utiles pourraient être créées à partir d'un sous-ensemble de ceci:
Cela produit:
Quelques notes:
np.repeat
etnp.tile
(colonnesd
ete
) sont très utiles pour créer des groupes et des indices de manière très régulière. Pour 2 colonnes, cela peut être utilisé pour dupliquer facilement les rexpand.grid()
mais est également plus flexible dans la capacité à fournir un sous-ensemble de toutes les permutations. Cependant, pour 3 colonnes ou plus, la syntaxe devient rapidement compliquée.expand.grid()
voir laitertools
solution dans le livre de recettes pandas ou lanp.meshgrid
solution présentée ici . Ceux-ci permettront un nombre illimité de dimensions.np.random.choice
. Par exemple, dans la colonneg
, nous avons une sélection aléatoire de 6 dates à partir de 2011. De plus, en définissant,replace=False
nous pouvons garantir que ces dates sont uniques - très pratique si nous voulons l'utiliser comme un index avec des valeurs uniques.Fausse donnée boursière
En plus de prendre des sous-ensembles du code ci-dessus, vous pouvez combiner davantage les techniques pour faire à peu près n'importe quoi. Par exemple, voici un court exemple qui combine
np.tile
etdate_range
crée des exemples de données de ticker pour 4 actions couvrant les mêmes dates:Nous avons maintenant un exemple de jeu de données avec 100 lignes (25 dates par ticker), mais nous n'avons utilisé que 4 lignes pour le faire, ce qui permet à tout le monde de reproduire facilement sans copier ni coller 100 lignes de code. Vous pouvez ensuite afficher des sous-ensembles de données si cela aide à expliquer votre question:
la source
expand.grid()
qui est incluse dans le livre de cuisine pandas , vous pouvez également l'inclure dans votre réponse. Votre réponse montre comment créer des ensembles de données plus complexes que ce que maexpand_grid()
fonction pourrait gérer, ce qui est formidable.Journal d'un répondeur
Mon meilleur conseil pour poser des questions serait de jouer sur la psychologie des personnes qui répondent aux questions. Étant une de ces personnes, je peux expliquer pourquoi je réponds à certaines questions et pourquoi je ne réponds pas à d'autres.
Les motivations
Je suis motivé pour répondre aux questions pour plusieurs raisons
Toutes mes intentions les plus pures sont grandes et toutes, mais j'obtiens cette satisfaction si je réponds à 1 question ou 30. Ce qui motive mes choix pour les questions auxquelles répondre a une énorme composante de maximisation des points.
Je vais également passer du temps sur des problèmes intéressants, mais cela est rare et n'aide pas un demandeur qui a besoin d'une solution à une question non intéressante. Votre meilleur pari pour me faire répondre à une question est de servir cette question sur un plateau mûr pour que je puisse y répondre avec le moins d'effort possible. Si je regarde deux questions et que l'une a du code, je peux copier-coller pour créer toutes les variables dont j'ai besoin ... Je prends celle-là! Je reviendrai sur l'autre si j'ai le temps, peut-être.
Conseil principal
Facilitez la tâche aux personnes qui répondent aux questions.
Votre réputation est plus que votre réputation.
J'aime les points (je l'ai mentionné ci-dessus). Mais ces points ne sont pas vraiment ma réputation. Ma vraie réputation est un amalgame de ce que les autres sur le site pensent de moi. Je m'efforce d'être juste et honnête et j'espère que les autres pourront le voir. Ce que cela signifie pour un demandeur, nous nous souvenons des comportements des demandeurs. Si vous ne sélectionnez pas de réponses et votez pour de bonnes réponses, je m'en souviens. Si vous vous comportez d'une manière que je n'aime pas ou d'une manière que j'aime, je m'en souviens. Cela joue également dans les questions auxquelles je répondrai.
Quoi qu'il en soit, je peux probablement continuer, mais je vous épargnerai tous ceux qui ont lu ceci.
la source
Le défi L'un des aspects les plus difficiles de la réponse aux questions de SO est le temps nécessaire pour recréer le problème (y compris les données). Les questions qui n'ont pas de moyen clair de reproduire les données ont moins de chances de trouver une réponse. Étant donné que vous prenez le temps d'écrire une question et que vous souhaitez résoudre un problème, vous pouvez facilement vous aider en fournissant des données que d'autres pourront ensuite utiliser pour vous aider à résoudre votre problème.
Les instructions fournies par @Andy pour écrire de bonnes questions Pandas sont un excellent point de départ. Pour plus d'informations, reportez-vous à la façon de demander et comment créer des exemples Minimal, Complete et Verifiable .
Veuillez énoncer clairement votre question dès le départ. Après avoir pris le temps d'écrire votre question et tout exemple de code, essayez de le lire et de fournir un «résumé» à votre lecteur qui résume le problème et énonce clairement la question.
Question d'origine :
En fonction de la quantité de données, des exemples de code et des piles d'erreurs fournis, le lecteur doit parcourir un long chemin avant de comprendre le problème. Essayez de reformuler votre question afin que la question elle-même soit en haut, puis fournissez les détails nécessaires.
Question révisée :
FOURNIR DES EXEMPLES DE DONNÉES SI NÉCESSAIRE !!!
Parfois, seule la tête ou la queue du DataFrame suffit. Vous pouvez également utiliser les méthodes proposées par @JohnE pour créer de plus grands ensembles de données qui peuvent être reproduits par d'autres. En utilisant son exemple pour générer un DataFrame de 100 lignes de cours des actions:
S'il s'agissait de vos données réelles, vous souhaiterez peut-être simplement inclure la tête et / ou la queue de la trame de données comme suit (veillez à anonymiser toutes les données sensibles):
Vous pouvez également vouloir fournir une description du DataFrame (en utilisant uniquement les colonnes pertinentes). Cela permet aux autres de vérifier plus facilement les types de données de chaque colonne et d'identifier d'autres erreurs courantes (par exemple, les dates sous forme de chaîne par rapport à datetime64 par rapport à l'objet):
REMARQUE: si votre DataFrame a un MultiIndex:
Si votre DataFrame a un multiindex, vous devez d'abord réinitialiser avant d'appeler
to_dict
. Vous devez ensuite recréer l'index en utilisantset_index
:la source
Voici ma version de
dput
- l'outil R standard pour produire des rapports reproductibles - pour PandasDataFrame
s. Il échouera probablement pour des trames plus complexes, mais il semble faire l'affaire dans des cas simples:maintenant,
Notez que cela produit une sortie beaucoup plus détaillée que
DataFrame.to_dict
, par exemple,contre
pour
du
ci-dessus, mais il conserve les types de colonnes . Par exemple, dans le cas de test ci-dessus,car
du.dtypes
estuint8
etpd.DataFrame(du.to_dict()).dtypes
estint64
.la source
to_dict
du.equals(eval(dput(df)))
.