217 lines
7.9 KiB
Python
217 lines
7.9 KiB
Python
import copy
|
|
import time
|
|
|
|
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
|
|
|
|
|
|
class RatingModel:
|
|
"""
|
|
综合信用评价模型
|
|
"""
|
|
|
|
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['企业名称']
|
|
self.industry = param['行业选择']
|
|
self.period = param['评价年度']
|
|
self.questionnaire = param['经营问卷']
|
|
self.financial_statement = param['财务填报']
|
|
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()
|
|
|
|
def calculate_financial_indicators(self):
|
|
"""
|
|
计算财务指标
|
|
Parameters:
|
|
bs dict 近三年资产负债表
|
|
ps dict 近三年利润表
|
|
sds dict 近三年补充数据表
|
|
Returns:
|
|
financial_indicators list 进两年财务指标
|
|
"""
|
|
# Parameters
|
|
bs = self.financial_statement['资产负债表']
|
|
ps = self.financial_statement['利润表']
|
|
sds = self.financial_statement['补充数据表']
|
|
|
|
# Returns
|
|
financial_indicators = list()
|
|
|
|
# main
|
|
for i in range(3):
|
|
ele = dict()
|
|
ele['年报期'] = bs[i]['报告期']
|
|
|
|
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
|
|
|
|
def calculate_business_elements_score(self):
|
|
"""
|
|
计算经营要素得分
|
|
Parameters:
|
|
level_1_industry str 一级行业
|
|
Returns:
|
|
score dict 分数
|
|
"""
|
|
# main
|
|
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])
|
|
industry = self.industry[1]
|
|
|
|
# main
|
|
elements.pop('年报期') # 计算指标分数前移除年报期字段
|
|
score = financial_score(industry, elements)
|
|
|
|
return score
|
|
|
|
def calculate_risk_score(self):
|
|
"""
|
|
计算风险得分
|
|
Parameters
|
|
-
|
|
Returns
|
|
-
|
|
"""
|
|
score = dict()
|
|
dm = self.risk_data
|
|
score['合规风险'] = compliance_risk(dm['合规风险'])
|
|
score['经营风险'] = management_risk(dm['经营风险'])
|
|
score['关联风险'] = peripheral_risk(dm['关联风险'])
|
|
score['合计'] = score['合规风险'] + score['经营风险']['合计'] + score['关联风险']['合计']
|
|
return score
|
|
|
|
def general_rating_result(self):
|
|
"""
|
|
计算综合信用评价结果
|
|
Parameters
|
|
score1 float 经营+财务得分
|
|
score2 float 合规风险得分
|
|
benchmark 调整基准分
|
|
Returns
|
|
result 综合信用得分
|
|
"""
|
|
# Parameter
|
|
score1 = self.financial_score['合计'] + self.operating_score['合计']
|
|
score2 = self.risk_score['合规风险']
|
|
benchmark = score1 if score1 < (100-score2) else (100-33)
|
|
|
|
# Return
|
|
result = dict()
|
|
|
|
# main
|
|
result['评价ID'] = self.eid
|
|
result['企业ID'] = self.cid
|
|
result['企业名称'] = self.company
|
|
result['评价年度'] = self.period
|
|
result['评价方式'] = '企业申报'
|
|
result['评价时间'] = time.strftime("%Y-%m-%d", time.localtime())
|
|
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
|
|
|
|
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):
|
|
"""
|
|
保存评价结果
|
|
"""
|
|
rating_result = self.rating_result
|
|
update_data('评价', '评价结果', {"企业ID": self.cid}, rating_result)
|
|
|
|
def save_indicators(self):
|
|
"""
|
|
保存指标值
|
|
"""
|
|
for item in self.financial_indicators:
|
|
item['企业ID'] = self.cid
|
|
item['企业名称'] = self.company
|
|
update_data('企业', '指标明细', {"企业ID": self.cid, "年报期": item['年报期']}, item)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
data = read_json_file(file_path('/static/test_data/demo01.json'))
|
|
model = RatingModel(data)
|
|
# model.save_result()
|