From 57d7b6d1654e00588deecfdab75604d595a18783 Mon Sep 17 00:00:00 2001 From: P3ngSaM <61768364+P3ngSaM@users.noreply.github.com> Date: Wed, 20 Apr 2022 17:00:34 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E5=87=86=E5=A4=87=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E4=B8=BB=E9=A1=B5=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3=E9=87=8D?= =?UTF-8?q?=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CompanyData/CompanyDataImpl.py | 214 +++++++++++-- CompanyData/CompanyDataObj.py | 516 +++++++++++++++++++++---------- CompanyData/CompanyDataRoutes.py | 13 +- Utils/ValidateUtil.py | 30 +- 4 files changed, 572 insertions(+), 201 deletions(-) diff --git a/CompanyData/CompanyDataImpl.py b/CompanyData/CompanyDataImpl.py index 8f69c2d..4e6ad20 100644 --- a/CompanyData/CompanyDataImpl.py +++ b/CompanyData/CompanyDataImpl.py @@ -1,12 +1,13 @@ import json import time - import requests +import pandas as pd from DBHelper.MongoHelper import MongoHelper from Utils.ErrorUtil import LogConditionCheckFailed from CompanyData.CompanyDataObj import CompanyData, BasicInfo, ShareHolder, MainMember, ComprehensiveCreditAnalysis, \ - CreditPerformance, MaxScore, IndicatorRadar, IndexScore, CreditAnalysis + FinancialElementsAnalysis, BusinessElementsAnalysis +from common.utils import sub_dict, df_iterrows class CompanyDataImpl(CompanyData): @@ -80,12 +81,16 @@ class CompanyDataImpl(CompanyData): for result in results: share_holder = ShareHolder() share_holder.name = result['name'] - share_holder.share_holder_type = "公司" if result['type'] == 1 else ("个人" if result['type'] == 2 else "其他") + share_holder.share_holder_type = "公司" if result['type'] == 1 else ( + "个人" if result['type'] == 2 else "其他") if result.__contains__('capital'): - share_holder.share_holding_ratio = None if result['capital'][0]['percent'] == '' else result['capital'][0]['percent'] - share_holder.subscription_amount = None if result['capital'][0]['amomon'] == '' else result['capital'][0]['amomon'] - share_holder.subscription_date = None if result['capital'][0]['time'] == '' else result['capital'][0]['time'] + share_holder.share_holding_ratio = None if result['capital'][0]['percent'] == '' else \ + result['capital'][0]['percent'] + share_holder.subscription_amount = None if result['capital'][0]['amomon'] == '' else \ + result['capital'][0]['amomon'] + share_holder.subscription_date = None if result['capital'][0]['time'] == '' else \ + result['capital'][0]['time'] else: share_holder.share_holding_ratio = None share_holder.subscription_amount = None @@ -175,12 +180,11 @@ class CompanyDataImpl(CompanyData): __main__() -class CompanyIndexImpl(ComprehensiveCreditAnalysis): - """企业主页数据实现类""" +class CreditAnalysisImpl(ComprehensiveCreditAnalysis): + """综合信用分析类""" db = MongoHelper("tfse_v0.21") def cc_rating_etl(self): - """准备综合评价信息数据""" rating_record = self.db.find_single_data( '企业数据', '评价记录', @@ -193,12 +197,19 @@ class CompanyIndexImpl(ComprehensiveCreditAnalysis): {"评价ID": self.rid}, ["企业ID", "企业名称", "经营评分", "财务评分", "风险评分", "评价年度"] ) + rating_results = self.db.find_all_data( + '综信评价数据', + '评价结果', + {"企业ID": rating_result['企业ID']}, + ['信用等级', "信用评分", '评价时间', "评价方式"] + ) text_model = self.db.find_single_data( '综信评价数据', '报告数据', {"评价ID": self.rid}, ["行业选择", "报告内容"] ) + df_records = pd.DataFrame(rating_results).sort_values('评价时间', ascending=False) def result_head(): """结果数据""" @@ -207,8 +218,10 @@ class CompanyIndexImpl(ComprehensiveCreditAnalysis): self.update_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) def make_radar_chart(): + credit_performence = self.CreditPerformance() + indicator_radar = credit_performence.IndicatorRadar() """综合信用指标表现雷达图数据""" - max_score = MaxScore() + max_score = indicator_radar.MaxScore() max_score.environment = 10 max_score.social_responsibility = 10 max_score.corporate_governance = 16 @@ -220,7 +233,7 @@ class CompanyIndexImpl(ComprehensiveCreditAnalysis): max_score.cperational_risk = 10 max_score.associated_risk = 10 - index_score = IndexScore() + index_score = indicator_radar.IndexScore() index_score.environment = rating_result['经营评分']["环境"] index_score.social_responsibility = rating_result['经营评分']["社会责任"] index_score.corporate_governance = rating_result['经营评分']["公司治理"] @@ -232,15 +245,14 @@ class CompanyIndexImpl(ComprehensiveCreditAnalysis): index_score.cperational_risk = round(10 - rating_result['风险评分']["经营风险"]['合计'], 2) index_score.associated_risk = round(10 - rating_result['风险评分']["关联风险"]['合计'], 2) - indicator_radar = IndicatorRadar() - indicator_radar.max_score = index_score.dict_to_save() - indicator_radar.max_score = max_score.dict_to_save() - credit_performence = CreditPerformance() - credit_performence.indicator_radar = indicator_radar.dict_to_save() - self.performance = credit_performence.dict_to_save() + indicator_radar.index_score = index_score + indicator_radar.max_score = max_score + credit_performence.indicator_radar = indicator_radar + self.performance = credit_performence def credit_analysis_content(): """综合评价分析中信用分析数据""" + def business_analysis_content(): """经营分析""" describe = text_model['报告内容'][1]['章节内容'][0]['小节内容'][1]['段落'] @@ -285,22 +297,176 @@ class CompanyIndexImpl(ComprehensiveCreditAnalysis): describe = ''.join(describe) return describe - credit_analysis = CreditAnalysis() + credit_analysis = self.CreditAnalysis() credit_analysis.management_analysis = business_analysis_content() credit_analysis.finance_analysis = financial_analysis_content() credit_analysis.risk_analysis = risk_analysis_content() credit_analysis.evaluation_opinion = evaluation_comments_content() - credit_analysis.view_report = '/file/get_company_report?file_id={}'.format(rating_record['报告fid']) - self.credit_analysis = credit_analysis.dict_to_save() + credit_analysis.view_report = '/file/get_company_report?file_id={}'.format(rating_record['报告fid']) + self.credit_analysis = credit_analysis def rating_history(): """历史级别""" + df_records['变化趋势'] = (df_records['信用评分'] - df_records['信用评分'].shift(-1)).apply( + lambda x: '下降' if x < 0 else ('上升' if x > 0 else ('维持' if x == 0 else '-'))) + history_list = list(json.loads(df_records[['信用等级', "信用评分", '评价时间', "评价方式", "变化趋势"]].T.to_json()).values()) + self.history_level = list() + for item in history_list: + history_level = self.HistoryLevel() + history_level.credit_rating = item['信用等级'] + history_level.credit_score = item['信用评分'] + history_level.evaluation_time = item['评价时间'] + history_level.evaluation_method = item['评价方式'] + history_level.change_trend = item['变化趋势'] + self.history_level.append(history_level.dict_to_save()) + + def rating_index_analysis(): + """指标表格""" + index_table = self.IndexTable() + + def financial(): + """财务指标""" + financial_dict = dict() + financial_dict['盈利能力'] = rating_result['财务评分']['盈利能力']['合计'] + financial_dict['资产质量'] = rating_result['财务评分']['资产质量']['合计'] + financial_dict['债务风险'] = rating_result['财务评分']['债务风险']['合计'] + financial_dict['经营增长'] = rating_result['财务评分']['经营增长']['合计'] + df_financial = pd.DataFrame( + {'实际值': financial_dict, '最大值': {"盈利能力": 16, "资产质量": 18, "债务风险": 18, "经营增长": 18}}) + financial_dict = json.loads((df_financial['实际值'] / df_financial['最大值']).apply( + lambda x: '优' if x >= 1 else ( + '良' if x >= 0.75 else ('中' if x >= 0.5 else ('低' if x >= 0.25 else '差')))).to_json()) + financial_index = index_table.FinancialIndicators() + financial_index.profitability = financial_dict['盈利能力'] + financial_index.asset_quality = financial_dict['资产质量'] + financial_index.debt_risk = financial_dict['债务风险'] + financial_index.operating_growth = financial_dict['经营增长'] + index_table.financial_indicators = financial_index + + def risks(): + """风险指标""" + risk_dict = dict() + risk_dict['合规风险'] = 43 - rating_result['风险评分']['合规风险'] + risk_dict['经营风险'] = 10 - rating_result['风险评分']['经营风险']['合计'] + risk_dict['关联风险'] = 10 - rating_result['风险评分']['关联风险']['合计'] + df_risks = pd.DataFrame({'实际值': risk_dict, '最大值': {"合规风险": 43, "经营风险": 10, "关联风险": 10}}) + risk_dict = json.loads((df_risks['实际值'] / df_risks['最大值']).apply(lambda x: '优' if x >= 1 else ( + '良' if x >= 0.75 else ('中' if x >= 0.5 else ('低' if x >= 0.25 else '差')))).to_json()) + risk_index = index_table.RiskIndicators() + risk_index.compliance_risk = risk_dict['合规风险'] + risk_index.operational_risk = risk_dict['经营风险'] + risk_index.associated_risk = risk_dict['关联风险'] + index_table.risk_indicators = risk_index + + def operate(): + """经营指标""" + df_operate = pd.DataFrame( + {'实际值': sub_dict(rating_result['经营评分'], ['环境', '社会责任', '公司治理']), + '最大值': {'环境': 10, '社会责任': 10, '公司治理': 10}}) + operate_dict = json.loads((df_operate['实际值'] / df_operate['最大值']).apply(lambda x: '优' if x >= 1 else ( + '良' if x >= 0.75 else ('中' if x >= 0.5 else ('低' if x >= 0.25 else '差')))).to_json()) + operate_index = index_table.OperatingIndicators() + operate_index.environmental = operate_dict['环境'] + operate_index.social_responsibility = operate_dict['社会责任'] + operate_index.corporate_governance = operate_dict['公司治理'] + index_table.operating_indicators = operate_index + + financial() + risks() + operate() + self.index_table = index_table + + def _main_(): + result_head() + make_radar_chart() + credit_analysis_content() + rating_history() + rating_index_analysis() + result = self.dict_to_save() + self.db.upsert_single_data( + '企业数据', + '综合信用分析', + {'评价ID': self.rid}, + result + ) + + _main_() - def financial_analysis(self): - """准备财务要素信息""" - pass +class FinancialAnalysisImpl(FinancialElementsAnalysis): + """财务要素分析类""" + db = MongoHelper("tfse_v0.21") + + def financial_analysis_etl(self): + rating_result = self.db.find_single_data( + '综信评价数据', + '评价结果', + {"评价ID": self.rid}, + ["企业ID", "财务评分"] + ) + rating_input = self.db.find_single_data( + '综信评价数据', + '填报数据', + {"评价ID": self.rid}, + ["行业选择", "财务填报"] + ) + industry = rating_input['行业选择'] + search = ["年报期", '净资产收益率', '总资产报酬率', '总资产周转率', + '应收账款周转率', '存货周转率', '资产负债率', '已获利息倍数', + '速动比率', '营业增长率', '总资产增长率', '技术投入比率'] + periods = list( + pd.DataFrame(rating_input['财务填报']['资产负债表']).sort_values('报告期', ascending=False)['报告期'][0:2].values) + df_recent_2year = pd.DataFrame(self.db.find_single_data('综信评价数据', '财指结果', {'企业ID': rating_result['企业ID']}, + search)).sort_values('年报期', ascending=False)[0:2] + df_this = df_recent_2year[0:1] + df_last = df_recent_2year[1:2] + + def result_head(): + """基本信息""" + self.cid = rating_result['企业ID'] + self.report_date = periods[0] + self.update_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + + def index_detail(): + """指标详情""" + index_value = json.loads(df_this[ + ['净资产收益率', '总资产报酬率', '总资产周转率', '应收账款周转率', '存货周转率', '资产负债率', '已获利息倍数', '速动比率', + '营业增长率', '总资产增长率', '技术投入比率']].apply( + lambda x: '{}%'.format(x.values[0]) if '率' in x.name else x.values[0]).T.to_json()) + rate = dict() + rate['净资产收益率'] = rating_result['财务评分']['盈利能力']['净资产收益率'] / 8 + rate['总资产报酬率'] = rating_result['财务评分']['盈利能力']['总资产报酬率'] / 8 + rate['总资产周转率'] = rating_result['财务评分']['资产质量']['总资产周转率'] / 6 + rate['存货周转率'] = rating_result['财务评分']['资产质量']['存货周转率'] / 6 + rate['应收账款周转率'] = rating_result['财务评分']['资产质量']['应收账款周转率'] / 6 + rate['资产负债率'] = rating_result['财务评分']['债务风险']['资产负债率'] / 8 + rate['已获利息倍数'] = rating_result['财务评分']['债务风险']['已获利息倍数'] / 5 + rate['速动比率'] = rating_result['财务评分']['债务风险']['速动比率'] / 5 + rate['营业增长率'] = rating_result['财务评分']['经营增长']['营业增长率'] / 8 + rate['总资产增长率'] = rating_result['财务评分']['经营增长']['总资产增长率'] / 5 + rate['技术投入比率'] = rating_result['财务评分']['经营增长']['技术投入比率'] / 5 + df_rate = pd.DataFrame([rate]) + index_level = json.loads(df_rate.apply(lambda x: '优' if x.values[0] >= 1 else ( + '良' if x.values[0] >= 0.75 else ( + '中' if x.values[0] >= 0.5 else ('低' if x.values[0] >= 0.25 else '差')))).to_json()) + df_index = pd.DataFrame({'值': index_value, "级别": index_level}) + df_list = df_iterrows(df_index) + self.index_details = list() + for item in df_list: + index_details = self.IndexDetails() + index_details.index = item[0] + index_details.value = item[1] + index_details.level = item[2] + self.index_details.append(index_details.dict_to_save()) + + def compare_to_year(): + """财务得分年度比较""" + + + +class BusinessAnalysisImpl(BusinessElementsAnalysis): + """经营要素分析类""" + db = MongoHelper("tfse_v0.21") def risk_analysis_etl(self): - """准备风险要素信息""" pass diff --git a/CompanyData/CompanyDataObj.py b/CompanyData/CompanyDataObj.py index 02e1912..55bc6f8 100644 --- a/CompanyData/CompanyDataObj.py +++ b/CompanyData/CompanyDataObj.py @@ -1,5 +1,5 @@ from Utils.ObjUtil import SpecObject -from Utils.ValidateUtil import ValidateAttr +from Utils.ValidateUtil import ValidateAttr, Validate class BasicInfo(SpecObject): @@ -200,174 +200,164 @@ class CompanyData(SpecObject): """准备企业初始化数据""" -class IndexScore(SpecObject): - """指标得分""" - environment = ValidateAttr(field='environment', type=(int, float)) - social_responsibility = ValidateAttr(field='social_responsibility', type=(int, float)) - corporate_governance = ValidateAttr(field='corporate_governance', type=(int, float)) - profitability = ValidateAttr(field='profitability', type=(int, float)) - asset_quality = ValidateAttr(field='asset_quality', type=(int, float)) - debt_risk = ValidateAttr(field='debt_risk', type=(int, float)) - operational_growth = ValidateAttr(field='operational_growth', type=(int, float)) - compliance_risk = ValidateAttr(field='compliance_risk', type=(int, float)) - cperational_risk = ValidateAttr(field='cperational_risk', type=(int, float)) - associated_risk = ValidateAttr(field='associated_risk', type=(int, float)) - - fields_map = { - "environment": "环境", - "social_responsibility": "社会责任", - "corporate_governance": "公司治理", - "profitability": "盈利能力", - "asset_quality": "资产质量", - "debt_risk": "债务风险", - "operational_growth": "经营增长", - "compliance_risk": "合规风险", - "cperational_risk": "经营风险", - "associated_risk": "关联风险" - } - - -class MaxScore(SpecObject): - """最大分数""" - environment = ValidateAttr(field='environment', type=int) - social_responsibility = ValidateAttr(field='social_responsibility', type=int) - corporate_governance = ValidateAttr(field='corporate_governance', type=int) - profitability = ValidateAttr(field='profitability', type=int) - asset_quality = ValidateAttr(field='asset_quality', type=int) - debt_risk = ValidateAttr(field='debt_risk', type=int) - operational_growth = ValidateAttr(field='operational_growth', type=int) - compliance_risk = ValidateAttr(field='compliance_risk', type=int) - cperational_risk = ValidateAttr(field='cperational_risk', type=int) - associated_risk = ValidateAttr(field='associated_risk', type=int) - - fields_map = { - "environment": "环境", - "social_responsibility": "社会责任", - "corporate_governance": "公司治理", - "profitability": "盈利能力", - "asset_quality": "资产质量", - "debt_risk": "债务风险", - "operational_growth": "经营增长", - "compliance_risk": "合规风险", - "cperational_risk": "经营风险", - "associated_risk": "关联风险" - } - - -class IndicatorRadar(SpecObject): - """指标雷达""" - index_score = ValidateAttr(field='index_score', type=IndexScore) - max_score = ValidateAttr(field='max_score', type=MaxScore) - - fields_map = { - "index_score": "指标得分", - "max_score": "最大分数" - } - - -class CreditPerformance(SpecObject): - """综合信用表现""" - indicator_radar = ValidateAttr(field='indicator_radar', type=IndicatorRadar) - - fields_map = { - "indicator_radar": "指标雷达" - } - - -class CreditAnalysis(SpecObject): - """信用分析""" - management_analysis = ValidateAttr(field='management_analysis', type=str) - finance_analysis = ValidateAttr(field='finance_analysis', type=str) - risk_analysis = ValidateAttr(field='risk_analysis', type=str) - evaluation_opinion = ValidateAttr(field='evaluation_opinion', type=str) - view_report = ValidateAttr(field='view_report', type=str) - - fields_map = { - "management_analysis": "经营分析", - "finance_analysis": "财务分析", - "risk_analysis": "风险分析", - "evaluation_opinion": "评价意见", - "view_report": "查看报告" - } - - -class FinancialIndicators(SpecObject): - """财务指标""" - profitability = ValidateAttr(field='financial_indicators', in_list=['高', '中', '低', '差']) - asset_quality = ValidateAttr(field='asset_quality', in_list=['高', '中', '低', '差']) - debt_risk = ValidateAttr(field='debt_risk', in_list=['高', '中', '低', '差']) - operating_growth = ValidateAttr(field='operating_growth', in_list=['高', '中', '低', '差']) - - fields_map = { - "profitability": "盈利能力", - "asset_quality": "资产质量", - "debt_risk": "债务风险", - "operating_growth": "经营增长" - } - - -class RiskIndicators(SpecObject): - """风险指标""" - compliance_risk = ValidateAttr(field='compliance_risk', in_list=['高', '中', '低', '差']) - operational_risk = ValidateAttr(field='operational_risk', in_list=['高', '中', '低', '差']) - associated_risk = ValidateAttr(field='associated_risk', in_list=['高', '中', '低', '差']) - - fields_map = { - "compliance_risk": "合规风险", - "operational_risk": "经营风险", - "associated_risk": "关联风险" - } - - -class OperatingIndicators(SpecObject): - """经营指标""" - environmental = ValidateAttr(field='environmental', in_list=['高', '中', '低', '差']) - social_responsibility = ValidateAttr(field='social_responsibility', in_list=['高', '中', '低', '差']) - corporate_governance = ValidateAttr(field='corporate_governance', in_list=['高', '中', '低', '差']) - - fields_map = { - "environmental": "环境", - "social_responsibility": "社会责任", - "corporate_governance": "公司治理" - } - - -class IndexTable(SpecObject): - """指标表格""" - financial_indicators = ValidateAttr(field='financial_indicators', type=FinancialIndicators) - risk_indicators = ValidateAttr(field='risk_indicators', type=RiskIndicators) - operating_indicators = ValidateAttr(field='operating_indicators', type=OperatingIndicators) - - fields_map = { - "financial_indicators": "财务指标", - "risk_indicators": "风险指标", - "operating_indicators": "经营指标" - } - - -class HistoryLevel(SpecObject): - """历史级别""" - credit_rating = ValidateAttr(field='credit_rating', type=str) - credit_score = ValidateAttr(field='credit_score', type=(float, int)) - evaluation_time = ValidateAttr(field='evaluation_time', type=str) - evaluation_method = ValidateAttr(field='evaluation_method', type=str, in_list=['企业申报']) - change_trend = ValidateAttr(field='change_trend', type=str) - - fields_map = { - "credit_rating": "信用等级", - "credit_score": "信用评分", - "evaluation_time": "评价时间", - "evaluation_method": "评价方式", - "change_trend": "变化趋势" - } - - class ComprehensiveCreditAnalysis(SpecObject): """综合信用分析""" + + class CreditPerformance(SpecObject): + class IndicatorRadar(SpecObject): + """指标雷达""" + class IndexScore(SpecObject): + """指标得分""" + environment = ValidateAttr(field='environment', type=(int, float)) + social_responsibility = ValidateAttr(field='social_responsibility', type=(int, float)) + corporate_governance = ValidateAttr(field='corporate_governance', type=(int, float)) + profitability = ValidateAttr(field='profitability', type=(int, float)) + asset_quality = ValidateAttr(field='asset_quality', type=(int, float)) + debt_risk = ValidateAttr(field='debt_risk', type=(int, float)) + operational_growth = ValidateAttr(field='operational_growth', type=(int, float)) + compliance_risk = ValidateAttr(field='compliance_risk', type=(int, float)) + cperational_risk = ValidateAttr(field='cperational_risk', type=(int, float)) + associated_risk = ValidateAttr(field='associated_risk', type=(int, float)) + + fields_map = { + "environment": "环境", + "social_responsibility": "社会责任", + "corporate_governance": "公司治理", + "profitability": "盈利能力", + "asset_quality": "资产质量", + "debt_risk": "债务风险", + "operational_growth": "经营增长", + "compliance_risk": "合规风险", + "cperational_risk": "经营风险", + "associated_risk": "关联风险" + } + + class MaxScore(SpecObject): + """最大分数""" + environment = ValidateAttr(field='environment', type=int) + social_responsibility = ValidateAttr(field='social_responsibility', type=int) + corporate_governance = ValidateAttr(field='corporate_governance', type=int) + profitability = ValidateAttr(field='profitability', type=int) + asset_quality = ValidateAttr(field='asset_quality', type=int) + debt_risk = ValidateAttr(field='debt_risk', type=int) + operational_growth = ValidateAttr(field='operational_growth', type=int) + compliance_risk = ValidateAttr(field='compliance_risk', type=int) + cperational_risk = ValidateAttr(field='cperational_risk', type=int) + associated_risk = ValidateAttr(field='associated_risk', type=int) + + fields_map = { + "environment": "环境", + "social_responsibility": "社会责任", + "corporate_governance": "公司治理", + "profitability": "盈利能力", + "asset_quality": "资产质量", + "debt_risk": "债务风险", + "operational_growth": "经营增长", + "compliance_risk": "合规风险", + "cperational_risk": "经营风险", + "associated_risk": "关联风险" + } + index_score = ValidateAttr(field='index_score', type=IndexScore) + max_score = ValidateAttr(field='max_score', type=MaxScore) + + fields_map = { + "index_score": "指标得分", + "max_score": "最大分数" + } + + """综合信用表现""" + indicator_radar = ValidateAttr(field='indicator_radar', type=IndicatorRadar) + + fields_map = { + "indicator_radar": "指标雷达" + } + + class CreditAnalysis(SpecObject): + """信用分析""" + management_analysis = ValidateAttr(field='management_analysis', type=str) + finance_analysis = ValidateAttr(field='finance_analysis', type=str) + risk_analysis = ValidateAttr(field='risk_analysis', type=str) + evaluation_opinion = ValidateAttr(field='evaluation_opinion', type=str) + view_report = ValidateAttr(field='view_report', type=str) + + fields_map = { + "management_analysis": "经营分析", + "finance_analysis": "财务分析", + "risk_analysis": "风险分析", + "evaluation_opinion": "评价意见", + "view_report": "查看报告" + } + + class IndexTable(SpecObject): + """指标表格""" + class FinancialIndicators(SpecObject): + """财务指标""" + profitability = ValidateAttr(field='profitability', in_list=['优', '良', '中', '低', '差']) + asset_quality = ValidateAttr(field='asset_quality', in_list=['优', '良', '中', '低', '差']) + debt_risk = ValidateAttr(field='debt_risk', in_list=['优', '良', '中', '低', '差']) + operating_growth = ValidateAttr(field='operating_growth', in_list=['优', '良', '中', '低', '差']) + + fields_map = { + "profitability": "盈利能力", + "asset_quality": "资产质量", + "debt_risk": "债务风险", + "operating_growth": "经营增长" + } + + class RiskIndicators(SpecObject): + """风险指标""" + compliance_risk = ValidateAttr(field='compliance_risk', in_list=['优', '良', '中', '低', '差']) + operational_risk = ValidateAttr(field='operational_risk', in_list=['优', '良', '中', '低', '差']) + associated_risk = ValidateAttr(field='associated_risk', in_list=['优', '良', '中', '低', '差']) + + fields_map = { + "compliance_risk": "合规风险", + "operational_risk": "经营风险", + "associated_risk": "关联风险" + } + + class OperatingIndicators(SpecObject): + """经营指标""" + environmental = ValidateAttr(field='environmental', in_list=['优', '良', '中', '低', '差']) + social_responsibility = ValidateAttr(field='social_responsibility', in_list=['优', '良', '中', '低', '差']) + corporate_governance = ValidateAttr(field='corporate_governance', in_list=['优', '良', '中', '低', '差']) + + fields_map = { + "environmental": "环境", + "social_responsibility": "社会责任", + "corporate_governance": "公司治理" + } + + financial_indicators = ValidateAttr(field='financial_indicators', type=FinancialIndicators) + risk_indicators = ValidateAttr(field='risk_indicators', type=RiskIndicators) + operating_indicators = ValidateAttr(field='operating_indicators', type=OperatingIndicators) + + fields_map = { + "financial_indicators": "财务指标", + "risk_indicators": "风险指标", + "operating_indicators": "经营指标" + } + + class HistoryLevel(SpecObject): + """历史级别""" + credit_rating = ValidateAttr(field='credit_rating', type=str) + credit_score = ValidateAttr(field='credit_score', type=(float, int)) + evaluation_time = ValidateAttr(field='evaluation_time', type=str) + evaluation_method = ValidateAttr(field='evaluation_method', type=str, in_list=['企业申报']) + change_trend = ValidateAttr(field='change_trend', type=str) + + fields_map = { + "credit_rating": "信用等级", + "credit_score": "信用评分", + "evaluation_time": "评价时间", + "evaluation_method": "评价方式", + "change_trend": "变化趋势" + } + cid = ValidateAttr(field='cid', type=str, length=8) rid = ValidateAttr(field='rid', type=str, length=8) name = ValidateAttr(field='name', type=str) - update_time = ValidateAttr(field='update_time', type=str) + update_time = ValidateAttr(field='update_time', func=Validate.time_format) performance = ValidateAttr(field='performance', type=CreditPerformance) credit_analysis = ValidateAttr(field='credit_analysis', type=CreditAnalysis) index_table = ValidateAttr(field='index_table', type=IndexTable) @@ -379,7 +369,201 @@ class ComprehensiveCreditAnalysis(SpecObject): "name": "企业名称", "update_time": "更新时间", "performance": "综合信用表现", - "analysis": "信用分析", + "credit_analysis": "信用分析", "index_table": "指标表格", "history_level": "历史级别" - } \ No newline at end of file + } + + +class FinancialElementsAnalysis(SpecObject): + """财务要素分析""" + + class CompareToYears(SpecObject): + """财务得分年度比较""" + + class FinancialAnalysisIndex(SpecObject): + """指标""" + profitability = ValidateAttr(field='profitability', type=(int, float)) + asset_quality = ValidateAttr(field='asset_quality', type=(int, float)) + debt_risk = ValidateAttr(field='debt_risk', type=(int, float)) + business_growth = ValidateAttr(field='business_growth', type=(int, float)) + + fields_map = { + "profitability": "盈利能力", + "asset_quality": "资产质量", + "debt_risk": "债务风险", + "business_growth": "经营增长" + } + + year = ValidateAttr(field='year', type=str, func=Validate.date_format) + index = ValidateAttr(field='index', instance_list=FinancialAnalysisIndex) + + fields_map = { + "year": "年度", + "index": "指标" + } + + class CompareToIndustry(SpecObject): + """财务得分同行比较""" + + class CompanyScore(SpecObject): + """公司水平""" + profitability = ValidateAttr(field='profitability', type=(int, float)) + asset_quality = ValidateAttr(field='asset_quality', type=(int, float)) + debt_risk = ValidateAttr(field='debt_risk', type=(int, float)) + business_growth = ValidateAttr(field='business_growth', type=(int, float)) + + fields_map = { + "profitability": "盈利能力", + "asset_quality": "资产质量", + "debt_risk": "债务风险", + "business_growth": "经营增长" + } + + class AverageScore(SpecObject): + """平均水平""" + profitability = ValidateAttr(field='profitability', type=(int, float)) + asset_quality = ValidateAttr(field='asset_quality', type=(int, float)) + debt_risk = ValidateAttr(field='debt_risk', type=(int, float)) + business_growth = ValidateAttr(field='business_growth', type=(int, float)) + + fields_map = { + "profitability": "盈利能力", + "asset_quality": "资产质量", + "debt_risk": "债务风险", + "business_growth": "经营增长" + } + + company_score = ValidateAttr(field='company_score', type=CompanyScore) + average_score = ValidateAttr(field='average_score', type=AverageScore) + + fields_map = { + "company_score": "公司水平", + "average_score": "平均水平" + } + + class DeltaToYears(SpecObject): + """财务得分较去年变化""" + profitability = ValidateAttr(field='profitability', type=(int, float)) + asset_quality = ValidateAttr(field='asset_quality', type=(int, float)) + debt_risk = ValidateAttr(field='debt_risk', type=(int, float)) + business_growth = ValidateAttr(field='business_growth', type=(int, float)) + + fields_map = { + "profitability": "盈利能力", + "asset_quality": "资产质量", + "debt_risk": "债务风险", + "business_growth": "经营增长" + } + + class DeltaToIndustry(SpecObject): + """财务得分较同行差异""" + profitability = ValidateAttr(field='profitability', type=(int, float)) + asset_quality = ValidateAttr(field='asset_quality', type=(int, float)) + debt_risk = ValidateAttr(field='debt_risk', type=(int, float)) + business_growth = ValidateAttr(field='business_growth', type=(int, float)) + + fields_map = { + "profitability": "盈利能力", + "asset_quality": "资产质量", + "debt_risk": "债务风险", + "business_growth": "经营增长" + } + + class IndexDetails(SpecObject): + """指标详情""" + index = ValidateAttr(field='', type=str) + value = ValidateAttr(field='', type=str) + level = ValidateAttr(field='', type=str, in_list=['优', '良', '中', '低', '差']) + + fields_map = { + "index": "指标", + "value": "数值", + "level": "水平" + } + + cid = ValidateAttr(field='cid', type=str, length=8, default=None) + update_time = ValidateAttr(field='update_time', func=Validate.time_format) + rid = ValidateAttr(field='rid', type=str, length=8) + report_date = ValidateAttr(field='report_date', type=str, func=Validate.date_format) + compare_to_years = ValidateAttr(field='compare_to_years', length=2, type=CompareToYears) + compare_to_industry = ValidateAttr(field='compare_to_industry', type=CompareToIndustry) + delta_to_years = ValidateAttr(field='delta_to_years', type=DeltaToYears) + delta_to_industry = ValidateAttr(field='delta_to_industry', type=DeltaToIndustry) + index_details = ValidateAttr(field='index_details', instance_list=IndexDetails) + + fields_map = { + "cid": "企业ID", + "update_time": "更新时间", + "rid": "评价ID", + "report_date": "财报期", + "compare_to_years": "财务得分年度比较", + "compare_to_industry": "财务得分同行比较", + "delta_to_years": "财务得分较去年变化", + "delta_to_industry": "财务得分较同行差异", + "index_details": "指标详情" + } + + +class BusinessElementsAnalysis(SpecObject): + """经营要素分析""" + class ComplianceRisk(SpecObject): + """合规风险""" + genre = ValidateAttr(field='genre', type=str) + quantity = ValidateAttr(field='quantity', type=int) + affect = ValidateAttr(field='affect', type=str) + + fields_map = { + "genre": "类型", + "quantity": "数量", + "affect": "影响" + } + + class OperationalRisk(SpecObject): + """经营风险""" + genre = ValidateAttr(field='genre', type=str) + quantity = ValidateAttr(field='quantity', type=int) + affect = ValidateAttr(field='affect', type=str) + + fields_map = { + "genre": "类型", + "quantity": "数量", + "affect": "影响" + } + + class PeripheralRisk(SpecObject): + """周边风险""" + genre = ValidateAttr(field='genre', type=str) + quantity = ValidateAttr(field='quantity', type=int) + detail = ValidateAttr(field='detail', type=list) + + fields_map = { + "genre": "类型", + "quantity": "数量", + "detail": "详情" + } + + class ChangeLog(SpecObject): + """变更记录""" + genre = ValidateAttr(field='genre', type=str) + quantity = ValidateAttr(field='quantity', type=int) + affect = ValidateAttr(field='affect', type=str) + + fields_map = { + "genre": "类型", + "quantity": "数量", + "affect": "影响" + } + + cid = ValidateAttr(field='cid', type=str, length=8, default=None) + rid = ValidateAttr(field='rid', type=str, length=8, default=None) + update_time = ValidateAttr(field='update_time', func=Validate.time_format) + risk_score = ValidateAttr(field='risk_score', type=(int, float)) + risk_level = ValidateAttr(field='risk_level', type=str, in_list=['高', '较高', '中等', '警示', '低']) + risk_quantity = ValidateAttr(field='risk_quantity', type=int) + untrustworthy_list = ValidateAttr(field='untrustworthy_list', type=str, in_list=['是', '否']) + compliance_risk = ValidateAttr(field='compliance_risk', instance_list=ComplianceRisk) + operational_risk = ValidateAttr(field='operational_risk', instance_list=OperationalRisk) + peripheral_risk = ValidateAttr(field='peripheral_risk', instance_list=PeripheralRisk) + change_log = ValidateAttr(field='change_log', instance_list=ChangeLog) + diff --git a/CompanyData/CompanyDataRoutes.py b/CompanyData/CompanyDataRoutes.py index 659cf25..fa04790 100644 --- a/CompanyData/CompanyDataRoutes.py +++ b/CompanyData/CompanyDataRoutes.py @@ -1,9 +1,9 @@ from flask import Blueprint, request -from CompanyData.CompanyDataImpl import CompanyDataImpl, CompanyIndexImpl +from CompanyData.CompanyDataImpl import CompanyDataImpl, CreditAnalysisImpl, FinancialAnalysisImpl from Utils.ErrorUtil import ReturnConditionCheckFailed from common.utils import verify_token -from CompanyData.job_scripts import * +from CompanyData.job_scripts import update_process_scripts company_route = Blueprint('company', __name__) @@ -44,10 +44,11 @@ def general_rating(): - """ try: - company_index = CompanyIndexImpl() - company_index.cid = request.json['rid'] - company_index.cc_rating_etl() - company_index.financial_analysis() + credit_analysis = CreditAnalysisImpl() + credit_analysis.rid = request.json['rid'] + credit_analysis.cc_rating_etl() + financial_analysis = FinancialAnalysisImpl() + financial_analysis.financial_analysis_etl() company_index.risk_analysis_etl() return {"info": "数据准备完成"}, 200 except ReturnConditionCheckFailed as e: diff --git a/Utils/ValidateUtil.py b/Utils/ValidateUtil.py index c7bd031..32ed1ed 100644 --- a/Utils/ValidateUtil.py +++ b/Utils/ValidateUtil.py @@ -20,6 +20,20 @@ class Validate(object): case = (len(param) >= 8) and (re.match(regex, param) is not None) return True if case else False + @staticmethod + def date_format(param): + """yyyy-mm-dd""" + regex = "\d{4}-\d{1,2}-\d{1,2}" + case = re.match(regex, param) is not None + return True if case else False + + @staticmethod + def time_format(param): + """yyyy-mm-dd hh:mm:ss""" + regex = "\d{4}-\d{1,2}-\d{1,2} \d{1,2}:\d{1,2}:\d{1,2}" + case = re.match(regex, param) is not None + return True if case else False + @staticmethod def image(param): """""" @@ -28,7 +42,7 @@ class Validate(object): class ValidateAttr(object): - + def __init__(self, **kwargs): """""" self.kwargs = kwargs @@ -41,16 +55,22 @@ class ValidateAttr(object): def __set__(self, instance, value): """""" - - self.error_info = '{}异常'.format(instance.fields_map[self.kwargs['field']]) + try: + self.error_info = '{}异常'.format(instance.fields_map[self.kwargs['field']]) + except AttributeError: + pass def not_default(): """无默认值时属性设值检查""" if 'type' in self.kwargs: """检查实例的属性类型""" - if not isinstance(value, self.kwargs['type']): - raise ReturnConditionCheckFailed(self.error_info, self.error_code) + if type(self.kwargs['type']) is list: + if type(value) not in self.kwargs['type']: + raise ReturnConditionCheckFailed(self.error_info, self.error_code) + else: + if not isinstance(value, self.kwargs['type']): + raise ReturnConditionCheckFailed(self.error_info, self.error_code) if 'length' in self.kwargs: """检查实例的属性值长度(一般是str类型)"""