Доброго времени суток! Меня зовут Алексей. Сейчас я обучаюсь на аналитика данных в "Яндекс Практикум". Дело для меня непривычное, совершенно не связанное с моей предыдущей деятельностью (пока что работаю врачом, иногда пишу рассказы и повести), так что порой некоторые темы даются с большим трудом.

Начинающий аналитик данных с первых дней учёбы сталкивается с необходимостью освоить одну из наиболее важных в его будущей работе библиотек python - pandas. По себе знаю: порой здесь возникает такая путаница в голове, что первые простые задания вызывают ступор. Пройдя множество учебных заданий и успешно сдав несколько проектов, хочу поделиться с такими же новичками, как я сам, парой советов, которые, надеюсь, смогут упростить учебный процесс и первые шаги в новой профессии.

И мой главный совет: "сделайте себе шаблон"!

Не важно, в чём вы пишете код: "Google colaboratory", "Jupiter notebook" или в какой-то иной среде. Не важно, сколько вы пока знаете: если осваиваете профессию с нуля, вносите в шаблон всё, что уже умеете - позже всегда можно удалить лишнее. Шаблон поможет вам быстро сориентироваться в любой новой задаче, напомнит о необходимых манипуляциях. 

Постарайтесь найти баланс между общими правилами оформления работы, которые от вас требуют (преподаватели, ревью, заказчики), логикой программирования и вашими личными предпочтениями в ведении документации. 

Лично я большую часть учебных проектов выполнил в "Google colaboratory" (далее по тексту просто "колаб"), где предпочитаю следующую структуру шаблона.

Шапка

Название шапки напишем в отдельной текстовой ячейке с ### - там мы создаём раздел, который в колаб можно свернуть, спрятав ячейки текста и кода. Плюс: если кто-то будет просматривать вашу работу в "Jupiter notebook", текст сформирует заголовок и пункт оглавления, что будет удобно и вам, и просматривающим вашу работу. 

Ниже вставьте хотя бы одну пустую ячейку под описание, вводной части или какого-то предварительного пояснения. 

Подготовка к работе

Новый раздел. Также стоит название раздела записать в пустой ячейки, начав с ###.

В этом разделе стоит загрузить библиотеки и добавить некоторые предварительные настройки. 

Отдельно по колаб. Если вы, как и я, предпочитаете работу в колаб, в первую очередь необходимо подключить возможность использовать доступный вам виртуальный диск "Google drive". Чтобы избежать конфликта при ревью в другой среде, заключите код в конструкцию "try - except". Если вы планируете скачивать из вашей работы какие-либо файлы, добавьте в этот же блок функцию колаб для загрузки файлов.

try:

  from google.colab import drive

  drive.mount('/content/drive')

  # загрузка файлов из колаб

  from google.colab import files

except:

  print('Подключение к google-drive не выполнено. Вы просматриваете проект в другой среде. Код запущен далее.')

Здесь же можно добавить скрытие предупреждений, которые колаб щедро раздаёт при работе:

# colab часто выдаёт предупреждения - скроем их

import warnings

warnings.filterwarnings("ignore")

Далее поставим ячейку кода загрузки библиотек. Конечно, для анализа данных основной вашей библиотекой будет pandas (запишите её сразу со стандартным псевдонимом pd):

import pandas as pd

В зависимости от целей вашей работы на этом этапе может возникнуть необходимость загрузки и других библиотек. При изготовлении шаблона оставьте себе максимальное количество полезных библиотек, добавьте комментарии, какие библиотеки и для чего вам необходимы. К примеру, мой шаблон в этом разделе пестрит обилием следующих библиотек:

# для работы с показателями времени

from datetime import datetime

 # для "красоты" (графики и оформление)

import matplotlib.pyplot as plt

from pandas.plotting import register_matplotlib_converters

# конвертеры, которые позволяют использовать типы pandas в matplotlib  

register_matplotlib_converters()

import seaborn as sns

import plotly.express as px

from plotly import graph_objects as go

 # для математических и статистических операций

import numpy as np

import math as mth

import scipy.stats

from scipy import stats as st

# библиотеки для работы с дашбордами

import sys

import getopt

from sqlalchemy import create_engine

 # для создания двойного пути к базе данных - об этом чуть позже

import os

Далее заранее организуйте для себя наиболее удобный и приемлемый в рамках вашей работы вид выводимых пандами данных. Для этого добавьте код редактирования опций. Подробнее об опциях можно почитать в официальной документации по ссылке.

Лично я предпочитаю такие скромные вводные:

# количество строк в таблице не больше 5, чтобы не писать head() за каждым фреймом

pd.set_option('max_rows', 5)

# при необходимости раскрыть из комментария полный вывод данных в колонке

# pd.set_option('display.max_colwidth', None)

# оставим всего три знака после запятой у чисел с плавающей точкой

pd.set_option('display.float_format', '{:.3f}'.format)

Даже, если вы ещё только учитесь, очень рано вам понадобится использовать графики. Вам, вашим преподавателям или заказчикам будет комфортно просматривать графики и диаграммы, если они будут выполнены в общей стилистике. Редактируя параметры matplotlib.pyplot можно заранее задать размер шрифта заголовков и осей, цветовую гамму и стиль. Подробнее о параметрах можно почитать в официальной документации по ссылке.

Вот пример параметров моего основного шаблона:

large = 16; med = 12; small = 10

params = {'axes.titlesize': large,

          'legend.fontsize': med,

          'figure.figsize': (12, 8),

          'axes.labelsize': med,

          'axes.titlesize': med,

          'xtick.labelsize': med,

          'ytick.labelsize': med,

          'figure.titlesize': large}

