Nachdem ich eine anständige Zeit damit verbracht habe, beide zu beobachten r und PandasTags auf SO, der Eindruck, den ich bekomme, ist, dass pandas
Fragen weniger wahrscheinlich reproduzierbare Daten enthalten. Das ist etwas , dass die R - Gemeinschaft ziemlich gut über ermutigend war und dank Führer wie diese , Neulinge können etwas Hilfe auf die Zusammenstellung dieser Beispiele erhalten. Menschen, die diese Anleitungen lesen und mit reproduzierbaren Daten zurückkommen können, haben oft viel mehr Glück, Antworten auf ihre Fragen zu erhalten.
Wie können wir gute reproduzierbare Beispiele für pandas
Fragen erstellen ? Einfache Datenrahmen können zusammengestellt werden, z.
import pandas as pd
df = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice'],
'income': [40000, 50000, 42000]})
Viele Beispieldatensätze benötigen jedoch eine kompliziertere Struktur, z.
datetime
Indizes oder Daten- Mehrere kategoriale Variablen (gibt es ein Äquivalent zur
expand.grid()
Funktion von R , die alle möglichen Kombinationen einiger gegebener Variablen erzeugt?) - MultiIndex- oder Panel-Daten
Gibt es für Datensätze, die mit wenigen Codezeilen nur schwer zu verspotten sind, ein Äquivalent zu dput()
Rs, mit dem Sie kopierbaren Code generieren können, um Ihre Datenstruktur neu zu generieren?
df.head(N).to_dict()
, bei denenN
es sich um eine vernünftige Zahl handelt, ein guter Weg ist. Bonus + 1 für das Hinzufügen hübscher Zeilenumbrüche zur Ausgabe. Bei Zeitstempeln müssen Sie normalerweise nurfrom pandas import Timestamp
den Anfang des Codes hinzufügen .Antworten:
Hinweis: Die Ideen hier sind ziemlich allgemein für den Stapelüberlauf, in der Tat Fragen .
Haftungsausschluss: Eine gute Frage zu schreiben ist SCHWER.
Die gute:
Fügen Sie einen kleinen * Beispiel-DataFrame hinzu, entweder als ausführbaren Code:
oder machen Sie es "kopieren und einfügen" mit
pd.read_clipboard(sep='\s\s+')
, Sie können den Text für die Stapelüberlauf-Hervorhebung formatieren und Ctrl+ verwenden K(oder jeder Zeile vier Leerzeichen voranstellen) oder drei Tildes über und unter Ihrem Code platzieren, wobei Ihr Code nicht eingerückt ist:Teste
pd.read_clipboard(sep='\s\s+')
dich selbst.* Ich meine wirklich klein , könnte die überwiegende Mehrheit von Beispiel Datenrahmen sein weniger als 6 Zeilen Bearbeiten , und ich wette , dass ich es in 5 Reihen tun. Können Sie den Fehler mit reproduzieren
df = df.head()
, wenn Sie nicht herumspielen, um zu sehen, ob Sie einen kleinen DataFrame erstellen können, der das Problem zeigt, mit dem Sie konfrontiert sind?* Jede Regel hat eine Ausnahme, die offensichtliche ist für Leistungsprobleme ( in diesem Fall verwenden Sie definitiv% timeit und möglicherweise% prun ), wo Sie generieren sollten (erwägen Sie die Verwendung von np.random.seed, damit wir genau den gleichen Frame haben) :
df = pd.DataFrame(np.random.randn(100000000, 10))
. Zu sagen, dass "diesen Code für mich schnell machen", ist für die Site nicht unbedingt ein Thema ...Schreiben Sie das gewünschte Ergebnis auf (ähnlich wie oben).
Erklären Sie, woher die Zahlen stammen: Die 5 ist die Summe der B-Spalte für die Zeilen, in denen A 1 ist.
Zeigen Sie den Code an, den Sie versucht haben:
Aber sagen Sie, was falsch ist: Die A-Spalte befindet sich im Index und nicht in einer Spalte.
Zeigen Sie, dass Sie einige Nachforschungen angestellt haben ( durchsuchen Sie die Dokumente , durchsuchen Sie StackOverflow ), und geben Sie eine Zusammenfassung:
Nebenbei: Die Antwort hier ist zu verwenden
df.groupby('A', as_index=False).sum()
.Wenn es relevant ist, dass Sie Zeitstempelspalten haben, z. B. wenn Sie ein Resampling durchführen oder so, dann seien Sie explizit und wenden Sie
pd.to_datetime
diese für ein gutes Maß an **.** Manchmal ist dies das Problem selbst: Es waren Zeichenfolgen.
Das Schlechte:
Fügen Sie keinen MultiIndex hinzu, den wir nicht kopieren und einfügen können (siehe oben). Dies ist eine Art Beschwerde mit der Standardanzeige von Pandas, aber dennoch ärgerlich:
Der richtige Weg ist, einen normalen DataFrame in einen
set_index
Aufruf aufzunehmen:Geben Sie einen Einblick in das, was es ist, wenn Sie das gewünschte Ergebnis erzielen:
Seien Sie genau darüber, wie Sie die Zahlen erhalten haben (was sind sie) ... überprüfen Sie noch einmal, ob sie korrekt sind.
Wenn Ihr Code einen Fehler auslöst, schließen Sie den gesamten Stack-Trace ein (dieser kann später bearbeitet werden, wenn er zu laut ist). Zeigen Sie die Zeilennummer (und die entsprechende Zeile Ihres Codes an, gegen die er ausgelöst wird).
Das hässliche:
Verlinken Sie nicht mit einer CSV, auf die wir keinen Zugriff haben (im Idealfall überhaupt nicht mit einer externen Quelle verknüpfen ...)
Die meisten Daten sind proprietär. Wir erhalten Folgendes: Machen Sie ähnliche Daten und prüfen Sie, ob Sie das Problem reproduzieren können (etwas Kleines).
Erklären Sie die Situation nicht vage in Worten, wie Sie einen DataFrame haben, der "groß" ist, und erwähnen Sie einige der Spaltennamen nebenbei (achten Sie darauf, ihre d-Typen nicht zu erwähnen). Versuchen Sie, auf viele Details einzugehen, die völlig bedeutungslos sind, ohne den tatsächlichen Kontext zu sehen. Vermutlich wird niemand bis zum Ende dieses Absatzes lesen.
Essays sind schlecht, mit kleinen Beispielen ist es einfacher.
Schließen Sie nicht mehr als 10 (100+ ??) Datenzeilen ein, bevor Sie zu Ihrer eigentlichen Frage gelangen.
Bitte, wir sehen genug davon in unseren Tagesjobs. Wir wollen helfen, aber nicht so ... .
Schneiden Sie das Intro aus und zeigen Sie nur die relevanten DataFrames (oder kleine Versionen davon) in dem Schritt an, der Ihnen Probleme bereitet.
Wie auch immer, viel Spaß beim Lernen von Python, NumPy und Pandas!
quelle
pd.read_clipboard(sep='\s\s+')
Tipp. Wenn ich SO-Fragen poste, die einen speziellen, aber leicht gemeinsam nutzbaren Datenrahmen benötigen, wie diesen, erstelle ich ihn in Excel, kopiere ihn in meine Zwischenablage und weise SOer an, dasselbe zu tun. Spart so viel Zeit!pd.read_clipboard(sep='\s\s+')
Vorschlag scheint nicht zu funktionieren, wenn Sie Python auf einem Remote-Server verwenden, auf dem viele große Datenmengen leben.pd.read_clipboard(sep='\s\s+')
und nicht einfacherpd.read_clipboard()
(mit der Standardeinstellung‘s+’
)? Die ersten benötigen mindestens 2 Leerzeichen, was zu Problemen führen kann, wenn nur 1 vorhanden ist (siehe z. B. in der Antwort von @JohnE ).pd.read_clipboard()
, wenn es Leerzeichen sind, mache ich ::pd.read_clipboard(sep='\s+{2,}', engine='python')
PSo erstellen Sie Beispieldatensätze
Dies dient hauptsächlich dazu, die Antwort von @ AndyHayden zu erweitern, indem Beispiele dafür bereitgestellt werden, wie Sie Beispieldatenrahmen erstellen können. Pandas und (insbesondere) Numpy bieten Ihnen hierfür eine Vielzahl von Tools, mit denen Sie im Allgemeinen mit nur wenigen Codezeilen ein vernünftiges Faksimile eines realen Datensatzes erstellen können.
Stellen Sie nach dem Importieren von Numpy und Pandas sicher, dass Sie einen zufälligen Startwert angeben, wenn Sie möchten, dass die Benutzer Ihre Daten und Ergebnisse exakt reproduzieren können.
Ein Beispiel für ein Spülbecken
Hier ist ein Beispiel, das eine Vielzahl von Möglichkeiten zeigt. Aus einer Teilmenge davon können alle Arten nützlicher Beispieldatenrahmen erstellt werden:
Dies erzeugt:
Einige Notizen:
np.repeat
undnp.tile
(Spaltend
unde
) sind sehr nützlich, um Gruppen und Indizes auf sehr regelmäßige Weise zu erstellen. Für 2 Spalten kann dies verwendet werden, um Rs leicht zu duplizieren, istexpand.grid()
aber auch flexibler in der Fähigkeit, eine Teilmenge aller Permutationen bereitzustellen. Bei 3 oder mehr Spalten wird die Syntax jedoch schnell unhandlich.expand.grid()
siehe dieitertools
Lösung im Pandas-Kochbuch oder die hiernp.meshgrid
gezeigte Lösung . Diese erlauben eine beliebige Anzahl von Dimensionen.np.random.choice
. In der Spalteg
haben wir beispielsweise eine zufällige Auswahl von 6 Daten aus dem Jahr 2011. Außerdem könnenreplace=False
wir durch Festlegen sicherstellen, dass diese Daten eindeutig sind - sehr praktisch, wenn wir dies als Index mit eindeutigen Werten verwenden möchten.Gefälschte Börsendaten
Zusätzlich zur Verwendung von Teilmengen des obigen Codes können Sie die Techniken weiter kombinieren, um so gut wie alles zu tun. Im Folgenden finden Sie ein kurzes Beispiel, in dem Beispiel-Ticker-Daten für 4 Aktien mit denselben Daten kombiniert
np.tile
unddate_range
erstellt werden:Jetzt haben wir einen Beispieldatensatz mit 100 Zeilen (25 Daten pro Ticker), aber wir haben nur 4 Zeilen verwendet, damit alle anderen problemlos reproduzieren können, ohne 100 Codezeilen kopieren und einfügen zu müssen. Sie können dann Teilmengen der Daten anzeigen, wenn dies zur Erläuterung Ihrer Frage beiträgt:
quelle
expand.grid()
, die im Pandas-Kochbuch enthalten ist. Sie können dies auch in Ihre Antwort aufnehmen. Ihre Antwort zeigt, wie Sie komplexere Datensätze erstellen können, als meineexpand_grid()
Funktion verarbeiten kann. Das ist großartig.Tagebuch eines Antwortenden
Mein bester Rat, um Fragen zu stellen, wäre, mit der Psychologie der Menschen zu spielen, die Fragen beantworten. Als einer dieser Menschen kann ich einen Einblick geben, warum ich bestimmte Fragen beantworte und warum ich andere nicht beantworte.
Motivationen
Ich bin aus mehreren Gründen motiviert, Fragen zu beantworten
Alle meine reinsten Absichten sind großartig und alle, aber ich bekomme diese Befriedigung, wenn ich 1 oder 30 Fragen beantworte . Was meine Auswahl für die zu beantwortenden Fragen antreibt , hat einen großen Anteil an der Punktmaximierung.
Ich werde auch Zeit mit interessanten Problemen verbringen, aber das ist selten und hilft einem Fragesteller nicht, der eine Lösung für eine nicht interessante Frage benötigt. Ihre beste Wette, um mich zur Beantwortung einer Frage zu bewegen, besteht darin, diese Frage auf einer Platte zu servieren, die reif ist, damit ich sie mit so wenig Aufwand wie möglich beantworten kann. Wenn ich mir zwei Fragen ansehe und eine Code enthält, kann ich sie kopieren und einfügen, um alle benötigten Variablen zu erstellen ... Ich nehme diese! Ich werde vielleicht zu dem anderen zurückkehren, wenn ich Zeit habe.
Hauptratschlag
Machen Sie es den Leuten, die Fragen beantworten, einfach.
Ihr Ruf ist mehr als nur Ihr Ruf.
Ich mag Punkte (das habe ich oben erwähnt). Aber diese Punkte sind nicht wirklich mein Ruf. Mein wirklicher Ruf ist eine Verschmelzung dessen, was andere auf der Website über mich denken. Ich bemühe mich, fair und ehrlich zu sein, und ich hoffe, dass andere das sehen können. Für einen Fragesteller bedeutet dies, dass wir uns an das Verhalten der Fragesteller erinnern. Wenn Sie keine Antworten auswählen und gute Antworten positiv bewerten, erinnere ich mich. Wenn Sie sich so verhalten, wie ich es nicht mag oder wie ich es mag, erinnere ich mich. Dies spielt auch eine Rolle, auf welche Fragen ich antworten werde.
Wie auch immer, ich kann wahrscheinlich weitermachen, aber ich werde alle von Ihnen verschonen, die dies tatsächlich lesen.
quelle
Die Herausforderung Einer der schwierigsten Aspekte bei der Beantwortung von SO-Fragen ist die Zeit, die zum erneuten Erstellen des Problems (einschließlich der Daten) benötigt wird. Fragen, bei denen die Daten nicht eindeutig reproduziert werden können, werden mit geringerer Wahrscheinlichkeit beantwortet. Da Sie sich die Zeit nehmen, eine Frage zu schreiben, und ein Problem haben, bei dem Sie Hilfe benötigen, können Sie sich leicht selbst helfen, indem Sie Daten bereitstellen, die andere zur Lösung Ihres Problems verwenden können.
Die Anweisungen von @Andy zum Schreiben guter Pandas-Fragen sind ein ausgezeichneter Ausgangspunkt. Weitere Informationen finden Sie unter Fragen und Erstellen von minimalen, vollständigen und überprüfbaren Beispielen .
Bitte geben Sie Ihre Frage im Voraus klar an. Nachdem Sie sich die Zeit genommen haben, Ihre Frage und einen Beispielcode zu schreiben, versuchen Sie, diese zu lesen und Ihrem Leser eine Zusammenfassung zu geben, in der das Problem zusammengefasst und die Frage klar angegeben wird.
Ursprüngliche Frage :
Abhängig von der Datenmenge, dem Beispielcode und den bereitgestellten Fehlerstapeln muss der Leser einen langen Weg zurücklegen, bevor er das Problem versteht. Versuchen Sie, Ihre Frage so zu wiederholen, dass die Frage selbst oben steht, und geben Sie dann die erforderlichen Details an.
Überarbeitete Frage :
MACHEN SIE BEISPIELDATEN BEISPIEL !!!
Manchmal reicht nur der Kopf oder das Ende des DataFrame aus. Sie können auch die von @JohnE vorgeschlagenen Methoden verwenden, um größere Datensätze zu erstellen, die von anderen reproduziert werden können. Verwenden Sie sein Beispiel, um einen 100-Zeilen-DataFrame mit Aktienkursen zu generieren:
Wenn dies Ihre tatsächlichen Daten waren, möchten Sie möglicherweise nur den Kopf und / oder das Ende des Datenrahmens wie folgt angeben (stellen Sie sicher, dass Sie alle vertraulichen Daten anonymisieren):
Möglicherweise möchten Sie auch eine Beschreibung des DataFrame bereitstellen (wobei nur die entsprechenden Spalten verwendet werden). Dies erleichtert es anderen, die Datentypen jeder Spalte zu überprüfen und andere häufige Fehler zu identifizieren (z. B. Datumsangaben als Zeichenfolge vs. Datum / Uhrzeit64 vs. Objekt):
HINWEIS: Wenn Ihr DataFrame über einen MultiIndex verfügt:
Wenn Ihr DataFrame über einen Multiindex verfügt, müssen Sie vor dem Aufruf zunächst einen Reset durchführen
to_dict
. Anschließend müssen Sie den Index neu erstellen mitset_index
:quelle
Hier ist meine Version von
dput
- dem Standard-R-Tool zur Erstellung reproduzierbarer Berichte - für PandasDataFrame
. Bei komplexeren Frames wird es wahrscheinlich fehlschlagen, aber es scheint in einfachen Fällen die Aufgabe zu erfüllen:jetzt,
Beachten Sie, dass dies eine viel ausführlichere Ausgabe erzeugt als
DataFrame.to_dict
z.vs.
für
du
oben, aber es behält Spaltentypen bei . ZB im obigen Testfallweil
du.dtypes
istuint8
undpd.DataFrame(du.to_dict()).dtypes
istint64
.quelle
to_dict
du.equals(eval(dput(df)))
.