«Шпаргалка» для обычных специалистов по данным
Это было до эпохи переполнения стека, поэтому в Интернете было не так много помощи. Некоторые люди распечатывали различные виды шпаргалок и развешивали на стенах вокруг своих рабочих станций. Наличие пары страниц часто используемых кодов перед столом было эффективным способом исправления синтаксических ошибок.
Помощь теперь у вас под рукой, всего в нескольких щелчках мыши. Но старомодная шпаргалка по-прежнему является ценным инструментом для экономии времени. Это еще более актуально, если вам приходится перемещаться между несколькими языками программирования.
Специалисты по обработке данных тратят большую часть своего времени на обработку данных, поэтому эффективность - это ценный навык. Итак, цель этой статьи - показать, как создать «шпаргалку» для обработки данных в соответствии с типичным рабочим процессом аналитики. Я не собираюсь записывать все коды, необходимые на каждом этапе пути, скорее я сосредоточусь на том, как составить шпаргалку, которая будет служить вашей цели, чтобы вы могли тратить больше времени на кодирование, а не на поиск правильного синтаксиса.
1) Настройка
Вскоре после запуска IDE / текстового редактора вы вполне можете смотреть на пустой экран. Загрузка наборов данных, вероятно, первое, что приходит вам в голову. Итак, начнем с этого и импортируем пару библиотек.
import pandas as pd import numpy as np
Затем идет подключение к рабочим каталогам.
import os
# show current working directory
os.getcwd()
# list files in the directory
os.listdir()
# change working directory
os.chdir("/PATH/TO/NEW/DIRECTORY")
2) Загрузка данных
Теперь загрузите свои наборы данных из репозитория (рабочий стол, облако, SQL-сервер - где бы он ни был). Это хорошая идея - сделать копию исходного набора данных и работать с этой копией, потому что вы будете вносить множество изменений в исходный.
# import from a csv file
data = pd.read_csv("../Datasets/iris.csv")
# copying a dataset
df = data.copy()
# call the head function
df.head()
Я импортирую набор данных iris со своего локального компьютера. Выделенные желтым цветом ячейки - это некоторые изменения, которые я намеренно внес в исходные данные, и вы вскоре увидите, почему.

3) Первичная проверка данных
df.info()
Я бы сначала вызвал метод info(), чтобы проверить несколько вещей. Желтое выделение кажется странным, поскольку я ожидал, что petal_length будет типом данных «float», а не «объектом». Мы разберемся с этим позже.

