Dataframe в диаграмму Санки - PullRequest
       155

Dataframe в диаграмму Санки

0 голосов
/ 07 августа 2020

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

   id  begin_date   status  
   1   01.02.2020   a       
   1   10.02.2020   b       
   1   17.02.2020   c       
   2   02.02.2020   d       
   2   06.03.2020   b       
   2   17.04.2020   c    

Для ваших экспериментов:

pd.DataFrame([[1, '2020-02-01', 'a'], [1, '2020-02-10', 'b'], [1, '2020-02-17', 'c'], [2, '2020-02-02', 'd'], [2, '2020-03-06', 'b'],[2, '2020-04-17', 'c']], columns=['id', 'begin_date', 'status'])

Посмотрев на это объяснение: Нарисуйте Санки Диаграмма из фрейма данных Я хочу построить фрейм данных «Исходное-целевое-значение», выглядящий следующим образом. Чтобы лучше понять, я не преобразовывал Source и Target в целые числа.

# with Source = previous status
# with Target = next status
# with Value = count of IDs that transition from Source to Target
Source  Target      Value      Link Color
     a       b          1      rgba(127, 194, 65, 0.2)
     b       c          2      rgba(127, 194, 65, 0.2)
     d       b          1      rgba(211, 211, 211, 0.5)

Проблема заключается в генерации Source, Target и Value. Source и Target должны быть переходом статуса с a на b. Value - это количество id, выполняющих этот переход.

Как лучше всего это сделать?

РЕДАКТИРОВАТЬ: Используя онлайн-генератор, результат будет выглядеть следующим образом : введите описание изображения здесь

1 Ответ

0 голосов
/ 07 августа 2020

Нашел ответ!

# assuming df is sorted by begin_date
import pandas as pd
df = pd.read_csv(r"path")
dfs = []
unique_ids = df["id"].unique()
for uid in unique_ids:
    df_t = df[df["id"] == uid].copy()
    df_t["status_next"] = df_t["status"].shift(-1)
    df_t["status_append"] = df_t["status"] +  df_t["status_next"]
    df_t = df_t.groupby("status_append").agg(Value=("status_append","count")).reset_index()
    dfs.append(df_t)

df = pd.concat(dfs, ignore_index=True)
df = df.groupby("status_append").agg(Value=("Value","sum")).reset_index()

df["Source"] = df['status_append'].astype(str).str[0]
df["Target"] = df['status_append'].astype(str).str[1]
df = df.drop("status_append", axis=1)
df = df[["Source", "Target", "Value"]]

дает

Source  Target  Value
a            b      1
b            c      2
d            b      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...