Sporo czasu spędziłem na oglądaniu obu r i pandytagi na SO, mam wrażenie, że pandas
pytania zawierają mniej powtarzalnych danych. To jest coś, że społeczność R była dobra ładna o zachęcanie, a dzięki przewodników jak to nowicjusze są w stanie uzyskać jakąś pomoc na łącząc te przykłady. Ludzie, którzy są w stanie przeczytać te przewodniki i powrócić z powtarzalnymi danymi, często będą mieli znacznie więcej szczęścia, otrzymując odpowiedzi na swoje pytania.
Jak możemy stworzyć dobre, powtarzalne przykłady pandas
pytań? Proste ramki danych można łączyć, np .:
import pandas as pd
df = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice'],
'income': [40000, 50000, 42000]})
Jednak wiele przykładowych zestawów danych wymaga bardziej skomplikowanej struktury, np .:
datetime
indeksy lub dane- Wiele zmiennych kategorialnych (czy istnieje odpowiednik
expand.grid()
funkcji R , która tworzy wszystkie możliwe kombinacje niektórych danych zmiennych?) - Dane MultiIndex lub Panel
W przypadku zestawów danych, które trudno wyszydzić za pomocą kilku wierszy kodu, czy istnieje odpowiednik R, dput()
który pozwala wygenerować kod do wklejenia w celu odtworzenia struktury danych?
df.head(N).to_dict()
, gdzieN
jest rozsądna liczba, jest dobrym sposobem. Bonus + 1 za dodanie ładnych podziałów linii do wyjścia. W przypadku znaczników czasu zazwyczaj wystarczy dodaćfrom pandas import Timestamp
na górze kodu.Odpowiedzi:
Uwaga: Pomysły tutaj są dość ogólne w przypadku przepełnienia stosu, a nawet pytania .
Uwaga: pisanie dobrego pytania jest trudne.
Dobry:
dołącz małe * przykładowe DataFrame, jako kod uruchamialny:
lub
pd.read_clipboard(sep='\s\s+')
możesz go „kopiować i wklejać” za pomocą , możesz sformatować tekst dla podświetlenia przepełnienia stosu i użyć Ctrl+ K(lub wstawić cztery spacje do każdej linii), lub umieścić trzy tyldy nad i pod kodem bez kodu:sprawdź
pd.read_clipboard(sep='\s\s+')
się.* Ja naprawdę mam na myśli małe , większość przykładowych DataFrames mogłaby być mniejsza niż 6 rzędów potrzebne źródło , a założę się, że mogę to zrobić w 5 rzędach. Czy możesz odtworzyć błąd za pomocą
df = df.head()
, jeśli nie majstrować, aby sprawdzić, czy możesz stworzyć małą ramkę DataFrame, która pokazuje napotkany problem.* Każda reguła ma wyjątek, oczywistym jest dla kwestii wydajności ( w tym przypadku na pewno użyć% timeit i ewentualnie% prun ), gdzie należy wygenerować (rozważyć użycie np.random.seed więc mamy dokładnie taką samą ramkę)
df = pd.DataFrame(np.random.randn(100000000, 10))
. Mówiąc, że „uczyń ten kod szybkim dla mnie” nie jest ściśle związane z tematem witryny ...napisz pożądany wynik (podobnie jak powyżej)
Wyjaśnij, skąd pochodzą liczby: 5 to suma kolumny B dla wierszy, w których A wynosi 1.
pokaż kod , który wypróbowałeś:
Ale powiedz, co jest niepoprawne: kolumna A jest w indeksie, a nie w kolumnie.
pokaż, że przeprowadziłeś badania ( przeszukaj dokumenty , wyszukaj StackOverflow ), podaj podsumowanie:
Na bok: odpowiedzią jest, aby użyć
df.groupby('A', as_index=False).sum()
.jeśli istotne jest, że masz kolumny sygnatury czasowej, np. próbujesz ponownie coś lub coś, to wyraź to i zastosuj
pd.to_datetime
je dla zachowania dokładności **.** Czasami jest to sam problem: były łańcuchami.
Źli:
nie dołączaj MultiIndexu, którego nie możemy skopiować i wkleić (patrz wyżej), jest to rodzaj skargi z domyślnym wyświetlaniem pand, ale irytujące:
Prawidłowym sposobem jest dołączenie zwykłego DataFrame do
set_index
wywołania:zapewniaj wgląd w to, co to jest, gdy dajesz pożądany wynik:
Sprecyzuj, w jaki sposób otrzymałeś liczby (jakie to są) ... dokładnie sprawdź, czy są poprawne.
Jeśli kod zgłasza błąd, dołącz cały ślad stosu (można go później edytować, jeśli jest zbyt głośny). Pokaż numer wiersza (i odpowiadający mu wiersz kodu, przeciwko któremu się podnosi).
Brzydki:
nie linkuj do pliku CSV, do którego nie mamy dostępu (najlepiej w ogóle nie linkuj do zewnętrznego źródła ...)
Wię kszość danych jest prawnie własna , otrzymujemy to: Twórz podobne dane i zobacz, czy możesz odtworzyć problem (mały).
nie wyjaśniaj niejasno sytuacji słowami, ponieważ masz ramkę DataFrame, która jest „duża”, podaj niektóre nazwy kolumn na marginesie (pamiętaj, aby nie wspominać o ich typach). Spróbuj zagłębić się w wiele szczegółów na temat czegoś, co jest całkowicie pozbawione znaczenia, nie widząc rzeczywistego kontekstu. Przypuszczalnie nikt nawet nie przeczyta do końca tego akapitu.
Eseje są złe, łatwiej jest z małymi przykładami.
nie dołączaj ponad 10 linii (100+ ??) linii danych przed przejściem do rzeczywistego pytania.
Widzimy to dość w naszych codziennych zadaniach. Chcemy pomóc, ale nie tak ... .
Wytnij wprowadzenie i po prostu pokaż odpowiednie ramki danych (lub ich małe wersje) w kroku, który powoduje problemy.
W każdym razie, baw się dobrze, ucząc się języka Python, NumPy i Pand!
źródło
pd.read_clipboard(sep='\s\s+')
wskazówkę. Kiedy zamieszczam pytania SO, które wymagają specjalnej, ale łatwo udostępnianej ramki danych, takiej jak ta , buduję ją w programie Excel, kopiuję ją do mojego schowka, a następnie polecam SOers zrobić to samo. Oszczędza tyle czasu!pd.read_clipboard(sep='\s\s+')
sugestia nie wydaje się działać, jeśli używasz Python na zdalnym serwerze, czyli tam, gdzie wiele dużych zbiorów danych żyć.pd.read_clipboard(sep='\s\s+')
nie jest to prostszepd.read_clipboard()
(z domyślnymi‘s+’
)? Pierwsza potrzeba co najmniej 2 białych znaków, które mogą powodować problemy, jeśli jest tylko 1 (patrz np taki w @JohnE „s odpowiedzi ).pd.read_clipboard()
, kiedy są spacjami, robiępd.read_clipboard(sep='\s+{2,}', engine='python')
:: PJak utworzyć przykładowe zestawy danych
Ma to na celu przede wszystkim rozwinięcie odpowiedzi @ AndyHayden, podając przykłady tworzenia przykładowych ramek danych. Pandy i (zwłaszcza) numpy zapewniają do tego różnorodność narzędzi, dzięki czemu można generalnie stworzyć rozsądny telefaks dowolnego prawdziwego zestawu danych za pomocą zaledwie kilku wierszy kodu.
Po zaimportowaniu numpy i pand, pamiętaj, aby podać losowy materiał siewny, jeśli chcesz, aby ludzie mogli dokładnie odtworzyć twoje dane i wyniki.
Przykład zlewu kuchennego
Oto przykład pokazujący różne rzeczy, które możesz zrobić. Na podstawie tego podzbioru można utworzyć wszelkiego rodzaju przydatne przykładowe ramki danych:
Daje to:
Niektóre uwagi:
np.repeat
oraznp.tile
(kolumnyd
ie
) są bardzo przydatne do tworzenia grup i indeksów w bardzo regularny sposób. W przypadku 2 kolumn można to wykorzystać do łatwego powielania r,expand.grid()
ale jest również bardziej elastyczny w zakresie możliwości zapewnienia podzbioru wszystkich permutacji. Jednak w przypadku 3 lub więcej kolumn składnia szybko staje się nieporęczna.expand.grid()
zobaczitertools
rozwiązanie w książce kucharskiej pand lubnp.meshgrid
rozwiązanie pokazane tutaj . Pozwolą one na dowolną liczbę wymiarów.np.random.choice
. Na przykład w kolumnieg
mamy losowy wybór 6 dat z 2011 roku. Dodatkowo, ustawiającreplace=False
możemy zapewnić, że te daty są unikalne - bardzo przydatne, jeśli chcemy użyć tego jako indeksu o unikalnych wartościach.Fałszywe dane giełdowe
Oprócz przejmowania podzbiorów powyższego kodu, możesz dalej łączyć techniki, aby zrobić wszystko. Na przykład, oto krótki przykład, który łączy
np.tile
idate_range
tworzy przykładowe dane giełdowe dla 4 akcji obejmujących te same daty:Teraz mamy przykładowy zestaw danych zawierający 100 wierszy (25 dat na ticker), ale wykorzystaliśmy tylko 4 wiersze, aby ułatwić reprodukcję bez kopiowania i wklejania 100 wierszy kodu. Następnie możesz wyświetlić podzbiory danych, jeśli pomoże to wyjaśnić pytanie:
źródło
expand.grid()
która jest zawarta w książce kucharskiej pandy , możesz to również uwzględnić w swojej odpowiedzi. Twoja odpowiedź pokazuje, jak tworzyć bardziej złożone zestawy danych, niż mojaexpand_grid()
funkcja mogłaby obsłużyć, co jest świetne.Dziennik odpowiedzi
Moją najlepszą radą przy zadawaniu pytań byłoby rozważenie psychologii ludzi, którzy odpowiadają na pytania. Będąc jedną z tych osób, mogę wgląd w to, dlaczego odpowiadam na niektóre pytania i dlaczego nie odpowiadam innym.
Motywacje
Mam motywację do odpowiedzi na pytania z kilku powodów
Wszystkie moje najczystsze intencje są świetne i wszystkie, ale czerpię satysfakcję, jeśli odpowiem na 1 pytanie lub 30. To, co napędza moje wybory, na które pytania należy odpowiedzieć, ma ogromny wpływ na maksymalizację punktów.
Spędzę też czas na interesujących problemach, ale jest ich niewiele i nie pomaga i pytający nie potrzebuje rozwiązania nieciekawego pytania. Najlepszym rozwiązaniem, aby zmusić mnie do udzielenia odpowiedzi na pytanie, jest podanie tego pytania na półmisku gotowym do udzielenia odpowiedzi przy jak najmniejszym wysiłku. Jeśli patrzę na dwa pytania i jedno ma kod, mogę skopiować wklej, aby utworzyć wszystkie zmienne, których potrzebuję ... Biorę to! Może wrócę do drugiego, jeśli będę miał czas.
Główne porady
Ułatw ludziom odpowiadanie na pytania.
Twoja reputacja jest czymś więcej niż tylko reputacją.
Lubię punkty (wspomniałem o tym powyżej). Ale te punkty nie są tak naprawdę moją reputacją. Moja prawdziwa reputacja jest połączeniem tego, co myślą o mnie inni na stronie. Staram się być uczciwy i szczery i mam nadzieję, że inni to zobaczą. Dla pytającego oznacza to, że pamiętamy jego zachowanie. Jeśli nie wybierzesz odpowiedzi i nie ocenisz dobrych odpowiedzi, pamiętam. Jeśli zachowujesz się w sposób, który mi się nie podoba lub w sposób, który lubię, pamiętam. To także odgrywa rolę, na którą odpowiem na pytania.
W każdym razie pewnie mogę kontynuować, ale oszczędzę wam wszystkich, którzy to przeczytali.
źródło
Wyzwanie Jednym z najtrudniejszych aspektów odpowiedzi na pytania SO jest czas potrzebny do odtworzenia problemu (w tym danych). Odpowiedzi na pytania, które nie mają jasnego sposobu na odtworzenie danych, są mniej prawdopodobne. Biorąc pod uwagę, że poświęcasz czas na napisanie pytania i masz problem, z którym chciałbyś pomóc, możesz łatwo pomóc sobie, dostarczając dane, które inni mogą następnie wykorzystać, aby rozwiązać problem.
Instrukcje dostarczone przez @Andy dotyczące pisania dobrych pytań dotyczących pand są doskonałym miejscem na rozpoczęcie. Aby uzyskać więcej informacji, zapoznaj się z pytaniem i jak tworzyć przykłady minimalne, kompletne i weryfikowalne .
Proszę jasno podać swoje pytanie z góry. Po poświęceniu czasu na napisanie pytania i kodu przykładowego postaraj się je przeczytać i dostarczyć czytelnikowi „Streszczenie”, które podsumowuje problem i jasno określa pytanie.
Oryginalne pytanie :
W zależności od ilości danych, przykładowego kodu i stosów błędów, czytnik musi przejść długą drogę, zanim zrozumie, na czym polega problem. Spróbuj ponownie sformułować pytanie, aby samo pytanie było na górze, a następnie podaj niezbędne szczegóły.
Zmienione pytanie :
PODAJ PRZYKŁADOWE DANE, JEŚLI POTRZEBUJESZ !!!
Czasami wystarczy tylko głowa lub ogon DataFrame. Możesz także użyć metod zaproponowanych przez @JohnE, aby utworzyć większe zbiory danych, które mogą być powielane przez innych. Korzystając z tego przykładu, wygenerował 100-ramkowy DataFrame cen akcji:
Jeśli były to twoje rzeczywiste dane, możesz po prostu zamieścić nagłówek i / lub ogon ramki danych w następujący sposób (pamiętaj o anonimizacji poufnych danych):
Możesz także podać opis DataFrame (używając tylko odpowiednich kolumn). Ułatwia to innym sprawdzanie typów danych w każdej kolumnie i identyfikowanie innych typowych błędów (np. Daty jako ciąg vs. datetime64 vs. obiekt):
UWAGA: Jeśli twoja ramka danych ma MultiIndex:
Jeśli twoja DataFrame ma multiindeks, musisz najpierw zresetować przed wywołaniem
to_dict
. Następnie musisz ponownie utworzyć indeks, używającset_index
:źródło
Oto moja wersja
dput
- standardowego narzędzia R do generowania powtarzalnych raportów - dla PandasDataFrame
. Prawdopodobnie nie powiedzie się w przypadku bardziej złożonych ramek, ale wydaje się, że wykonuje to zadanie w prostych przypadkach:teraz,
Zauważ, że daje to dużo więcej informacji wyjściowych niż
DataFrame.to_dict
np.vs
do
du
powyżej, ale zachowuje typy kolumn . Np. W powyższym przypadku testowymponieważ
du.dtypes
jestuint8
ipd.DataFrame(du.to_dict()).dtypes
jestint64
.źródło
to_dict
du.equals(eval(dput(df)))
.