Среди прочего info() сообщает вам количество строк и столбцов в наборе данных, но вы также можете получить их с помощью атрибута shape; так хорошо, что это тоже есть в шпаргалке.
# number of rows and columns df.shape >> (150, 5)
В некоторых наборах данных может быть слишком много столбцов, и они не поместятся на экране компьютера. Вместо этого вы можете проверять имена столбцов с помощью атрибута columns.
# column names
df.columns
>> Index(['sepal_length', 'SEpal_Width', 'petal_length', 'petal_width',
'species'],
dtype='object')
Для категориальных переменных вам нужно знать, сколько существует категорий;
# number of unique values df["species"].nunique() >> 4
а также названия этих категорий;
# name of the unique values df["species"].unique() >> array(['setosa', 'setosaaa', 'versicolor', 'virginica'], dtype=object)
и количество строк в каждой категории.
# count of categorical data df["species"].value_counts() >> versicolor 50 virginica 50 setosa 49 setosaaa 1 Name: species, dtype: int64
4) Обработка отсутствующих значений
Отсутствие значений неудивительно. Ячейки, выделенные желтым цветом в приведенном выше фрейме данных, представляют собой NaN значений. Вы можете найти количество пропущенных значений в наборе данных, набрав следующее:
# show NaN values per feature df.isnull().sum() >> sepal_length 2 SEpal_Width 0 petal_length 0 petal_width 0 species 0 dtype: int64
Вы также можете получить пропущенные значения в виде процента от общего числа наблюдений (это очень полезно для больших наборов данных).
# NaN values as % of total observations df.isnull().sum()*100/len(df)
В наборе данных iris у нас есть два пропущенных значения в столбце sepal_length. Теперь, когда мы узнали, что с ними делать? Вы можете сделать одно из следующего:
а) отбросить строки или столбцы, содержащие нулевые значения;
## Drop row/column ## ##################### # drop all rows containing null df.dropna() # drop all columns containing null df.dropna(axis=1) # drop columns with less than 5 NaN values df.dropna(axis=1, thresh=5)
б) или заменить / вменять недостающие ячейки некоторыми другими значениями;
## Replace values ##
####################
# replace all na values with -9999
df.fillna(-9999)
[# additional tip: you can also replace any specific cell values
df.at[1, "sepal_length"]= 9999]
# fill na values with NaN
df.fillna(np.NaN)
# fill na values with strings
df.fillna("data missing")
# fill missing values with mean column values
df.fillna(df.mean())
# replace na values of specific columns with mean value
df["sepal_length"].fillna(df["sepal_length"].mean())
c) или, если это данные временного ряда, интерполяция - отличный способ условно исчислить данные.
## Interpolate ## ################# # interpolation of missing values (useful in time-series) df.interpolate() # all dataframe df["sepal_length"].interpolate() # specific column
5) Подмножество и работа со столбцами
Не все столбцы в наборе данных представляют интерес, иногда мы выбираем определенные столбцы для аналитики или построения модели. Подмножество позволяет это сделать.
Есть два основных способа выбора столбцов: по именам столбцов и по положению столбцов:
# select a column by column name df["sepal_length"] # select multiple columns by column name df[["sepal_length", "sepal_width", "petal_length", "spp"]] # select a column by column number df.iloc[:, 2:4] # select multiple columns by column number df.iloc[:, [1,3,4]]
Но что, если вы хотите разделить данные, отбросив столбец?
# drop a column
df.drop("sepal_length", axis=1)
Теперь предположим, что вы хотите создать новый столбец, добавив два существующих столбца:
sepal_len_cm = sepal_length * 10
Создание новых вычисляемых столбцов часто является важной частью разработки функций.
# add new calculated column df['new'] = df["sepal_length"]*2 # create a conditional calculated column df['newcol'] = ["short" if i<3 else "long" for i in df["sepal_width"]]
Иногда может потребоваться перекодирование для преобразования категориальных строковых значений в числовые значения.
df.replace({"Species":{"setosa":1, "versicolor":2, "virginica":3}})
Если требуется агрегирование значений столбцов (среднее / медианное и т. Д.), python и numpy имеют собственные функции, которые можно применять к фрейму данных.
# calculate mean of each of two columns df[["sepal_length", "sepal_width"]].mean() # calculate sum and mean of each column df[["sepal_length", "sepal_width"]].agg([np.sum, np.mean])
И, наконец, дополнительный синтаксис, полезный для работы со столбцами:
# transposing a dataset
df.T
# create a list of columns
df.columns.tolist()
# sorting values in ascending order
df.sort_values(by = "sepal_width", ascending = True)
# change column name
df.rename(columns={"old_name": "new_name"})
6) Фильтрация: работа со строками
Фильтрация - это важная часть исследовательского анализа данных, получения аналитических сведений и построения ключевых показателей эффективности.
Существует множество способов фильтрации данных в зависимости от потребностей аналитики, например:
а) используя расположение индекса строки:
# select rows with index number 3 to 10 df.iloc[3:10,] # select rows with index name df.loc["index1", "index2"] # finding rows with specific strings df[df["species"].isin(["setosa"])]
б) условная фильтрация
# simple conditional filtering to filter rows with sepal_length>=5
df.query('sepal_length>=5') # or
df[df.sepal_length>= 5]
# filtering rows with multiple values e.g. 0.2, 0.3
df[df["petal_length"].isin([0.2, 0.3])]
# multi-conditional filtering
df[(df.sepal_length>1) & (df.species=="setosa") | (df.sepal_width<3)]
И, наконец, вот как при необходимости избавиться от ряда.
# drop rows df.drop(df.index[1]) # 1 is row index to be deleted
7) Группировка
Как и фильтрация, группировка - еще одна важная часть исследовательского анализа данных и визуализации данных. Ключевой функцией для этой задачи является groupby(), которая в основном используется для агрегирования строк на основе категориальных функций.
# return a dataframe object grouped by "species" column
df.groupby("species")
После того, как фрейм данных сгруппирован, вы можете применить к нему различные функции, например, получить агрегированные значения числовых столбцов:
# return mean a column groupby "species" categories df["sepal_length"].groupby(df["species"]).mean()
Или вы можете применить такую агрегатную функцию к нескольким функциям:
# group each column by "species", then apply multiple operation on each feature
df.groupby("species").agg([np.sum, np.mean, np.std])
8) Присоединение / слияние
Если вы знаете SQL, мне не нужно объяснять, насколько важно присоединение. Python и pandas имеют некоторые функции, такие как merge(), join(), concat() для соединения в стиле SQL. Если SQL является основной базой данных, вам, вероятно, не придется много работать с Python, но, тем не менее, вам следует добавить следующие коды в свою шпаргалку.
# SQL style joining df1 = df[["sepal_length", "sepal_width"]] df2 = df[["sepal_length", "petal_length"]] dfx = pd.concat([df1, df2], axis = 1)
Заключительное слово
Это клише, но это правда, что большинство специалистов по данным тратят 70–80% своего времени на очистку данных, прежде чем приступить к какой-либо сложной аналитике. Даже опытные программисты тратят значительное количество времени в Интернете (например, на StackOverflow) в поисках правильного кода или синтаксиса для своего проекта. Старомодная шпаргалка - напечатанная на бумаге или записанная в блокноте Jupyter - по-прежнему является ценным активом. Хранение наиболее часто используемых кодов в одном месте может сэкономить значительное количество времени и энергии.
Надеюсь, это был полезный пост. Если у вас есть комментарии, не стесняйтесь записывать их ниже. Вы можете подписаться на меня в Medium, Twitter или LinkedIn.