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(2): ele = dict() ele['年报期'] = bs[i]['报告期'] 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['应收账款周转率'] = acrt(ps[i]['营业收入'], bs[i]['应收账款']) ele['存货周转率'] = ivtt(ps[i]['营业成本'], bs[i]['存货'], bs[i+1]['存货']) 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['营业增长率'] = bgr(ps[i]['营业收入'], ps[i+1]['营业收入']) ele['总资产增长率'] = tagr(bs[i]['资产总计'], bs[i+1]['资产总计']) 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['信用评分'] = benchmark - self.risk_score['经营风险']['合计'] - self.risk_score['关联风险']['合计'] 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('企业', '指标明细', {"企业名称": self.company, "年报期": item['年报期']}, item) if __name__ == '__main__': data = read_json_file(file_path('/static/test_data/demo01.json')) model = RatingModel(data) # model.save_result()