桑吉图(sankey)
1.1 数据格式
桑吉图的数据格式分为两个部门,分别为nodes和links
- nodes为所有类别的集合,数据的格式将字典通过列表进行封装
- links是【子类-父类-数值】的集合,字典的key对应的名称为【'source(来源)','target(目标)','value'】
1.2 数据样式
nodes = [
{'name':'支出'},
{'name':'水果'},
{'name':'苹果'},
{'name':'橘子'},
{'name':'交通工具'},
{'name':'自行车'}
]
links = [
{'source':'水果','target':'支出','value':50},
{'source':'交通工具','target':'支出','value':50},
{'source':'苹果','target':'水果','value':25},
{'source':'橘子','target':'水果','value':25},
{'source':'自行车','target':'交通工具','value':50}
]
1.3 数据转换代码
原始数据传入必须为df的格式,注意事项,数据从左到右,数据必须是遵循父类到子类,样表如下
根节点 | 一级节点 | 二级节点 | 值 |
支出 | 交通工具 | 自行车 | 50 |
支出 | 水果 | 苹果 | 25 |
支出 | 水果 | 橘子 | 25 |
转换的函数如下:
import numpy as np
import pandas as pd
def sankey_data(df):
nodes = []
col = df.columns[0:-1]
for i in col:
for w in df[i].unique():
dic = {}
dic['name'] = w
nodes.append(dic)
col_name = ['target', 'source', 'value']
dff = pd.DataFrame(columns=col_name)
for w in range(len(col) - 1):
index_list = list(col[w:w + 2])
df1 = pd.pivot_table(df, index=index_list, aggfunc=np.sum)
df1 = df1.reset_index()
df1.columns = col_name
dff = dff.append(df1)
dff.value = dff.value.astype('int')
dff = dff[['source', 'target', 'value']]
links = dff.to_dict('records')
return nodes,links