tfse-model-api-v0.2/Rating/RatingModel.py

217 lines
7.9 KiB
Python
Raw Normal View History

import copy
import time
2021-12-15 00:17:04 +08:00
from Rating.db import update_data
from Rating.scripts.financial_score import financial_score
from Rating.scripts.operating_score.Manufacturing import manufacturing
from Rating.scripts.risk_score import *
from Rating.scripts.Indicators import *
from common.scripts import read_json_file, file_path
2021-12-07 15:28:49 +08:00
class RatingModel:
"""
综合信用评价模型
2021-12-07 15:28:49 +08:00
"""
def __init__(self, param):
"""
模型初始化方法
Parameters
param dict 数据模板
eid str 评价ID
cid str 企业ID
company str 企业名称
industry str 所属行业
period str 评价年度
questionnaire dict 经营问卷
financial_statement dict 财务填报数据
risk_data dict 风险数据
financial_indicators list 财务指标
"""
# Parameters
self.eid = param['评价ID']
self.cid = param['企业ID']
self.company = param['企业名称']
2021-12-15 10:30:36 +08:00
self.industry = param['行业选择']
2021-12-07 15:28:49 +08:00
self.period = param['评价年度']
self.questionnaire = param['经营问卷']
self.financial_statement = param['财务填报']
2021-12-07 15:28:49 +08:00
self.risk_data = param['风险数据']
self.financial_indicators = self.calculate_financial_indicators()
self.operating_score = self.calculate_business_elements_score()
self.financial_score = self.calculate_financial_elements_score()
self.risk_score = self.calculate_risk_score()
self.rating_result = self.general_rating_result()
2021-12-07 15:28:49 +08:00
def calculate_financial_indicators(self):
2021-12-07 15:28:49 +08:00
"""
计算财务指标
Parameters:
bs dict 近三年资产负债表
ps dict 近三年利润表
sds dict 近三年补充数据表
Returns:
financial_indicators list 进两年财务指标
2021-12-07 15:28:49 +08:00
"""
# Parameters
bs = self.financial_statement['资产负债表']
ps = self.financial_statement['利润表']
sds = self.financial_statement['补充数据表']
2021-12-07 15:28:49 +08:00
# Returns
financial_indicators = list()
# main
2021-12-16 17:03:45 +08:00
for i in range(3):
ele = dict()
ele['年报期'] = bs[i]['报告期']
2021-12-16 17:03:45 +08:00
if i == 2:
ele['净资产收益率'] = None
ele['总资产报酬率'] = None
ele['总资产周转率'] = None
ele['存货周转率'] = None
ele['营业增长率'] = None
ele['总资产增长率'] = None
else:
ele['净资产收益率'] = roe(ps[i]['净利润'], bs[i]['所有者权益合计'], bs[i+1]['所有者权益合计'])
ele['总资产报酬率'] = roa(ps[i]['利润总额'], sds[i]['计入财务费的利息支出'], bs[i]['资产总计'], bs[i+1]['资产总计'])
ele['总资产周转率'] = tat(ps[i]['营业收入'], bs[i]['资产总计'], bs[i+1]['资产总计'])
ele['存货周转率'] = ivtt(ps[i]['营业成本'], bs[i]['存货'], bs[i + 1]['存货'])
ele['营业增长率'] = bgr(ps[i]['营业收入'], ps[i + 1]['营业收入'])
ele['总资产增长率'] = tagr(bs[i]['资产总计'], bs[i + 1]['资产总计'])
ele['应收账款周转率'] = acrt(ps[i]['营业收入'], bs[i]['应收账款'])
ele['资产负债率'] = dbar(bs[i]['负债合计'], bs[i]['资产总计'])
ele['已获利息倍数'] = icm(ps[i]['利润总额'], sds[i]['计入财务费的利息支出'], sds[i]['资本化利息支出'], bs[i]['短期借款'], bs[i]['长期借款'])
ele['速动比率'] = qkr(bs[i]['流动资产合计'], bs[i]['存货'], bs[i]['流动负债合计'])
ele['技术投入比率'] = tio(sds[i]['研发费用'], ps[i]['营业收入'])
financial_indicators.append(ele)
return financial_indicators
2021-12-07 15:28:49 +08:00
def calculate_business_elements_score(self):
"""
计算经营要素得分
Parameters:
level_1_industry str 一级行业
Returns:
score dict 分数
"""
# main
2021-12-15 09:56:29 +08:00
level_1_industry = self.industry[0]
if level_1_industry == '制造业':
score = manufacturing(self.questionnaire)
else:
score = {"环境": 0, "社会责任": 0, "公司治理": 0, "合计": 0}
return score
def calculate_financial_elements_score(self):
"""
计算财务要素指标得分
Parameters:
elements dict 近一年财务指标
industry str 所属行业
Returns:
score dict 财务要素得分
"""
# Parameters
elements = copy.deepcopy(self.financial_indicators[0])
2021-12-15 09:56:29 +08:00
industry = self.industry[1]
# main
elements.pop('年报期') # 计算指标分数前移除年报期字段
score = financial_score(industry, elements)
2021-12-07 15:28:49 +08:00
return score
def calculate_risk_score(self):
2021-12-07 15:28:49 +08:00
"""
计算风险得分
Parameters
-
Returns
-
2021-12-07 15:28:49 +08:00
"""
score = dict()
dm = self.risk_data
score['合规风险'] = compliance_risk(dm['合规风险'])
2021-12-07 15:28:49 +08:00
score['经营风险'] = management_risk(dm['经营风险'])
score['关联风险'] = peripheral_risk(dm['关联风险'])
score['合计'] = score['合规风险'] + score['经营风险']['合计'] + score['关联风险']['合计']
2021-12-07 15:28:49 +08:00
return score
def general_rating_result(self):
2021-12-07 15:28:49 +08:00
"""
计算综合信用评价结果
Parameters
score1 float 经营+财务得分
score2 float 合规风险得分
benchmark 调整基准分
Returns
result 综合信用得分
2021-12-07 15:28:49 +08:00
"""
# Parameter
score1 = self.financial_score['合计'] + self.operating_score['合计']
score2 = self.risk_score['合规风险']
benchmark = score1 if score1 < (100-score2) else (100-33)
# Return
2021-12-07 15:28:49 +08:00
result = dict()
# main
result['评价ID'] = self.eid
result['企业ID'] = self.cid
result['企业名称'] = self.company
2021-12-07 15:28:49 +08:00
result['评价年度'] = self.period
result['评价方式'] = '企业申报'
result['评价时间'] = time.strftime("%Y-%m-%d", time.localtime())
2021-12-15 10:54:10 +08:00
result['信用评分'] = round(benchmark - self.risk_score['经营风险']['合计'] - self.risk_score['关联风险']['合计'], 2)
result['信用等级'] = self.score_rank(result['信用评分'])
result['经营评分'] = self.operating_score
result['财务评分'] = self.financial_score
result['风险评分'] = self.risk_score
2021-12-07 15:28:49 +08:00
return result
@staticmethod
def score_rank(param):
"""
计算信用级别
Parameters
param float 综合信用评价分数
rank_ref dict 信用级别参考
level string 信用级别
"""
rank_refer = read_json_file(file_path('/Rating/static/rank.json'))
result = "C" # 初始级别设为C
for level in rank_refer.keys():
if param >= rank_refer[level]:
result = level
break
return result
def save_result(self):
"""
保存评价结果
"""
2021-12-15 00:17:04 +08:00
rating_result = self.rating_result
update_data('评价', '评价结果', {"企业ID": self.cid}, rating_result)
def save_indicators(self):
"""
保存指标值
"""
2021-12-15 00:17:04 +08:00
for item in self.financial_indicators:
item['企业ID'] = self.cid
item['企业名称'] = self.company
update_data('企业', '指标明细', {"企业ID": self.cid, "年报期": item['年报期']}, item)
2021-12-07 15:28:49 +08:00
if __name__ == '__main__':
2021-12-16 17:03:45 +08:00
data = read_json_file(file_path('/static/test_data/demo01.json'))
2021-12-15 00:17:04 +08:00
model = RatingModel(data)
2021-12-17 15:31:31 +08:00
model.save_result()