diff --git a/CompanyData/CompanyDataImpl.py b/CompanyData/CompanyDataImpl.py index 28fd955..d636916 100644 --- a/CompanyData/CompanyDataImpl.py +++ b/CompanyData/CompanyDataImpl.py @@ -4,9 +4,10 @@ import requests import pandas as pd from DBHelper.MongoHelper import MongoHelper +from RatingData.scripts.risk_detail import associate_risk_detail, change_log_detail from Utils.ErrorUtil import LogConditionCheckFailed from CompanyData.CompanyDataObj import CompanyData, BasicInfo, ShareHolder, MainMember, ComprehensiveCreditAnalysis, \ - FinancialElementsAnalysis, BusinessElementsAnalysis + FinancialElementsAnalysis, BusinessElementsAnalysis, FinancialIndex, BalanceSheet, ProfitSheet, AppendixDataSheet from common.utils import sub_dict, df_iterrows @@ -179,6 +180,131 @@ class CompanyDataImpl(CompanyData): __main__() + def update_credit_data(self, rid): + """更新综信评价相关数据""" + def update_rating_result(): + """更新评价结果""" + rating_result = self.db_tfse.find_single_data( + '综信评价数据', + '评价结果', + {'评价ID': rid}, + ['企业ID', '信用等级', '信用评分', '评价年度', '经营评分', '财务评分', '风险评分', '评价时间'] + ) + self.cid = rating_result['企业ID'] + del rating_result['企业ID'] + rating_result['评价ID'] = rid + self.cc_rating_result = rating_result + + def financial_indicator(): + """更新财务指标""" + financial_result = self.db_tfse.find_single_data( + '综信评价数据', + '财指结果', + {'企业ID': self.cid}, + ['净资产收益率', '存货周转率', '已获利息倍数', '应收账款周转率', '总资产周转率', '总资产增长率', '总资产报酬率', + '技术投入比率', '营业增长率', '资产负债率', '速动比率'] + ) + financial_index = FinancialIndex() + financial_index.roe = financial_result['净资产收益率'] + financial_index.inventory_turnover = financial_result['存货周转率'] + financial_index.interest_multiple = financial_result['已获利息倍数'] + financial_index.accounts_receivable_turnover = financial_result['应收账款周转率'] + financial_index.total_asset_turnover = financial_result['总资产周转率'] + financial_index.total_asset_growth_rate = financial_result['总资产增长率'] + financial_index.roa = financial_result['总资产报酬率'] + financial_index.technology_investment_ratio = financial_result['技术投入比率'] + financial_index.operating_growth_rate = financial_result['营业增长率'] + financial_index.assets_and_liabilities = financial_result['资产负债率'] + financial_index.quick_ratio = financial_result['速动比率'] + self.fin_index = financial_index + + def financial_sheet(): + """更新财务表""" + fill_data = self.db_tfse.find_single_data( + '综信评价数据', + '填报数据', + {'评价ID': rid}, + ['财务填报'] + ) + + def update_balance_sheet(): + """资产负债表""" + balance_data = fill_data['财务填报']['资产负债表'][0] + balance = BalanceSheet() + balance.accounts_receivable = balance_data['应收账款'] + balance.stock = balance_data['存货'] + balance.total_current_assets = balance_data['流动资产合计'] + balance.total_assets = balance_data['资产总计'] + balance.short_loan = balance_data['短期借款'] + balance.one_year_liabilities = balance_data['一年内到期非流动负债'] + balance.total_current_liabilities = balance_data['流动负债合计'] + balance.long_term_loan = balance_data['长期借款'] + balance.total_liabilities = balance_data['负债合计'] + balance.total_owners_equity = balance_data['所有者权益合计'] + self.balance_sheet = balance + + def update_profit_sheet(): + """利润表""" + profit_data = fill_data['财务填报']['利润表'][0] + profit = ProfitSheet() + profit.operating_income = profit_data['营业收入'] + profit.operating_cost = profit_data['营业成本'] + profit.total_profit = profit_data['利润总额'] + profit.net_profit = profit_data['净利润'] + self.profit_sheet = profit + + def update_appendix_sheet(): + """补充数据表""" + appendix_data = fill_data['财务填报']['补充数据表'][0] + appendix = AppendixDataSheet() + appendix.rd_expenses = appendix_data['研发费用'] + appendix.interest_disbursement = appendix_data['计入财务费的利息支出'] + appendix.interest_expense = appendix_data['资本化利息支出'] + self.appendix_sheet = appendix + + def _main_(): + update_balance_sheet() + update_profit_sheet() + update_appendix_sheet() + + _main_() + + def __main__(): + update_rating_result() + financial_indicator() + financial_sheet() + result = self.dict_to_save() + del result['企业ID'] + self.db_tfse.update_single_data( + '企业数据', + '企业数据_更新汇总', + {'企业ID': self.cid}, + result + ) + + __main__() + + def update_esg_data(self, rid): + """更新ESG相关数据""" + rating_result = self.db_tfse.find_single_data( + 'ESG评价数据', + '评价结果', + {'评价ID': rid}, + ['企业ID', '评价等级', '评价年度', 'ESG得分', '环境得分', '社会得分', '公司治理得分', '评价时间'] + ) + cid = rating_result['企业ID'] + del rating_result['企业ID'] + rating_result['评价ID'] = rid + self.esg_rating_result = rating_result + result = self.dict_to_save() + self.db_tfse.update_single_data( + '企业数据', + '企业数据_更新汇总', + {'企业ID': cid}, + result + ) + + class CreditAnalysisImpl(ComprehensiveCreditAnalysis): """综合信用分析类""" @@ -459,7 +585,7 @@ class FinancialAnalysisImpl(FinancialElementsAnalysis): index_value = json.loads(df_this[ ['净资产收益率', '总资产报酬率', '总资产周转率', '应收账款周转率', '存货周转率', '资产负债率', '已获利息倍数', '速动比率', '营业增长率', '总资产增长率', '技术投入比率']].apply( - lambda x: '{}%'.format(x.values[0]) if '率' in x.name else x.values[0]).T.to_json()) + lambda x: '{}%'.format(x.values[0]) if '率' in x.name or '倍数' in x.name else x.values[0]).T.to_json()) rate = dict() rate['净资产收益率'] = rating_result['财务评分']['盈利能力']['净资产收益率'] / 8 rate['总资产报酬率'] = rating_result['财务评分']['盈利能力']['总资产报酬率'] / 8 @@ -499,7 +625,7 @@ class FinancialAnalysisImpl(FinancialElementsAnalysis): score_index.debt_risk = rating_result['财务评分']['债务风险']['合计'] score_index.business_growth = rating_result['财务评分']['经营增长']['合计'] compare.year = df_this['年报期'][0] - compare.index = score_index.dict_to_save() + compare.index = score_index self.compare_to_years.append(compare.dict_to_save()) def score_last_script(): @@ -511,7 +637,7 @@ class FinancialAnalysisImpl(FinancialElementsAnalysis): score_index.debt_risk = score_last_origin['债务风险']['合计'] score_index.business_growth = score_last_origin['经营增长']['合计'] compare.year = df_last['年报期'][1] - compare.index = score_index.dict_to_save() + compare.index = score_index self.compare_to_years.append(compare.dict_to_save()) score_actl_script() @@ -541,6 +667,7 @@ class FinancialAnalysisImpl(FinancialElementsAnalysis): company_level() average_level() + self.compare_to_industry = compare_industry def delta_to_year(): """财务得分较去年变化""" @@ -585,4 +712,174 @@ class BusinessAnalysisImpl(BusinessElementsAnalysis): db = MongoHelper("tfse_v0.21") def risk_analysis_etl(self): - pass + rating_result = self.db.find_single_data( + '综信评价数据', + '评价结果', + {"评价ID": self.rid}, + ["企业ID", "企业名称", "风险评分"] + ) + risk_data = self.db.find_single_data( + '综信评价数据', + '风险数据', + {"评价ID": self.rid}, + ["合规风险", "经营风险"] + ) + + def head_info(): + self.cid = rating_result['企业ID'] + self.update_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + + def risk_relative_score(): + """风险分数""" + risk_score = rating_result['风险评分']['合计'] + self.risk_score = 100 if risk_score/43 >= 1 else round(risk_score/43*100, 2) + + def risk_level(): + """风险级别""" + risk_score = rating_result['风险评分']['合计'] + if risk_score >= 43: + level = '高' + elif risk_score >= 33: + level = '较高' + elif risk_score >= 23: + level = '中等' + elif risk_score >= 10: + level = '警示' + else: + level = '低' + self.risk_level = level + + def risk_num(): + """风险数量""" + self.risk_quantity = sum(risk_data['合规风险'].values()) + sum(risk_data['经营风险'].values()) + + def is_break_trust(): + """列入失信人名单""" + self.untrustworthy_list = '是' if risk_data['合规风险']['失信人'] >= 1 else '否' + + def eligibility_risk(): + """合规风险""" + def degree_of_impact(param): + if param.name in ['失信人', '严重违法']: + impact = '严重' + elif param.name in ['经营异常', '欠税公告', '税收违法']: + impact = '异常' + elif param.name in ['立案信息', '行政处罚', '环保处罚']: + impact = '中等' + else: + impact = '' + return impact + + df = pd.DataFrame({'合规风险': risk_data['合规风险']}) + df = df.drop(df[df['合规风险'] == 0].index) + df['影响程度'] = df.T.apply(lambda x: degree_of_impact(x)) + df_list = df_iterrows(df) + self.compliance_risk = list() + if df_list: + for item in df_list: + cr = self.ComplianceRisk() + cr.genre = item[0] + cr.quantity = item[1] + cr.affect = item[2] + self.compliance_risk.append(cr.dict_to_save()) + + def operating_risk(): + """经营风险""" + def degree_of_impact(param): + if param.name in ['开庭公告', '法院公告', '诉讼', '送达公告'] and param.values[0] >= 50: + impact = '异常' + elif param.name in ['开庭公告', '法院公告', '诉讼', '送达公告'] and param.values[0] >= 25: + impact = '中等' + elif param.name in ['开庭公告', '法院公告', '诉讼', '送达公告'] and param.values[0] >= 10: + impact = '警示' + elif param.name in ['被执行人'] and param.values[0] >= 30: + impact = '异常' + elif param.name in ['被执行人'] and param.values[0] >= 15: + impact = '中等' + elif param.name in ['被执行人'] and param.values[0] >= 6: + impact = '警示' + elif param.name in ['股权出质'] and param.values[0] >= 10: + impact = '异常' + elif param.name in ['股权出质'] and param.values[0] >= 5: + impact = '中等' + elif param.name in ['股权出质'] and param.values[0] >= 3: + impact = '警示' + else: + impact = '轻微' + return impact + + df = pd.DataFrame({'经营风险': risk_data['经营风险']}) + df = df.drop(df[df['经营风险'] == 0].index) + df['影响程度'] = df.T.apply(lambda x: degree_of_impact(x)) + df_list = df_iterrows(df) + self.operational_risk = list() + if df_list: + for item in df_list: + or_ = self.OperationalRisk() + or_.genre = item[0] + or_.quantity = item[1] + or_.affect = item[2] + self.compliance_risk.append(or_.dict_to_save()) + + def associate_risk(): + """周边风险""" + data = associate_risk_detail(rating_result['企业名称']) + self.peripheral_risk = list() + if data: + df_list = df_iterrows(pd.DataFrame(data).sort_values('total', ascending=False).set_index('title')) + for item in df_list: + pr = self.PeripheralRisk() + pr.genre = item[0] + pr.quantity = item[1] + pr.detail = item[2] + self.peripheral_risk.append(pr.dict_to_save()) + + def change_log(): + """变更记录""" + data = change_log_detail(rating_result['企业名称']) + + def degree_of_impact(param): + if param.name in ['法定代表人变更', '主要人员变更'] and param.values[0] >= 20: + impact = '异常' + elif param.name in ['法定代表人变更', '主要人员变更'] and param.values[0] >= 10: + impact = '中等' + elif param.name in ['法定代表人变更', '主要人员变更'] and param.values[0] >= 4: + impact = '警示' + else: + impact = '轻微' + return impact + + df = pd.DataFrame(data).sort_values('total', ascending=False).set_index('title') + df['影响程度'] = df.T.apply(lambda x: degree_of_impact(x)) + df_list = df_iterrows(df[['total', '影响程度']]) + self.change_log = list() + for item in df_list: + cl = self.ChangeLog() + cl.genre = item[0] + cl.quantity = item[1] + cl.affect = item[2] + self.change_log.append(cl.dict_to_save()) + + def _main_(): + head_info() + risk_relative_score() + risk_level() + risk_num() + is_break_trust() + eligibility_risk() + operating_risk() + associate_risk() + change_log() + result = self.dict_to_save() + self.db.upsert_single_data( + '企业数据', + '经营风险分析', + {'评价ID': self.rid}, + result + ) + + _main_() + + + + diff --git a/CompanyData/CompanyDataObj.py b/CompanyData/CompanyDataObj.py index c6fc0c1..4fad2ca 100644 --- a/CompanyData/CompanyDataObj.py +++ b/CompanyData/CompanyDataObj.py @@ -121,25 +121,25 @@ class AppendixDataSheet(SpecObject): interest_expense = ValidateAttr(field='interest_expense', type=float) fields_map = { - 'rd_expenses': '研发费用异常', - 'interest_disbursement': '计入财务费的利息支出异常', - 'interest_expense': '资本化利息支出异常' + 'rd_expenses': '研发费用', + 'interest_disbursement': '计入财务费的利息支出', + 'interest_expense': '资本化利息支出' } class FinancialIndex(SpecObject): """财务指标""" roe = ValidateAttr(field="roe", type=float) - inventory_turnover = ValidateAttr(field="inventory_turnover", type=float) - interest_multiple = ValidateAttr(field="interest_multiple", type=float) - accounts_receivable_turnover = ValidateAttr(field="accounts_receivable_turnover", type=float) - total_asset_turnover = ValidateAttr(field="total_asset_turnover", type=float) - total_asset_growth_rate = ValidateAttr(field="total_asset_growth_rate", type=float) - roa = ValidateAttr(field="roa", type=float) - technology_investment_ratio = ValidateAttr(field="technology_investment_ratio", type=float) - operating_growth_rate = ValidateAttr(field="operating_growth_rate", type=float) - assets_and_liabilities = ValidateAttr(field="assets_and_liabilities", type=float) - quick_ratio = ValidateAttr(field="quick_ratio", type=float) + inventory_turnover = ValidateAttr(field="inventory_turnover", type=(float, int)) + interest_multiple = ValidateAttr(field="interest_multiple", type=(float, int)) + accounts_receivable_turnover = ValidateAttr(field="accounts_receivable_turnover", type=(float, int)) + total_asset_turnover = ValidateAttr(field="total_asset_turnover", type=(float, int)) + total_asset_growth_rate = ValidateAttr(field="total_asset_growth_rate", type=(float, int)) + roa = ValidateAttr(field="roa", type=(float, int)) + technology_investment_ratio = ValidateAttr(field="technology_investment_ratio", type=(float, int)) + operating_growth_rate = ValidateAttr(field="operating_growth_rate", type=(float, int)) + assets_and_liabilities = ValidateAttr(field="assets_and_liabilities", type=(float, int)) + quick_ratio = ValidateAttr(field="quick_ratio", type=(float, int)) fields_map = { "roe": "净资产收益率", @@ -168,7 +168,6 @@ class CompanyData(SpecObject): main_members = ValidateAttr(field="main_members", instance_list=MainMember) balance_sheet = ValidateAttr(field='balance_sheet', type=BalanceSheet) profit_sheet = ValidateAttr(field='profit_sheet', type=ProfitSheet) - # income_sheet = {} appendix_sheet = ValidateAttr(field='appendix_sheet', type=AppendixDataSheet) fin_index = ValidateAttr(field='fin_index', type=FinancialIndex) cc_rating_result = ValidateAttr(field='cc_rating_result', type=dict) @@ -444,10 +443,10 @@ class FinancialElementsAnalysis(SpecObject): 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)) + profitability = ValidateAttr(field='profitability', type=str) + asset_quality = ValidateAttr(field='asset_quality', type=str) + debt_risk = ValidateAttr(field='debt_risk', type=str) + business_growth = ValidateAttr(field='business_growth', type=str) fields_map = { "profitability": "盈利能力", @@ -458,10 +457,10 @@ class FinancialElementsAnalysis(SpecObject): 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)) + profitability = ValidateAttr(field='profitability', type=str) + asset_quality = ValidateAttr(field='asset_quality', type=str) + debt_risk = ValidateAttr(field='debt_risk', type=str) + business_growth = ValidateAttr(field='business_growth', type=str) fields_map = { "profitability": "盈利能力", @@ -472,9 +471,9 @@ class FinancialElementsAnalysis(SpecObject): class IndexDetails(SpecObject): """指标详情""" - index = ValidateAttr(field='', type=str) - value = ValidateAttr(field='', type=str) - level = ValidateAttr(field='', type=str, in_list=['优', '良', '中', '低', '差']) + index = ValidateAttr(field='index', type=str) + value = ValidateAttr(field='value', type=str) + level = ValidateAttr(field='level', type=str, in_list=['优', '良', '中', '低', '差']) fields_map = { "index": "指标", @@ -486,7 +485,7 @@ class FinancialElementsAnalysis(SpecObject): 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, instance_list=CompareToYears) + compare_to_years = ValidateAttr(field='compare_to_years', instance_list=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) @@ -567,3 +566,17 @@ class BusinessElementsAnalysis(SpecObject): peripheral_risk = ValidateAttr(field='peripheral_risk', instance_list=PeripheralRisk) change_log = ValidateAttr(field='change_log', instance_list=ChangeLog) + fields_map = { + "cid": "企业ID", + "rid": "评价ID", + "update_time": "更新日期", + "risk_score": "风险分数", + "risk_level": "风险级别", + "risk_quantity": "风险数量", + "untrustworthy_list": "列入失信名单", + "compliance_risk": "合规风险", + "operational_risk": "经营风险", + "peripheral_risk": "周边风险", + "change_log": "变更记录" + } + diff --git a/CompanyData/CompanyDataRoutes.py b/CompanyData/CompanyDataRoutes.py index 22ad9c4..1b31335 100644 --- a/CompanyData/CompanyDataRoutes.py +++ b/CompanyData/CompanyDataRoutes.py @@ -1,6 +1,6 @@ from flask import Blueprint, request -from CompanyData.CompanyDataImpl import CompanyDataImpl, CreditAnalysisImpl, FinancialAnalysisImpl +from CompanyData.CompanyDataImpl import CompanyDataImpl, CreditAnalysisImpl, FinancialAnalysisImpl, BusinessAnalysisImpl from Utils.ErrorUtil import ReturnConditionCheckFailed from common.utils import verify_token from CompanyData.job_scripts import update_process_scripts @@ -44,13 +44,17 @@ def general_rating(): - """ try: - # credit_analysis = CreditAnalysisImpl() - # credit_analysis.rid = request.json['rid'] - # credit_analysis.cc_rating_etl() + credit_analysis = CreditAnalysisImpl() + credit_analysis.rid = request.json['rid'] + credit_analysis.cc_rating_etl() financial_analysis = FinancialAnalysisImpl() financial_analysis.rid = request.json['rid'] financial_analysis.financial_analysis_etl() - # company_index.risk_analysis_etl() + business_analysis = BusinessAnalysisImpl() + business_analysis.rid = request.json['rid'] + business_analysis.risk_analysis_etl() + company_data = CompanyDataImpl() + company_data.update_credit_data(request.json['rid']) return {"info": "数据准备完成"}, 200 except ReturnConditionCheckFailed as e: e.log_error() @@ -70,9 +74,8 @@ def esg_rating(): Returns: - """ - rid = request.json['rid'] - - esg_rating_etl(rid) + company_data = CompanyDataImpl() + company_data.update_esg_data(request.json['rid']) return {"info": "数据准备完成"}, 200