plt.rcParams.update(params)

plt.style.use('seaborn-whitegrid')

# на мой взгляд лучше всего подходит палитра deep

# она не пёстрая, относительно контрастная

# однако в реальном заказе я предпочёл бы принятые у заказчика цвета для подобной работы

sns.set_palette('deep') 

sns.set_style("whitegrid")

Ознакомление с данными

Когда всё готово для работы, можно приступить к загрузке данных и ознакомлению. 

Как я уже говорил, я прохожу обучение в “Яндекс Практикум”. При работе над учебными проектами студентам даётся выбор: работать данными в “Jupiter notebook” на платформе или скачать файл и работать локально в удобной для обучающегося среде. Если работать локально, то перед отправкой на ревью потребуется исправить часть кода с загрузкой данных, чтобы они подгружались из того же ресурса, что и у преподавателя… Или вы можете задать двойной путь к файлу данных: один ваш локальный, второй - ссылка преподавателя. Для этого воспользуемся техникой создания двойного пути с помощью библиотеки os:

pth1='первый_путь_к_файлу/../файл.csv'

pth2='второй_путь_к_файлу/../файл.csv'

if os.path.exists(pth1):

  df = pd.read_csv(pth1, delimiter='\t')

elif os.path.exists(pth2):

  df = pd.read_csv(pth2, delimiter='\t')

else:

  print('Проверьте правильность пути к датасету')

Этот приём пригодится вам также при ситуации, когда один и тот же код вы используете на разных машинах, средах и так далее (к примеру, часть работы делаете на стареньком домашнем компьютере без интернета, часть - непосредственно на рабочем месте, может быть, даже в гостях у любимой бабушки). При работе с несколькими файлами данных прописывайте им соответствующие пути (1 файл - pth1, pth2; 2 файл - pth3, pth4 и т.д.) с последующей конструкцией if-else.

Когда данные загружены, можно посмотреть сформированные датафреймы. Если вы, как и я, указали в опциях ('max_rows', 5), то ставить head() уже не потребуется - датафрейм автоматически выведет только 5 строк (две первых, пустую - обозначает прочие строки, две последних). Если вам нужно больше строк, используйте head() или отредактируйте опции и перезапустите код. Для большого числа строк можно добавить функцию подсветки строк при наведении курсора мыши:

# добавим подсветку строки при наведении - просто для красоты

df.style.set_sticky(axis="index")

Далее, если необходимо, пройдите по датафрейму стандартными функциями оценки. Некоторые педагоги “Практикума” требуют применения максимального числа функций на этапе ознакомления с данными. Возможно, в вашей учёбе или работе вам потребуется проделать аналогичную работу. Так что не поленитесь добавить себе в шаблон:

-оценку общих данных о датафреме

df.info()

-поиск пропущенных значений

df.isna().sum()

-поиск абсолютных дубликатов

df.duplicated().sum()

Предобработка

Предобработка данных зависит от качества первоначальных данных и стоящих перед вами задач. Тем не менее, стоит внести себе в шаблон хотя бы в качестве напоминания того, что вы можете сделать с датафреймом прежде, чем приступите к анализу. 

Приведите имена колонок в стилистически правильные или удобные вам, если это необходимо. К примеру, таким способом:

df.columns = ['имена колонок через запятую']

Обработайте дубликаты. В зависимости от данных и поставленных задач, с абсолютными дубликатами возможны разные варианты работы. Если задача допускает удаление дубликатов, то сделайте это здесь всего одной строкой, не забыв при этом обновить индекс фрейма:

df = df.drop_duplicates().reset_index(drop=True)

Если ваш датафрейм содержит колонку исключительно уникальных значений (к примеру, id пользователей), а поставленная задача требует максимального разнообразия данных, вы также можете провести очистку датафрейма от дубликатов без учёта колонки уникальных значений:

df = df.drop_duplicates(subset=['колонки, по которым идёт очистка'], keep=False)

df = df.reset_index(drop=True)

Используйте этот метод аккуратно: без учёта уникальных значений вы можете потерять очень много данных, хотя и добьетесь максимального разнообразия. 

Вот пожалуй и всё, что стоит по минимуму иметь в пригодным для учёбы и работы шаблоне. Всё остальное вы можете внести сами по вашим желаниям и необходимости. 

Удачи на пути Панды!

Комментарии (3)


  1. IvaYan
    09.06.2022 22:51

    Не лучше ли расположить все импорты в одной ячейке в самом начале? Все импорты в самом начале более распространённая практика и не только Python. Это облегчает чтение и понимание кода и позволяет сразу оценить, что используем.

    Если не удалось подключиться к гуглодиску, зачем продолжать выполнение? В гуглодиске у нас, скорее всего, данные для анализа. Если не удалось подключиться, то их не удастся загрузить и проанализировать -- зачем продолжать выполнение кода?

    Код лучше оформить как код, сейчас его не очень удобно читать


  1. vkflare
    11.06.2022 00:06

    Умею в питон (скриптинг, кодинг), но практически никогда не работал с ipynb и с датасайенс либами. Подскажите плз, как у вас организована работа с модулями? Чтобы переимпортить свой же код в новый ipynb и сохранить его вместе с новыми расчетами в качестве артефакта, каков правильный путь? Как из ipynb тягать внешние зависимости, если работаешь в jupyter notebook? Точно так же через requirements.txt + pip? Вообще, было бы интересно послушать/почитать про будни питониста в data science.


  1. ReDev1L
    12.06.2022 01:15

    Пожалуйста, отформатируйте код, читать тяжело