Setelah menghabiskan banyak waktu menonton keduanya r dan pandatag pada SO, kesan yang saya dapatkan adalah bahwa pandas
pertanyaan cenderung mengandung data yang dapat direproduksi. Ini adalah sesuatu yang mendorong komunitas R cukup baik, dan berkat panduan seperti ini , pendatang baru dapat memperoleh bantuan untuk mengumpulkan contoh-contoh ini. Orang-orang yang dapat membaca panduan ini dan kembali dengan data yang dapat direproduksi akan lebih beruntung mendapatkan jawaban atas pertanyaan mereka.
Bagaimana kita bisa membuat contoh yang dapat direproduksi untuk pandas
pertanyaan? Kerangka data sederhana dapat disatukan, misalnya:
import pandas as pd
df = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice'],
'income': [40000, 50000, 42000]})
Tetapi banyak contoh dataset membutuhkan struktur yang lebih rumit, misalnya:
datetime
indeks atau data- Beberapa variabel kategori (adakah yang setara dengan
expand.grid()
fungsi R , yang menghasilkan semua kemungkinan kombinasi dari beberapa variabel yang diberikan?) - Data MultiIndex atau Panel
Untuk kumpulan data yang sulit untuk dipermainkan menggunakan beberapa baris kode, adakah yang setara dengan R dput()
yang memungkinkan Anda menghasilkan kode yang dapat di-tempel untuk meregenerasi struktur data Anda?
df.head(N).to_dict()
, di manaN
beberapa angka yang masuk akal adalah cara yang baik untuk pergi. Bonus +1 untuk menambahkan jeda baris cantik pada output. Untuk cap waktu, Anda biasanya hanya perlu menambahkanfrom pandas import Timestamp
ke bagian atas kode.Jawaban:
Catatan: Ide-ide di sini cukup umum untuk Stack Overflow, memang pertanyaan .
Penafian: Menulis pertanyaan yang bagus adalah KERAS.
Yang baik:
jangan menyertakan * contoh kecil DataFrame, baik sebagai kode runnable:
atau menjadikannya "salin dan tempel" menggunakan
pd.read_clipboard(sep='\s\s+')
, Anda dapat memformat teks untuk sorot Stack Overflow dan menggunakan Ctrl+ K(atau tambahkan empat spasi untuk setiap baris), atau tempatkan tiga tildes di atas dan di bawah kode Anda dengan kode Anda tanpa indentasi:uji
pd.read_clipboard(sep='\s\s+')
dirimu.* Saya benar-benar kecil , sebagian besar contoh DataFrames bisa kurang dari 6 baris kutipan , dan saya yakin saya bisa melakukannya dalam 5 baris. Bisakah Anda mereproduksi kesalahan dengan
df = df.head()
, jika tidak bermain-main untuk melihat apakah Anda bisa membuat DataFrame kecil yang menunjukkan masalah yang Anda hadapi.* Setiap aturan memiliki pengecualian, satu yang jelas adalah untuk masalah kinerja ( dalam hal ini pasti menggunakan% timeit dan mungkin% prun ), di mana Anda harus menghasilkan (mempertimbangkan menggunakan np.random.seed sehingga kita memiliki frame yang sama persis):
df = pd.DataFrame(np.random.randn(100000000, 10))
. Mengatakan itu, "buatkan kode ini cepat untukku" tidak sepenuhnya pada topik untuk situs ...tuliskan hasil yang Anda inginkan (mirip dengan di atas)
Jelaskan dari mana angka-angka itu berasal: angka 5 adalah jumlah dari kolom B untuk baris di mana A adalah 1.
jangan tunjukkan kode yang telah Anda coba:
Tapi katakan apa yang salah: kolom A ada di indeks daripada kolom.
jangan tunjukkan bahwa Anda telah melakukan riset ( cari dokumen , cari StackOverflow ), berikan ringkasan:
Selain: jawabannya di sini adalah untuk digunakan
df.groupby('A', as_index=False).sum()
.jika relevan bahwa Anda memiliki kolom Timestamp, misalnya Anda melakukan resampling atau semacamnya, maka jelaskan dan terapkan
pd.to_datetime
padanya untuk ukuran yang baik **.** Terkadang ini masalahnya sendiri: mereka adalah dawai.
Keburukan:
jangan menyertakan MultiIndex, yang tidak dapat kami salin dan tempel (lihat di atas), ini semacam keluhan dengan tampilan default panda tetapi tetap saja mengganggu:
Cara yang benar adalah dengan memasukkan DataFrame biasa dengan
set_index
panggilan:berikan wawasan tentang apa itu ketika memberikan hasil yang Anda inginkan:
Jelaskan secara spesifik bagaimana Anda mendapatkan angka (berapa jumlahnya) ... periksa apakah benar.
Jika kode Anda menimbulkan kesalahan, sertakan seluruh jejak tumpukan (ini dapat diedit nanti jika terlalu berisik). Tampilkan nomor baris (dan baris yang sesuai dengan kode Anda yang dibesarkan).
Jelek:
jangan menautkan ke csv yang tidak dapat kami akses (idealnya tidak terhubung ke sumber eksternal sama sekali ...)
Sebagian besar data adalah hak milik kami, dapatkan: Membuat data serupa dan melihat apakah Anda dapat mereproduksi masalah (sesuatu yang kecil).
jangan jelaskan situasinya secara samar dengan kata-kata, seperti Anda memiliki DataFrame yang "besar", sebutkan beberapa nama kolom secara sepintas (pastikan untuk tidak menyebutkan dtipnya). Cobalah dan masuk ke banyak detail tentang sesuatu yang sama sekali tidak berarti tanpa melihat konteks yang sebenarnya. Agaknya tidak ada yang akan membaca sampai akhir paragraf ini.
Esai itu buruk, lebih mudah dengan contoh-contoh kecil.
jangan sertakan 10+ (100+ ??) baris data munging sebelum sampai ke pertanyaan Anda yang sebenarnya.
Tolong, kita cukup melihat ini dalam pekerjaan sehari-hari kita. Kami ingin membantu, tapi tidak seperti ini ... .
Potong intro, dan cukup tunjukkan DataFrames yang relevan (atau versi kecil dari mereka) pada langkah yang menyebabkan Anda kesulitan.
Ngomong-ngomong, bersenang-senanglah belajar Python, NumPy, dan Panda!
sumber
pd.read_clipboard(sep='\s\s+')
tipnya. Ketika saya memposting pertanyaan SO yang membutuhkan dataframe khusus tetapi mudah dibagikan, seperti ini saya buat dalam excel, salin ke clipboard saya, lalu perintahkan SOers untuk melakukan hal yang sama. Menghemat banyak waktu!pd.read_clipboard(sep='\s\s+')
saran tampaknya tidak bekerja jika Anda menggunakan Python di server jauh, yang mana banyak set data yang besar hidup.pd.read_clipboard(sep='\s\s+')
, dan bukan yang lebih sederhanapd.read_clipboard()
(dengan default‘s+’
)? Yang pertama perlu minimal 2 spasi karakter, yang dapat menyebabkan masalah jika hanya ada 1 (misalnya melihat seperti di @JohnE 's jawaban ).pd.read_clipboard()
, ketika spasi, saya lakukanpd.read_clipboard(sep='\s+{2,}', engine='python')
:: PCara membuat dataset sampel
Ini terutama untuk memperluas jawaban @ AndyHayden dengan memberikan contoh bagaimana Anda bisa membuat kerangka data sampel. Panda dan (terutama) numpy memberi Anda berbagai alat untuk ini sehingga Anda umumnya dapat membuat faksimili yang wajar dari setiap dataset nyata hanya dengan beberapa baris kode.
Setelah mengimpor numpy dan panda, pastikan untuk memberikan benih acak jika Anda ingin orang-orang dapat mereproduksi data dan hasil Anda secara tepat.
Contoh wastafel dapur
Berikut ini contoh yang menunjukkan berbagai hal yang dapat Anda lakukan. Semua jenis kerangka data sampel yang berguna dapat dibuat dari subset ini:
Ini menghasilkan:
Beberapa catatan:
np.repeat
dannp.tile
(kolomd
dane
) sangat berguna untuk membuat grup dan indeks secara teratur. Untuk 2 kolom, ini dapat digunakan untuk dengan mudah menduplikasi r'sexpand.grid()
tetapi juga lebih fleksibel dalam kemampuan untuk memberikan subset dari semua permutasi. Namun, untuk 3 kolom atau lebih, sintaks dengan cepat menjadi berat.expand.grid()
lihatitertools
solusi di buku masak panda ataunp.meshgrid
solusi yang ditunjukkan di sini . Itu akan memungkinkan sejumlah dimensi.np.random.choice
. Misalnya, dalam kolomg
, kami memiliki 6 pilihan acak mulai dari 2011. Selain itu, dengan menetapkanreplace=False
kami dapat memastikan bahwa tanggal ini unik - sangat berguna jika kami ingin menggunakan ini sebagai indeks dengan nilai unik.Data pasar saham palsu
Selain mengambil himpunan bagian dari kode di atas, Anda dapat lebih lanjut menggabungkan teknik untuk melakukan apa saja. Misalnya, berikut adalah contoh singkat yang menggabungkan
np.tile
dandate_range
membuat sampel data ticker untuk 4 saham yang mencakup tanggal yang sama:Sekarang kami memiliki dataset dataset dengan 100 baris (25 tanggal per ticker), tetapi kami hanya menggunakan 4 baris untuk melakukannya, sehingga memudahkan semua orang untuk mereproduksi tanpa menyalin dan menempelkan 100 baris kode. Anda kemudian dapat menampilkan himpunan bagian dari data jika itu membantu menjelaskan pertanyaan Anda:
sumber
expand.grid()
yang termasuk dalam buku masak panda , Anda dapat memasukkannya dalam jawaban Anda juga. Jawaban Anda menunjukkan cara membuat set data yang lebih kompleks daripada yangexpand_grid()
bisa ditangani oleh fungsi saya , yang bagus.Diary of an Answerer
Saran terbaik saya untuk mengajukan pertanyaan adalah dengan bermain pada psikologi orang-orang yang menjawab pertanyaan. Menjadi salah satu dari orang-orang itu, saya dapat memberikan wawasan mengapa saya menjawab pertanyaan tertentu dan mengapa saya tidak menjawab orang lain.
Motivasi
Saya termotivasi untuk menjawab pertanyaan karena beberapa alasan
Semua niat saya yang paling bagus dan bagus, tapi saya mendapatkan kepuasan itu jika saya menjawab 1 pertanyaan atau 30. Apa yang mendorong pilihan saya untuk pertanyaan yang dijawab memiliki komponen besar pemaksimalan poin.
Saya juga akan menghabiskan waktu untuk masalah-masalah menarik tetapi itu sedikit dan jarang dan tidak membantu penanya yang membutuhkan solusi untuk pertanyaan yang tidak menarik. Taruhan terbaik Anda untuk membuat saya menjawab pertanyaan adalah melayani pertanyaan itu di atas piring agar saya bisa menjawabnya dengan upaya sesedikit mungkin. Jika saya melihat dua pertanyaan dan satu memiliki kode saya dapat menyalin tempel untuk membuat semua variabel yang saya butuhkan ... Saya mengambil satu itu! Saya akan kembali ke yang lain jika saya punya waktu, mungkin.
Nasihat Utama
Permudah orang-orang menjawab pertanyaan.
Reputasi Anda lebih dari sekadar reputasi Anda.
Saya suka poin (saya sebutkan di atas). Tetapi poin-poin itu tidak benar-benar reputasi saya. Reputasi saya yang sebenarnya adalah gabungan dari apa yang orang lain pikirkan tentang saya di situs. Saya berusaha untuk bersikap adil dan jujur dan saya berharap orang lain dapat melihatnya. Apa artinya itu bagi seorang penanya adalah, kita mengingat perilaku penanya. Jika Anda tidak memilih jawaban dan memilih jawaban yang baik, saya ingat. Jika Anda berperilaku dengan cara yang tidak saya sukai atau dengan cara yang saya sukai, saya ingat. Ini juga memainkan pertanyaan yang akan saya jawab.
Ngomong-ngomong, aku mungkin bisa melanjutkan, tapi aku akan mengampuni kalian yang benar-benar membaca ini.
sumber
Tantangan Salah satu aspek paling menantang dalam menjawab pertanyaan SO adalah waktu yang diperlukan untuk menciptakan kembali masalah (termasuk data). Pertanyaan yang tidak memiliki cara yang jelas untuk mereproduksi data cenderung tidak dijawab. Karena Anda meluangkan waktu untuk menulis pertanyaan dan Anda memiliki masalah yang ingin Anda bantu, Anda dapat dengan mudah membantu diri sendiri dengan memberikan data yang kemudian dapat digunakan orang lain untuk membantu menyelesaikan masalah Anda.
Instruksi yang diberikan oleh @Andy untuk menulis pertanyaan Pandas yang baik adalah tempat yang bagus untuk memulai. Untuk informasi lebih lanjut, lihat cara bertanya dan cara membuat contoh Minimal, Lengkap, dan dapat diverifikasi .
Harap jelaskan pertanyaan Anda di muka. Setelah meluangkan waktu untuk menulis pertanyaan Anda dan kode sampel apa pun, cobalah untuk membacanya dan memberikan 'Ringkasan Eksekutif' untuk pembaca Anda yang merangkum masalah dan dengan jelas menyatakan pertanyaan.
Pertanyaan asli :
Bergantung pada jumlah data, kode sampel, dan tumpukan kesalahan yang disediakan, pembaca harus melangkah jauh sebelum memahami apa masalahnya. Coba nyatakan kembali pertanyaan Anda sehingga pertanyaan itu sendiri ada di atas, dan kemudian berikan rincian yang diperlukan.
Pertanyaan yang Direvisi :
MEMBERIKAN DATA SAMPEL JIKA DIPERLUKAN !!!
Terkadang hanya kepala atau ekor dari DataFrame yang dibutuhkan. Anda juga dapat menggunakan metode yang diusulkan oleh @JohnE untuk membuat kumpulan data yang lebih besar yang dapat direproduksi oleh orang lain. Menggunakan contohnya untuk menghasilkan DataFrame 100 baris harga saham:
Jika ini adalah data aktual Anda, Anda mungkin hanya ingin menyertakan kepala dan / atau ujung kerangka data sebagai berikut (pastikan untuk menganonimkan data sensitif apa pun):
Anda mungkin juga ingin memberikan deskripsi tentang DataFrame (hanya menggunakan kolom yang relevan). Ini memudahkan orang lain untuk memeriksa tipe data setiap kolom dan mengidentifikasi kesalahan umum lainnya (misalnya tanggal sebagai string vs datetime64 vs objek):
CATATAN: Jika DataFrame Anda memiliki MultiIndex:
Jika DataFrame Anda memiliki multiindex, Anda harus mengatur ulang terlebih dahulu sebelum menelepon
to_dict
. Anda kemudian perlu membuat ulang indeks menggunakanset_index
:sumber
Ini adalah versi saya
dput
- alat R standar untuk menghasilkan laporan yang dapat direproduksi - untuk PandasDataFrame
s. Mungkin akan gagal untuk frame yang lebih kompleks, tetapi tampaknya melakukan pekerjaan dalam kasus sederhana:sekarang,
Perhatikan bahwa ini menghasilkan keluaran verbose yang jauh lebih banyak daripada
DataFrame.to_dict
, misalnya,vs.
untuk di
du
atas, tetapi mempertahankan jenis kolom . Misalnya, dalam kasus uji di atas,karena
du.dtypes
iniuint8
danpd.DataFrame(du.to_dict()).dtypes
ituint64
.sumber
to_dict
du.equals(eval(dput(df)))
,.