Заполнение пропусков — Impute

Преобразование impute заполняет отсутствующие записи набора данных. Рассмотрим данные с пропусками, которые удаляются при переходе к длинному формату. Подробнее о форматах см. «Длинный и широкий форматы».

import numpy as np
import pandas as pd

data = pd.DataFrame({
    't': range(5),
    'x': [2, np.nan, 3, 1, 3],
    'y': [5, 7, 5, np.nan, 4]
}).melt('t').dropna()
data

В ряду x нет записи при t=1, а в ряду y — при t=3. Если построить диаграмму напрямую, линия пропустит отсутствующие записи:

import altair as alt

raw = alt.Chart(data).mark_line(point=True).encode(
    x='t:Q',
    y='value:Q',
    color='variable:N'
)
raw

Это не всегда желательно: особенно на линейной диаграмме без точек такая линия может создавать впечатление, что отсутствующие данные существуют.

Заполнение пропусков в кодировании

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

background = raw.encode(opacity=alt.value(0.2))
chart = alt.Chart(data).mark_line(point=True).encode(
    x='t:Q',
    y=alt.Y('value:Q').impute(value=0),
    color='variable:N'
)
background + chart

Можно также использовать любую поддерживаемую функцию агрегирования:

chart = alt.Chart(data).mark_line(point=True).encode(
    x='t:Q',
    y=alt.Y('value:Q').impute(method='mean'),
    color='variable:N'
)
background + chart

Заполнение пропусков с помощью преобразования

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

chart = alt.Chart(data).transform_impute(
    impute='value',
    key='t',
    value=0,
    groupby=['variable']
).mark_line(point=True).encode(
    x='t:Q',
    y='value:Q',
    color='variable:N'
)
background + chart
chart = alt.Chart(data).transform_impute(
    impute='value',
    key='t',
    method='mean',
    groupby=['variable']
).mark_line(point=True).encode(
    x='t:Q',
    y='value:Q',
    color='variable:N'
)
background + chart

Для более локального заполнения можно указать параметр frame, аналогичный параметру оконного преобразования. Он определяет, какие значения использовать при заполнении. Здесь пропуски заменяются средним значением соседних точек по обе стороны:

chart = alt.Chart(data).transform_impute(
    impute='value',
    key='t',
    method='mean',
    frame=[-1, 1],
    groupby=['variable']
).mark_line(point=True).encode(
    x='t:Q',
    y='value:Q',
    color='variable:N'
)
background + chart

Параметры преобразования

Метод Chart.transform_impute основан на классе ImputeTransform, который поддерживает следующие параметры:

Нажмите, чтобы показать таблицу
СвойствоТипОписание
framearray([null, number])

Массив из двух элементов, определяющий окно для выбранного метода. Каждый элемент — число, задающее смещение от текущего объекта, либо null, означающий неограниченное число предшествующих или последующих строк. Например, [-5, 5] включает пять объектов до и пять после текущего. По умолчанию: [null, null], то есть все объекты.

groupbyarray(FieldName)

Необязательный массив полей группировки. Пропуски заполняются отдельно в каждой группе.

imputeFieldName

Поле данных, в котором нужно заполнить отсутствующие значения.

keyFieldName

Ключевое поле, однозначно определяющее объекты внутри группы. Отсутствующие значения ключа — встречающиеся в данных, но не в текущей группе — будут добавлены.

keyvalsanyOf(array(any), ImputeSequence)

Значения ключа, которые нужно учитывать при заполнении: массив или объект, задающий числовую последовательность. Если задан, используется вместе со значениями ключа из входных данных. Иначе берутся все уникальные значения поля key. При impute в encoding ключом служит поле x, если заполняется поле y, и наоборот. Если группировка для заполнения отсутствует, это свойство обязательно.

methodImputeMethod

Метод заполнения значений: "value", "mean", "median", "max" или "min". По умолчанию: "value".

valueany

Значение поля для добавляемых объектов, если method равен "value".