Проверка сценария очистки до того, как он затронет ваши данные
Сценарий очистки — это список решений о том, что означают ваши данные, записанный в виде кода. Отбросьте эти строки. Считайте этот пробел нулем. Предположим, что эти два написания относятся к одной и той же компании. Каждый из них оправдан в одной ситуации и неправ в другой, и ни один из них не приводит к ошибке.
Что вы делаете: для каждой операции записывайте, что она изменила, и решайте, факт это или предположение. Предположения идут в описании.
Краткая версия. Выведите значения до и после. Подсчеты - это обзор.
Измерительный жгут
Прежде чем просматривать какой-либо шаг, добавьте это в сценарий. Четыре строки, и они превращают молчаливое преобразование в проверяемое:
def snapshot(df, label):
print(label, 'rows', len(df))
print(df.isna().sum())
print('distinct ids', df['customer_id'].nunique())
snapshot(raw, 'before')
clean = clean_it(raw)
snapshot(clean, 'after')
Если количество строк изменилось, что-то было удалено. Если нулевой счетчик обращался к нулю, что-то было заполнено. Если количество уникальных идентификаторов изменилось, идентификаторы были объединены или разделены. Эти три числа описывают большую часть того, что делает сценарий очистки.
Шесть операций и то, что решает каждая из них
1. водянка
df = df.dropna() # every column, any null, row gone
Оспорить следует версию без аргументов. Он удаляет строку, если любой Столбец имеет значение NULL, включая столбцы, которые ваш анализ никогда не использует. На широкой таблице, из которой можно удалить большую часть данных. Проверьте количество, затем сузьте его: dropna(subset=['amount']) по крайней мере, указано, какой столбец имеет значение.
Более глубокий вопрос заключается в том, что означает отсутствие. Промахнуться случайно – неприятность. Отсутствие, поскольку поле заполнено только для одного типа клиентов, означает удаление группы, и последующий анализ касается другой группы населения, чем та, о которой вас спрашивали.
2. чувствовать
df['amount'] = df['amount'].fillna(0)
Это создает данные. Нуль будет суммирован, усреднен и отображен на графике точно так же, как измеренный ноль, и ничто в дальнейшем не сможет отличить их друг от друга. Заполняйте 0 только в том случае, если отсутствие означает отсутствие. Если «отсутствует» означает «не записано», оставьте это значение и позвольте агрегации пропустить его или заполните дозорным и запишите количество.
Медианное и среднее заполнения несут одно и то же предупреждение, но с более дружелюбным лицом: они уменьшают дисперсию и смещают каждую группу к середине, поэтому любая вычисленная впоследствии мера разброса занижена.
3. замена и сопоставление категорий
df['region'] = df['region'].replace({'Nrth': 'North', 'N': 'North'})
Каждое сопоставление — это утверждение, что две метки означают одно и то же. Обычно верно, иногда нет: N это может быть «Север», «Новый» или «Системное значение по умолчанию». Спросите, откуда взялось картографирование. Если ответ заключается в том, что он был получен на основе сходства, его необходимо сверить с реальным списком литературы. Это предмет Разрешение объекта.
Выведите значения счетчиков до и после. Категория, в которой количество строк увеличивается от 900 до 4000, является либо хорошим, либо плохим слиянием, а именно с числа начинается разговор.
4. Приведение типов
df['id'] = df['id'].astype(int)
df['date'] = pd.to_datetime(df['date'])
Приведение идентификатора к числу безвозвратно уничтожает ведущие нули, а любой идентификатор, длина которого превышает 15 цифр, теряет точность. Синтаксический анализ даты без явного угадывания формата, и классическая ошибка — это файл с первым днем, читаемый как первый с месяца, который автоматически меняет местами значения стиля 3 марта и 1 апреля, ничего не вызывая в дни, превышающие 12.
pd.to_datetime(df['date'], format='%d/%m/%Y', errors='raise')
errors='coerce' стоит внимательно посмотреть, где бы вы его ни увидели: он превращает неразбираемые даты в нули, которые в следующем dropna потом удаляет. Две невинно выглядящие строки и строки с нечетным форматом даты исчезли.
5. удалить_дубликаты
df = df.drop_duplicates(subset=['customer_id'], keep='first')
Какой из них будет первым, полностью зависит от порядка сортировки, и если кадр не был отсортирован намеренно, выживающая строка будет произвольной. Если дубликаты различаются в каком-либо столбце, вы выбрали случайное значение. Выполните явную сортировку по решающему столбцу (обычно это временная метка) и укажите в записи, что побеждает последняя запись.
6. Отсечение и удаление выбросов
df = df[df['amount'] < df['amount'].quantile(0.99)]
Это удаляет верхний один процент по конструкции, независимо от того, являются ли эти строки ошибками. Согласно данным о доходах, верхний процент часто представляет собой наиболее значимых клиентов. Удаление выброса законно только тогда, когда вы можете сказать, что делает его неправильным, а не просто то, что он большой. Видеть процентили и правило выбросов.
Обзор в виде таблицы, которую вы заполняете
| Шаг | Строки перед | Строки после | Факт или предположение | Входит в рецензию? |
|---|---|---|---|---|
| водянка(подмножество=количество) | 41,208 | 40,955 | Предположение | Да, 253 строки |
| заменить написание региона | 40,955 | 40,955 | Предположение | Да, перечислите сопоставления |
| drop_duplications по идентификатор заказа | 40,955 | 40,901 | Факт, если идентификаторы уникальны по своей природе | Да, 54 ряда |
| дата актерского состава | 40,901 | 40,901 | Фактически, формат был явным | Нет |
Четыре строки таблицы, и в анализе теперь есть раздел о происхождении вместо заявления о том, что данные были очищены.
Как применить это в своей работе
- Добавьте функцию моментального снимка в каждый запускаемый вами скрипт очистки, включая короткие.
- Никогда не принимайте голого
dropna(). Спросите, какой столбец имел значение и сколько строк он стоил. - Бросьте вызов каждому
fillna(0)с вопросом: здесь отсутствие означает отсутствие? - Дайте каждому анализу даты явный формат и обработайте
errors='coerce'как что-то, чтобы оправдать. - Опубликуйте подсчеты «до» и «после» рядом с результатом. Это самое дешевое доверие, которое вы когда-либо купите.
Единственная привычка, которую нужно сохранить
Сохраните необработанный файл. Очистка всегда должна представлять собой сценарий, запускаемый из нетронутого источника, а не редактирование единственной копии. Это единственное правило означает, что каждое решение на этой странице является обратимым, поэтому их стоит просмотреть.
Не могли бы вы сегодня повторно запустить последний сценарий очистки из исходного файла и получить тот же результат?
Python для аналитиков — это рабочая книга по аналитике pandas: прочитайте файл, исправьте его типы, сгруппируйте его, присоединитесь к нему и проверьте ответ, прежде чем его увидит кто-либо еще.
Python для аналитиков, 19 $ →Филна и Дропна подробно описывает решения по недостающим значениям, drop_duplications дедупликационные, и Документирование ограничений данных здесь принадлежат результаты.
Читать филна и дропна →