Как я могу исключить определенные даты (например, выходные дни) из графиков временных рядов? - PullRequest
0 голосов
/ 16 декабря 2018

В следующем примере я хотел бы исключить выходные дни и построить график Y в виде прямой линии, а также указать некоторую настраиваемую частоту для основных меток тиков, поскольку они будут представлять собой «прерывистые» временные ряды (например, каждый понедельник,а-ля matplotlib х set_major_locator).

Как мне это сделать на Альтаире?

import altair as alt
import pandas as pd

index = pd.date_range('2018-01-01', '2018-01-31', freq='B')
df = pd.DataFrame(pd.np.arange(len(index)), index=index, columns=['Y'])

alt.Chart(df.reset_index()).mark_line().encode(
    x='index',
    y='Y'
)

enter image description here

1 Ответ

0 голосов
/ 17 декабря 2018

Быстрый способ сделать это - указать ось в качестве порядкового поля.Это приведет к очень уродливой оси, с часами, указанными для каждого тика.Чтобы изменить это, я добавляю столбец данных в рамку данных с заданной меткой.Я также добавил grid, так как по умолчанию он удаляется для порядкового кодирования, и установил labelAngle в 0.

df2 = df.assign(label=index.strftime('%b %d %y'))

alt.Chart(df2).mark_line().encode(
    x=alt.X('label:O', axis=alt.Axis(grid=True, labelAngle=0)),
    y='Y:Q'
)

altair-chart-ordinal-axis

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


Чтобы настроить ось, мы можем создать ее с помощью mark_text и вернуть сетку с помощью mark_ruleи пользовательский фрейм данных.Он не обязательно хорошо масштабируется, но может дать вам некоторые идеи.

df3 = df2.loc[df2.index.dayofweek == 0, :].copy()
df3["Y"] = 0

text_chart = alt.Chart(df3).mark_text(dy = 15).encode(
    x=alt.X('label:O', axis = None),
    y=alt.Y('Y:Q'),
    text=alt.Text('label:O')
)

tick_chart = alt.Chart(df3).mark_rule(color='grey').encode(
    x=alt.X('label:O', axis=None),
)

line_chart = alt.Chart(df2).mark_line().encode(
    x=alt.X('label:O', axis=None, scale=alt.Scale(rangeStep=15)),
    y='Y:Q'
)
text_chart + tick_chart + line_chart 

enter image description here

...