Потратив приличное количество времени на просмотр обоих р и пандтеги на SO, создается впечатление, что pandas
вопросы с меньшей вероятностью содержат воспроизводимые данные. Это то , что R сообщество было очень хорошо о поощрении, и благодаря руководству , как это , новички могут получить некоторую помощь в составлении этих примеров. Людям, которые могут прочитать эти руководства и вернуться с воспроизводимыми данными, часто будет гораздо лучше получить ответы на свои вопросы.
Как мы можем создать хорошие воспроизводимые примеры для pandas
вопросов? Простые кадры данных могут быть собраны вместе, например:
import pandas as pd
df = pd.DataFrame({'user': ['Bob', 'Jane', 'Alice'],
'income': [40000, 50000, 42000]})
Но многие примерные наборы данных нуждаются в более сложной структуре, например:
datetime
индексы или данные- Несколько категориальных переменных (есть ли эквивалент
expand.grid()
функции R , которая создает все возможные комбинации некоторых данных переменных?) - MultiIndex или Panel данные
Для наборов данных, которые трудно смоделировать с использованием нескольких строк кода, существует ли эквивалент R, dput()
который позволяет вам генерировать копируемый код для регенерации структуры данных?
df.head(N).to_dict()
, гдеN
есть какое-то разумное число, - хороший путь. Бонус +1 за добавление красивых разрывов строк к выводу. Для временных меток вам обычно просто нужно добавитьfrom pandas import Timestamp
в начало кода.Ответы:
Примечание: идеи здесь довольно общие для Stack Overflow, действительно, вопросы .
Отказ от ответственности: написать хороший вопрос трудно.
Хорошо:
включите небольшой * пример DataFrame, либо в качестве исполняемого кода:
или сделав его «копируемым и вставляемым» с помощью
pd.read_clipboard(sep='\s\s+')
, вы можете отформатировать текст для выделения переполнения стека и использовать Ctrl+ K(или добавьте четыре пробела к каждой строке), или поместите три тильды выше и ниже вашего кода с незапятнанным кодом:Проверь
pd.read_clipboard(sep='\s\s+')
себя.* Я действительно средний маленький , подавляющее большинство примеров DataFrames может быть меньше , чем 6 строк цитации , и я держал пари , что я могу сделать это в 5 рядов. Можете ли вы воспроизвести ошибку
df = df.head()
, если не возитесь, чтобы посмотреть, сможете ли вы создать небольшой DataFrame, который показывает проблему, с которой вы столкнулись.* Каждое правило имеет исключение, очевидно , один для проблем с производительностью ( в этом случае , безусловно , использовать% timeit и , возможно , % prun ), где вы должны генерировать (рассмотреть возможность использования np.random.seed поэтому у нас есть точно такой же кадр):
df = pd.DataFrame(np.random.randn(100000000, 10))
. Сказать, что «сделай этот код быстрым для меня» - это не совсем тема для сайта ...запишите желаемый результат (аналогично описанному выше)
Объясните, откуда взялись числа: 5 - сумма столбца B для строк, где A равно 1.
показать код, который вы пробовали:
Но скажите, что не так: столбец A находится в индексе, а не в столбце.
показать, что вы провели какое-то исследование ( поиск в документах , поиск в StackOverflow ), дать резюме:
В сторону: ответ здесь заключается в использовании
df.groupby('A', as_index=False).sum()
.если уместно, что у вас есть столбцы меток времени, например, вы производите повторную выборку или что-то в этом роде, тогда будьте явными и применяйте
pd.to_datetime
их для правильной оценки **** Иногда это сама проблема: они были строками.
Плохо:
не включайте MultiIndex, который мы не можем скопировать и вставить (см. выше), это своего рода жалоба с отображением панд по умолчанию, но, тем не менее, раздражает:
Правильный способ - включить обычный DataFrame с
set_index
вызовом:предоставьте понимание того, что это, когда даете желаемый результат:
Будьте конкретны о том, как вы получили цифры (каковы они) ... проверьте, что они верны.
Если ваш код выдает ошибку, включите всю трассировку стека (это можно отредактировать позже, если она будет слишком шумной). Покажите номер строки (и соответствующую строку вашего кода, против которой он поднимается).
Гадкий:
не ссылаться на CSV, к которому у нас нет доступа (в идеале вообще не ссылаться на внешний источник ...)
Большинство данных являются собственностью, и мы получаем следующее: составьте аналогичные данные и посмотрите, сможете ли вы воспроизвести проблему (что-то маленькое).
не объясняйте ситуацию смутно словами, например, у вас есть DataFrame, который является «большим», упомяните некоторые имена столбцов попутно (не забудьте упомянуть их dtypes). Постарайтесь подробно рассказать о чем-то, что совершенно бессмысленно, не видя реального контекста. Предположительно никто даже не собирается читать до конца этого параграфа.
Очерки плохие, легче с небольшими примерами.
не включайте более 10 (более 100) строк данных, прежде чем перейти к актуальному вопросу.
Пожалуйста, мы видим достаточно этого в нашей повседневной работе. Мы хотим помочь, но не так, как это ... .
Вырежьте вступление и просто покажите соответствующие фреймы данных (или их небольшие версии) на шаге, который вызывает у вас проблемы.
В любом случае, получайте удовольствие от изучения Python, NumPy и Pandas!
источник
pd.read_clipboard(sep='\s\s+')
чаевые. Когда я публикую SO вопросы, которые нуждаются в специальном, но легко распространяемом фрейме данных, как этот, я собираю его в Excel, копирую в буфер обмена, а затем приказываю SO делать то же самое. Экономит так много времени!pd.read_clipboard(sep='\s\s+')
предложение не работает, если вы используете Python на удаленном сервере, где находится множество больших наборов данных.pd.read_clipboard(sep='\s\s+')
и не прощеpd.read_clipboard()
(по умолчанию‘s+’
)? Первой необходимости , по крайней мере 2 пробельных символов, которые могут вызвать проблемы , если есть только один (например , см , например в @JohnE «s ответ ).pd.read_clipboard()
, когда они пробелы, я делаюpd.read_clipboard(sep='\s+{2,}', engine='python')
:: PКак создать образцы наборов данных
Это главным образом для того, чтобы расширить ответ @ AndyHayden, предоставив примеры того, как вы можете создавать образцы фреймов данных. Pandas и (особенно) numpy предоставляют вам множество инструментов для этого, так что вы обычно можете создать разумное факсимиле любого реального набора данных с помощью всего нескольких строк кода.
После импорта numpy и pandas обязательно предоставьте случайное начальное число, если вы хотите, чтобы люди могли точно воспроизводить ваши данные и результаты.
Пример кухонной раковины
Вот пример, показывающий множество вещей, которые вы можете сделать. Все виды полезных образцов данных могут быть созданы из подмножества этого:
Это производит:
Некоторые заметки:
np.repeat
иnp.tile
(столбцыd
иe
) очень полезны для регулярного создания групп и индексов. Для 2 столбцов это может быть использовано для простого дублирования r,expand.grid()
но также является более гибким в отношении возможности поднабора всех перестановок. Однако для 3 или более столбцов синтаксис быстро становится громоздким.expand.grid()
смотритеitertools
решение в поваренной книге панд илиnp.meshgrid
решение, показанное здесь . Те позволят любое количество измерений.np.random.choice
. Например, в столбцеg
у нас есть случайный выбор из 6 дат с 2011 года. Кроме того, установив,replace=False
мы можем гарантировать, что эти даты уникальны - очень удобно, если мы хотим использовать это как индекс с уникальными значениями.Поддельные биржевые данные
В дополнение к подмножествам приведенного выше кода, вы можете дополнительно комбинировать приемы, чтобы делать что угодно. Например, вот короткий пример, который объединяет
np.tile
иdate_range
создает примерные данные тикера для 4 акций, охватывающих одинаковые даты:Теперь у нас есть примерный набор данных со 100 строками (25 дат на тикер), но мы использовали для этого всего 4 строки, что позволяет всем остальным воспроизводить без копирования и вставки 100 строк кода. Затем вы можете отобразить подмножества данных, если это поможет объяснить ваш вопрос:
источник
expand.grid()
которая включена в поваренную книгу панд , вы также можете включить это в свой ответ. Ваш ответ показывает, как создать более сложные наборы данных, чемexpand_grid()
могла бы обработать моя функция, и это здорово.Дневник Отвечающего
Мой лучший совет для того, чтобы задавать вопросы, - играть на психологии людей, которые отвечают на вопросы. Будучи одним из тех людей, я могу понять, почему я отвечаю на некоторые вопросы и почему я не отвечаю на другие.
Мотивы
Я мотивирован отвечать на вопросы по нескольким причинам
Все мои самые чистые намерения велики и все, но я получаю это удовлетворение, если я отвечаю на 1 вопрос или 30. Что определяет мой выбор, на какие вопросы отвечать, имеет огромный компонент максимизации баллов.
Я также буду тратить время на интересные проблемы, но это мало и далеко друг от друга, и это не помогает задающему, который нуждается в решении неинтересного вопроса. Лучше всего заставить меня ответить на вопрос - подать этот вопрос на блюдо, созревшее для меня, чтобы ответить на него с минимальными усилиями, насколько это возможно. Если я смотрю на два вопроса, и у одного есть код, я могу скопировать вставить, чтобы создать все переменные, которые мне нужны ... Я беру этот! Я вернусь к другому, если у меня будет время, может быть.
Главный совет
Облегчите людям, отвечающим на вопросы.
Ваша репутация - это больше, чем ваша репутация.
Мне нравятся очки (я упоминал об этом выше). Но эти моменты на самом деле не моя репутация. Моя настоящая репутация - это объединение мнений других людей на сайте. Я стараюсь быть честным и честным и надеюсь, что другие это увидят. Для аскеров это означает, что мы помним поведение аскеров. Если вы не выбираете ответы и не даете хороших ответов, я помню. Если ты ведешь себя так, как мне не нравится, или так, как мне нравится, я помню. Это также играет на какие вопросы я отвечу.
В любом случае, я, вероятно, могу продолжать, но я пощажу всех вас, кто действительно читает это.
источник
Задача Одним из наиболее сложных аспектов ответа на вопросы SO является время, необходимое для воссоздания проблемы (включая данные). На вопросы, которые не имеют четкого способа воспроизвести данные, менее вероятно, что на них будут даны ответы. Учитывая, что у вас есть время, чтобы написать вопрос, и у вас есть проблема, с которой вы хотели бы помочь, вы можете легко помочь себе, предоставив данные, которые другие затем могут использовать для решения вашей проблемы.
Инструкции @Andy по написанию хороших вопросов для Pandas - отличное место для начала. Для получения дополнительной информации обратитесь к тому, как спрашивать и как создавать минимальные, полные и проверяемые примеры .
Пожалуйста, четко сформулируйте свой вопрос заранее. Потратив время на написание вашего вопроса и любого примера кода, попробуйте прочитать его и предоставьте вашему руководителю «Резюме», в котором кратко изложена проблема и четко сформулирован вопрос.
Оригинальный вопрос :
В зависимости от объема данных, примера кода и стеков ошибок, читатель должен пройти долгий путь, прежде чем понять, в чем проблема. Попробуйте переформулировать свой вопрос так, чтобы сам вопрос был на вершине, а затем предоставьте необходимые детали.
Пересмотренный вопрос :
ПРЕДОСТАВИТЬ ОБРАЗЕЦ ДАННЫХ, ЕСЛИ НУЖНО !!!
Иногда только голова или хвост DataFrame - это все, что нужно. Вы также можете использовать методы, предложенные @JohnE, для создания больших наборов данных, которые могут быть воспроизведены другими. Используя его пример для генерации 100 строк DataFrame цен на акции:
Если это были ваши фактические данные, вы можете просто включить заголовок и / или хвост кадра данных следующим образом (обязательно анонимизируйте любые конфиденциальные данные):
Вы также можете предоставить описание DataFrame (используя только соответствующие столбцы). Это упрощает для других проверку типов данных каждого столбца и выявление других распространенных ошибок (например, даты в виде строки против datetime64 против объекта):
ПРИМЕЧАНИЕ. Если ваш DataFrame имеет MultiIndex:
Если ваш DataFrame имеет мультииндекс, вы должны сначала выполнить сброс перед вызовом
to_dict
. Затем вам нужно пересоздать индекс, используяset_index
:источник
Вот моя версия
dput
- стандартный инструмент R для создания воспроизводимых отчетов - для PandasDataFrame
s. Это, вероятно, не удастся для более сложных кадров, но, кажется, делает работу в простых случаях:сейчас,
Обратите внимание, что это дает гораздо более подробный вывод, чем
DataFrame.to_dict
, например,против
для
du
выше, но это сохраняет типы столбцов . Например, в приведенном выше тестепотому что
du.dtypes
естьuint8
иpd.DataFrame(du.to_dict()).dtypes
естьint64
.источник
to_dict
du.equals(eval(dput(df)))
.