В науке о данных одним из основных процессов получения хорошо обработанных данных для анализа является «Очистка данных». И вот где Python сияет, когда дело доходит до анализа данных.
Очистка данных — это процесс выявления и исправления или удаления ошибок, несоответствий и неточностей в данных с целью повышения их качества и обеспечения их точности и надежности для анализа. В Python есть различные библиотеки и инструменты, которые можно использовать для очистки данных. В этом дискурсе мы рассмотрим некоторые из наиболее распространенных шагов, связанных с очисткой данных с помощью Python. Которые:
- Импорт необходимых библиотек. Первым шагом является импорт необходимых библиотек, включая Pandas, Numpy и т. д. Эти библиотеки необходимы для обработки, анализа и визуализации данных.
- Загрузка данных. Следующим шагом является загрузка данных в Pandas DataFrame. Pandas — это мощная библиотека для обработки и анализа данных, которая предоставляет несколько методов загрузки данных, включая CSV, Excel, SQL и другие.
- Обработка отсутствующих данных. Отсутствующие данные — распространенная проблема в реальных наборах данных, и с ними можно справиться различными способами, включая вменение, удаление или интерполяцию. Pandas предоставляет несколько методов для обработки отсутствующих данных, включая fillna, dropna и interpolate.
- Удаление дубликатов: дубликаты могут исказить анализ данных и привести к неверным выводам. Pandas предоставляет метод drop_duplicates, который можно использовать для удаления повторяющихся строк из DataFrame.
В этом проекте мы будем использовать Pandas для очистки наших данных, чтобы они были готовы к анализу. Мы будем иметь дело с тремя различными типами проблем с данными: отсутствующие данные, повторяющиеся данные, неверные данные.
Импорт и исправление типа данных
Чтобы решить эти проблемы с данными, мы можем использовать встроенные функции pandas для их эффективной очистки. Прежде чем приступить к очистке вышеперечисленного, мы можем использовать функцию info()
, чтобы получить снимок типа данных, который находится в нашем DataFrame, и систематически изменять данные в надлежащие типы данных.
import pandas as pd import numpy as np dataframe_3 = pd.read_csv('Data Source.csv') dataframe_3.info() #RUN and get the below output: <class 'pandas.core.frame.DataFrame'> RangeIndex: 1887 entries, 0 to 1886 Data columns (total 8 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Store 1887 non-null int64 1 Date 1887 non-null object 2 CategoryID 1887 non-null int64 3 ProductID 1887 non-null object 4 Q1 1886 non-null float64 5 Q2 1722 non-null object 6 Q3 1738 non-null float64 7 Q4 1719 non-null float64 dtypes: float64(3), int64(2), object(3) memory usage: 118.1+ KB
Сначала мы можем начать с того, что столбец Date
относится к типу object
, тогда как правильный тип даты — datetime
. Мы можем исправить это, введя следующий код.
pd.to_datetime(dataframe_3['Date']) #RUN using shift & enter key: 0 2019-03-10 1 2019-06-04 2 2019-01-16 3 2019-10-18 4 2019-04-11 ... 1882 2019-03-24 1883 2019-03-24 1884 2019-03-24 1885 2019-09-30 1886 2019-06-14 Name: Date, Length: 1887, dtype: datetime64[ns] #Date type has been changed successfully. Next would be reinstate it to our data # In order to make a change to the DataFrame, the changes must be reinstatiated to overwrite with the changes. dataframe_3['Date'] = pd.to_datetime(dataframe_3['Date']) dataframe_3.info() #RUN using shift & enter key: <class 'pandas.core.frame.DataFrame'> RangeIndex: 1887 entries, 0 to 1886 Data columns (total 8 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Store 1887 non-null int64 1 Date 1887 non-null datetime64[ns] 2 CategoryID 1887 non-null int64 3 ProductID 1887 non-null object 4 Q1 1886 non-null float64 5 Q2 1722 non-null object 6 Q3 1738 non-null float64 7 Q4 1719 non-null float64 dtypes: datetime64[ns](1), float64(3), int64(2), object(2) memory usage: 118.1+ KB
Теперь мы видим, что дата была исправлена в соответствии с правильным типом данных.
Недостающие данные
Используя приведенную выше функцию info()
, мы можем увидеть, что в наших данных есть нулевые значения из столбца Non-Null Count. Некоторые столбцы имеют разное количество ненулевых значений, что означает, что в этих столбцах больше нулевых значений. Чтобы более подробно увидеть, какие столбцы и строки имеют нулевые значения, мы можем использовать функцию isna()
.
dataframe_3.isna() #RUN using shift & enter key:
Этот результат может быть трудно интерпретировать и действовать. Способ упростить эту информацию состоит в том, чтобы соединить `isna()` с функцией `sum()`.
dataframe_3.isna().sum() #RUN using shift & enter key: Store 0 Date 0 CategoryID 0 ProductID 0 Q1 1 Q2 165 Q3 149 Q4 168 dtype: int64
Теперь мы можем видеть количество нулевых значений в каждом столбце.
Отсутствующие данные можно отсортировать, используя следующий подход:
- Удаление нулевых значений из строк и/или столбцов DataFrame
- Заполнение пустых значений константой или другими значениями из DataFrame
Удаление пустых значений
Чтобы удалить столбцы или строки, содержащие нулевые значения, мы можем использовать функцию dropna()
. Мы можем начать с удаления строк, в которых хотя бы один элемент имеет значение null. Это уменьшает наш DataFrame с 1887 строк до 1684 строк, как показано ниже.
dataframe_3.dropna() #RUN using shift & enter key:
Из приведенного выше количество строк во фрейме данных было уменьшено до 1684. Мы также можем удалить столбцы с нулевыми значениями, а не строки с той же функцией, но с указанием оси.
dataframe_3.dropna(axis=1)
Глядя выше, мы теперь видим, что столбцы, которые имеют какие-либо нулевые значения, также были удалены.
Заполнение нулевых значений
Полное удаление столбцов и строк с нулевыми значениями обычно не является эффективным методом очистки данных, так как можно потерять много данных.
Более распространенный подход к очистке этих нулевых значений состоит в том, чтобы заполнить их с помощью функции fillna()
. Два популярных использования этой функции:
- Заполните нулевые значения 0 или любым значением
- Заполните нулевые значения на основе следующего/предыдущего числа («ffill» и «bfill»).
Прямое заполнение и обратное заполнение — это два подхода к заполнению пропущенных значений. Заполнение вперед означает заполнение пропущенных значений предыдущими данными. Обратное заполнение означает заполнение пропущенных значений следующей точкой данных.
С помощью этих методов мы по-прежнему можем сохранять ценные данные и не удалять весь столбец/строку.
# filling NaNs with 0 dataframe_3.fillna(0)
# filling NaNs that is equal to the previous non-NaN number "Forward Fill" dataframe_3.fillna(method='ffill')
# filling NaNs that is equal to the next non-NaN number "Back Fill" dataframe_3.fillna(method='bfill')
Я считаю, что благодаря этому вы смогли научиться очищать свои данные для анализа. В следующем эпизоде я буду писать о том, как обрабатывать «данные об ошибках», «дубликаты данных» и «экспорт данных».
Источник данных: Я искренне признателен команде CFI. Набор данных был загружен на мой диск Google здесь.
следите за мной, чтобы получать новости о науке о данных и процессах анализа.