Заполнение пропусков — 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, который поддерживает следующие параметры:
Нажмите, чтобы показать таблицу
| Свойство | Тип | Описание |
|---|---|---|
frame | array([null, number]) | Массив из двух элементов, определяющий окно для выбранного метода. Каждый элемент — число, задающее смещение от текущего объекта, либо |
groupby | array(FieldName) | Необязательный массив полей группировки. Пропуски заполняются отдельно в каждой группе. |
impute | FieldName | Поле данных, в котором нужно заполнить отсутствующие значения. |
key | FieldName | Ключевое поле, однозначно определяющее объекты внутри группы. Отсутствующие значения ключа — встречающиеся в данных, но не в текущей группе — будут добавлены. |
keyvals | anyOf(array(any), ImputeSequence) | Значения ключа, которые нужно учитывать при заполнении: массив или объект, задающий числовую последовательность. Если задан, используется вместе со значениями ключа из входных данных. Иначе берутся все уникальные значения поля |
method | ImputeMethod | Метод заполнения значений: |
value | any | Значение поля для добавляемых объектов, если |