财务模型

财务模型元素是对财务模型,财务Cube,电子表格的二次封装,主要提供对财务Cube数据的增删查操作接口。

[2]:
from deepfos.element.finmodel import FinancialCube

实例化财务模型

在系统中创建财务模型Ana_Cube如下,就可以通过财务模型的基本信息初始化财务模型对象。

8ca57d1a473f4aed99b1fa730327809c

[3]:
cube = FinancialCube('Ana_Cube')

说明

和所有其他元素一样,可以使用元素名直接初始化,也可以通过提供folder_id或者path指明元素所在位置(用于有同类重名元素的情况)

获取维度信息

[4]:
dimensions = cube.dimensions
list(dimensions.keys())
[4]:
['year', 'Entity', 'Version', 'Category', 'Account', 'Scenario', 'period']

查询数据

使用cube.query方法进行数据查询。 该方法的第一个入参为维度表达式,第二个参数为pov(可以是字典格式或者维度表达式)。 默认返回一个二元组,分别是数据和pov

[5]:
pov={
    'Scenario': 'Actual',
    'category': 'Var_Cost_01_01b'
}
data, return_pov = cube.query("year{2018;2019}->Entity{firm1}", pov=pov)
data
[5]:
period data year version account
0 1 347.0 2018 WorkVersion con_Fee
1 1 347.0 2019 WorkVersion con_Fee
2 1 214.0 2019 WorkVersion Cost
3 1 214.0 2018 WorkVersion Cost
4 1 13.0 2019 WorkVersion Pri
5 1 13.0 2018 WorkVersion Pri
6 1 2133.0 2018 WorkVersion con_Qua
7 1 2133.0 2019 WorkVersion con_Qua
8 1 24.0 2019 WorkVersion Con
9 1 24.0 2018 WorkVersion Con
[6]:
return_pov
[6]:
{'scenario': 'Actual', 'category': 'Var_Cost_01_01b', 'entity': 'firm1'}

说明

出于性能考虑,query在内部会尝试将维度表达式中的pov分离出来。因此上述例子完全等价于

data, return_pov = cube.query(
    "year{2018;2019}->Entity{firm1}"
    "category{Var_Cost_01_01b}->scenario{Actual}"
)

为了保证查询数据的有效性,对于维度表达式中没有出现的维度,query内部会使用Dimension{Base(#root,0)}进行补充。因此上述例子等价于:

data, return_pov = cube.query(
    "year{2018;2019}->Entity{firm1}->"
    "category{Var_Cost_01_01b}->scenario{Actual}->"
    "Account{Base(#root,0)}->period{Base(#root,0)}->"
    "Version{Base(#root,0)}"
)

如果希望pov的数据也合并到DataFrame中,可以指定compact=False

[7]:
cube.query("year{2018;2019}->Entity{firm1}", pov=pov, compact=False)
[7]:
period data year version account scenario category entity
0 1 347.0 2018 WorkVersion con_Fee Actual Var_Cost_01_01b firm1
1 1 347.0 2019 WorkVersion con_Fee Actual Var_Cost_01_01b firm1
2 1 214.0 2019 WorkVersion Cost Actual Var_Cost_01_01b firm1
3 1 214.0 2018 WorkVersion Cost Actual Var_Cost_01_01b firm1
4 1 13.0 2019 WorkVersion Pri Actual Var_Cost_01_01b firm1
5 1 13.0 2018 WorkVersion Pri Actual Var_Cost_01_01b firm1
6 1 2133.0 2018 WorkVersion con_Qua Actual Var_Cost_01_01b firm1
7 1 2133.0 2019 WorkVersion con_Qua Actual Var_Cost_01_01b firm1
8 1 24.0 2019 WorkVersion Con Actual Var_Cost_01_01b firm1
9 1 24.0 2018 WorkVersion Con Actual Var_Cost_01_01b firm1

注意

此时返回值只有一个DataFrame,不再包含pov

如果希望将某一维度的成员放到列上,可以指定pivot_dim='{DimensinoName}'

[8]:
pivot_data, return_pov = cube.query(
    "year{2018;2019}->Entity{firm1}",
    pov=pov,
    pivot_dim='account'
)

pivot_data
[8]:
period version year Con Cost Pri con_Fee con_Qua
0 1 WorkVersion 2018 24.0 214.0 13.0 347.0 2133.0
1 1 WorkVersion 2019 24.0 214.0 13.0 347.0 2133.0

保存数据

保存接口接收一个DataFrame作为数据源,另外有可选参数pov,在保存数据前,pov的数据会被合并至DataFrame

[9]:
save_data = data.loc[data.year == '2018'].copy()

save_data['year'] = '2017'
save_data
[9]:
period data year version account
0 1 347.0 2017 WorkVersion con_Fee
3 1 214.0 2017 WorkVersion Cost
5 1 13.0 2017 WorkVersion Pri
6 1 2133.0 2017 WorkVersion con_Qua
9 1 24.0 2017 WorkVersion Con
[10]:
cube.save(data, pov=return_pov)
[10]:
[{'rowDatas': [],
  'commonMember': None,
  'sheetId': None,
  'cubeId': None,
  'cubeName': None,
  'cubeFolderId': None,
  'cubePath': None,
  'sheetType': None,
  'formListDTO': None,
  'commonErrorMsgList': None}]

说明

保存的DataFrame需要符合特定格式,数据列需要是data(或者通过data_column参数指定),DataFrame加上pov必须包含所有的维度。

数据中列名为维度名的列会被重命名为数据表的列名,不需要手动转换。

为了方便计算,在取数时经常会需要指定 pivot_dim 将成员翻转到列上,对于这种类型的DataFrame,可以使用 save_unpivot 方法直接保存。

[11]:
save_pivot_data = pivot_data.query("year=='2018'").copy()
save_pivot_data['year'] = '2016'
save_pivot_data
[11]:
period version year Con Cost Pri con_Fee con_Qua
0 1 WorkVersion 2016 24.0 214.0 13.0 347.0 2133.0
[12]:
cube.save_unpivot(save_pivot_data, unpivot_dim='Account', pov=return_pov)
[12]:
[{'rowDatas': [],
  'commonMember': None,
  'sheetId': None,
  'cubeId': None,
  'cubeName': None,
  'cubeFolderId': None,
  'cubePath': None,
  'sheetType': None,
  'formListDTO': None,
  'commonErrorMsgList': None}]

删除数据

使用cube.delete方法可以删除cube数据,该方法接收一个维度表达式或者维度->成员/表达式的字典。

[13]:
cube.delete({'year': ['2016', '2017'], 'entity': 'firm2'})
[13]:
ResultObj(map=None, resultCode=0, resultList=None, resultObj=None, resultString=None, set=None, tipMsg='更新或删除:delete success')

说明

上述调用等价于: cube.delete('year{2016;2017}->entity{firm2}')