财务模型¶
财务模型元素是对财务模型,财务Cube,电子表格的二次封装,主要提供对财务Cube数据的增删查操作接口。
[2]:
from deepfos.element.finmodel import FinancialCube
实例化财务模型¶
在系统中创建财务模型Ana_Cube
如下,就可以通过财务模型的基本信息初始化财务模型对象。
[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}')
。