Скользящее среднее на многослойном граненом графике в Альтаире - PullRequest
1 голос
/ 25 апреля 2020

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

Интуитивное объединение двух дает мне ошибку -

Javascript Error: Cannot read property 'concat' of undefined
This usually means there's a typo in your chart specification. See the javascript console for the full traceback.

Код (дает вышеуказанную ошибку):

# Data Preparation
df = pd.read_csv('https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv')
idf = df[df['Country/Region'] == 'India']
idf = idf[df.columns[4:]]
idf = idf.T
idf = idf.reset_index()
idf.columns = ['day', 'case']
idf['country'] = 'india'

gdf = df[df['Country/Region'] == 'Germany']
gdf = gdf[df.columns[4:]]
gdf = gdf.T
gdf = gdf.reset_index()
gdf.columns = ['day', 'case']
gdf['country'] = 'germany'

fdf = pd.concat([idf,gdf])

# Charting
a = alt.Chart().mark_bar(opacity=0.5).encode(
    x='day:T',
    y='case:Q'
)

c = alt.Chart().mark_line().transform_window(
    rolling_mean='mean(case:Q)',
    frame=[-7, 0]
).encode(
    x='day:T',
    y='rolling_mean:Q'
)

alt.layer(a, c, data=fdf).facet(alt.Column('country', sort=alt.EncodingSortField('case', op='max', order='descending')))

Если вы удалите transform_window и замените y='rolling_mean:Q' на y='case:Q', вы получите многослойный граненый график. Именно на этом графике я хочу получить скользящее среднее значение за 7 дней.

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Вы должны заменить свое оконное преобразование следующим:

.transform_window(
    rolling_mean='mean(case)',
    frame=[-7, 0],
    groupby=['country']
)

При исходном преобразовании возникли две проблемы:

  • сокращения типа используются только в кодировках, никогда не трансформируется. Когда вы писали mean(case:Q), вы указывали скользящее среднее для поля с именем "case:Q", которого не существует.

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

Результат выглядит так: enter image description here

1 голос
/ 26 апреля 2020

Попробуйте использовать transform_window с помощью sort = [{'field': 'date'}] https://vega.github.io/vega-lite/docs/window.html#cumulative -частотное распределение

Или: https://altair-viz.github.io/gallery/scatter_marginal_hist.html

https://altair-viz.github.io/gallery/layered_chart_with_dual_axis.html#layered - диаграмма с двойной осью

https://altair-viz.github.io/gallery/parallel_coordinates.html#parallel - пример координат

import altair as alt
from vega_datasets import data

source = data.iris()

alt.Chart(source).transform_window(
    index='count()'
).transform_fold(
    ['petalLength', 'petalWidth', 'sepalLength', 'sepalWidth']
).mark_line().encode(
    x='key:N',
    y='value:Q',
    color='species:N',
    detail='index:N',
    opacity=alt.value(0.5)
).properties(width=500)

https://altair-viz.github.io/user_guide/compound_charts.html?highlight=repeat#horizontal -конкатенация

import altair as alt
from vega_datasets import data

iris = data.iris.url

chart1 = alt.Chart(iris).mark_point().encode(
    x='petalLength:Q',
    y='petalWidth:Q',
    color='species:N'
).properties(
    height=300,
    width=300
)

chart2 = alt.Chart(iris).mark_bar().encode(
    x='count()',
    y=alt.Y('petalWidth:Q', bin=alt.Bin(maxbins=30)),
    color='species:N'
).properties(
    height=300,
    width=100
)
...