Как построить отношение категориального столбца в наборе данных полной формы? - PullRequest
1 голос
/ 04 мая 2020

У меня есть набор данных полной формы со столбцами type и date. type имеет две категории gold и silver. Я хотел бы построить соотношение двух по дате. Для этого должна произойти серия преобразований. Они выглядят так в pandas

mock_df = df.groupby(["date"])["type"].value_counts().unstack()
mock_df["gs_ratio"] = mock_df["gold"]/mock_df["silver"]
mock_df

enter image description here

Данные

import pandas

df = pd.DataFrame.from_records([
    {"date": "2020-04-20", "type": "gold"},
    {"date": "2020-04-20", "type": "silver"},
    {"date": "2020-04-20", "type": "silver"},
    {"date": "2020-04-21", "type": "gold"},
    {"date": "2020-04-21", "type": "gold"},
    {"date": "2020-04-21", "type": "silver"},
    {"date": "2020-04-22", "type": "gold"},
    {"date": "2020-04-22", "type": "silver"},
    {"date": "2020-04-22", "type": "silver"},
    {"date": "2020-04-22", "type": "silver"}
])

df

enter image description here

Код пробовал:

alt.Chart(df).transform_joinaggregate(
    gs_count='count(type)',
    groupby=["date:T"]
).transform_pivot(
    'type',
    groupby=['date:T'],
    value='gs_count'
).transform_calculate(
    gs_ratio="datum.gold/datum.silver"
).mark_line().encode(
    x='date:T',
    y="gs_ratio:Q"
)

enter image description here

1 Ответ

1 голос
/ 04 мая 2020

В вашем подходе было несколько проблем:

  • Вы не можете использовать сокращения типа в преобразованиях. Таким образом, вы должны использовать фактическое имя столбца, "date" вместо "date:T"
  • count(type) не эквивалентно df.type.value_counts(). Вам нужно использовать count(), сгруппированные по type.
  • , использовать transform_aggregate вместо transform_joinaggregate

Соедините это вместе:

alt.Chart(df).transform_aggregate(
    gs_count='count()',
    groupby=["date", "type"]
).transform_pivot(
    'type',
    groupby=['date'],
    value='gs_count'
).transform_calculate(
    gs_ratio="datum.gold/datum.silver"
).mark_line().encode(
    x='date:T',
    y="gs_ratio:Q"
)

enter image description here

...