tfse-etl-api-v0.2/CompanyData/CompanyDataImpl.py

994 lines
45 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import json
import time
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, FinancialIndex, BalanceSheet, ProfitSheet, AppendixDataSheet, \
EsgRatingAnalysis, FinancialIndexs
from Utils.CommonUtil import sub_dict, df_iterrows
class CompanyDataImpl(CompanyData):
"""企业数据实现类"""
db_tyc = MongoHelper("tyc")
db_tfse = MongoHelper("tfse_v0.21")
def drag_data_from_tyc_api(self):
"""拉取天眼查接口数据"""
url = "http://api.fecribd.com/api/tyc/drag_data"
headers = {'token': "uzdq51N4!I0%HY4sCaQ!aeCSIDIVIdAM"}
data = {"企业名称": self.name}
res = requests.post(url=url, headers=headers, data=json.dumps(data))
return True if res.status_code == 200 else False
def prepare_company_init_data(self):
def prepare_business_data():
data = self.db_tyc.find_single_column(
"公司背景",
"基本信息",
{"企业名称": self.name},
"基本信息"
)
basic_info = BasicInfo()
basic_info.status = data['regStatus']
basic_info.legal_person = data['legalPersonName']
basic_info.company_type = data['companyOrgType']
basic_info.taxpayer_id = data['taxNumber']
basic_info.business_scope = data['businessScope']
basic_info.registered_capital = data['regCapital']
basic_info.paid_capital = data['actualCapital']
basic_info.registered_address = data['regLocation']
basic_info.registration_authority = data['regInstitute']
basic_info.industry = data['industry']
basic_info.staff_size = data['staffNumRange']
basic_info.people_insured_num = data['socialStaffNum']
basic_info.micro_company = "" if data['regStatus'] == 1 else ""
self.basic_info = basic_info
def prepare_share_holders():
try:
self.share_holders = list()
data = self.db_tyc.find_single_column(
"公司背景",
"企业股东",
{"企业名称": self.name},
"企业股东"
)
try:
results = data['result']
except KeyError:
raise LogConditionCheckFailed("企业股东数据异常", 200)
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 "其他")
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']
else:
share_holder.share_holding_ratio = None
share_holder.subscription_amount = None
share_holder.subscription_date = None
if result.__contains__('capitalActl'):
share_holder.paid_amount = [capital_actl['amomon'] for capital_actl in result['capitalActl']]
share_holder.payment_method = [capital_actl['paymet'] for capital_actl in result['capitalActl']]
share_holder.payment_time = [capital_actl['time'] for capital_actl in result['capitalActl']]
else:
share_holder.paid_amount = None
share_holder.payment_method = None
share_holder.payment_time = None
self.share_holders.append(share_holder)
except TypeError:
self.share_holders = list()
data = self.db_tyc.find_single_column(
"公司背景",
"十大股东",
{"企业名称": self.name},
"十大股东"
)
try:
results = data['holderList']
except KeyError:
raise LogConditionCheckFailed("企业股东数据异常", 200)
for result in results:
share_holder = ShareHolder()
share_holder.name = result['name']
share_holder.share_holder_type = "公司" if result['cType'] == 1 else (
"个人" if result['cType'] == 2 else "其他")
share_holder.share_holding_ratio = result['proportion']
share_holder.subscription_amount = None
share_holder.subscription_date = None
share_holder.paid_amount = None
share_holder.payment_method = None
share_holder.payment_time = None
self.share_holders.append(share_holder)
def prepare_main_members():
self.main_members = list()
data = self.db_tyc.find_single_column(
"公司背景",
"主要人员",
{"企业名称": self.name},
"主要人员"
)
try:
results = data['result']
except KeyError:
raise LogConditionCheckFailed("主要人员数据异常", 200)
for result in results:
main_member = MainMember()
main_member.name = result['name']
main_member.job_title = result['typeJoin']
self.main_members.append(main_member)
def prepare_industry_l1():
"""一级行业数据"""
db = MongoHelper("tfse_v0.21")
tyc_industry_l2 = self.basic_info.dict_keys_toggle()['行业']
fecr_industry_l1 = db.find_single_column(
"模型端",
"天眼查公司行业分类",
{"二级行业": tyc_industry_l2},
"远东_一级行业"
)
self.industry_l1 = fecr_industry_l1
def save_to_basic_business_info():
self.db_tfse.upsert_single_data(
"企业数据",
"基本工商信息",
{"企业ID": self.cid},
{
"企业ID": self.cid,
"企业名称": self.name,
"更新日期": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"工商信息": self.basic_info.dict_keys_toggle(),
"股东信息": [item.dict_keys_toggle() for item in self.share_holders],
"主要成员": [item.dict_keys_toggle() for item in self.main_members]
}
)
def save_to_update_summary():
self.update_time = {
"工商信息": time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
"财务信息": None,
"综信评价": None,
"ESG评价": None,
}
self.db_tfse.upsert_single_data(
"企业数据",
"企业数据_更新汇总",
{"企业ID": self.cid},
self.dict_keys_toggle()
)
def __main__():
prepare_business_data()
prepare_share_holders()
prepare_main_members()
prepare_industry_l1()
save_to_basic_business_info()
save_to_update_summary()
__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):
"""综合信用分析类"""
db = MongoHelper("tfse_v0.21")
def cc_rating_etl(self):
rating_record = self.db.find_single_data(
'企业数据',
'评价记录',
{"评价ID": self.rid},
["报告fid"]
)
rating_result = self.db.find_single_data(
'综信评价数据',
'评价结果',
{"评价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():
"""结果数据"""
self.cid = rating_result['企业ID']
self.name = rating_result['企业名称']
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 = indicator_radar.MaxScore()
max_score.environment = 10
max_score.social_responsibility = 10
max_score.corporate_governance = 16
max_score.profitability = 18
max_score.asset_quality = 18
max_score.debt_risk = 18
max_score.operational_growth = 18
max_score.compliance_risk = 43
max_score.cperational_risk = 10
max_score.associated_risk = 10
index_score = indicator_radar.IndexScore()
index_score.environment = rating_result['经营评分']["环境"]
index_score.social_responsibility = rating_result['经营评分']["社会责任"]
index_score.corporate_governance = rating_result['经营评分']["公司治理"]
index_score.profitability = rating_result['财务评分']["盈利能力"]['合计']
index_score.asset_quality = rating_result['财务评分']["资产质量"]['合计']
index_score.debt_risk = rating_result['财务评分']["债务风险"]['合计']
index_score.operational_growth = rating_result['财务评分']["经营增长"]['合计']
index_score.compliance_risk = round(43 - rating_result['风险评分']["合规风险"], 2)
index_score.cperational_risk = round(10 - rating_result['风险评分']["经营风险"]['合计'], 2)
index_score.associated_risk = round(10 - rating_result['风险评分']["关联风险"]['合计'], 2)
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]['段落']
return describe
def financial_analysis_content():
"""财务分析"""
if text_model['行业选择'][0] == '制造业':
describe = list()
describe.append(text_model['报告内容'][3]['章节内容'][0]['小节内容'][1]['段落'])
describe.append(text_model['报告内容'][3]['章节内容'][1]['小节内容'][2]['段落'])
describe = ''.join(describe)
else:
describe = text_model['报告内容'][3]['章节内容'][0]['小节内容'][2]['段落']
return describe
def risk_analysis_content():
"""风险分析"""
risk_01 = text_model['报告内容'][4]['章节内容'][0]['小节内容'][0]['段落']
list_01 = risk_01.split('')
risk_02 = text_model['报告内容'][4]['章节内容'][1]['小节内容'][0]['段落']
list_02 = risk_02.split('')
risk_03 = text_model['报告内容'][4]['章节内容'][2]['小节内容'][0]['段落']
list_03 = risk_03.split('')
describe = list()
describe.append(list_01[::-1][0])
describe.append(list_02[::-1][0])
describe.append(list_03[::-1][0])
describe = ','.join(describe)
res = describe.replace('', '', 2)
return res
def evaluation_comments_content():
"""评价意见"""
describe = list()
eva_01 = text_model['报告内容'][5]['章节内容'][0]['小节内容'][0]['段落']
eva_02 = text_model['报告内容'][5]['章节内容'][0]['小节内容'][1]['段落']
eva_03 = text_model['报告内容'][5]['章节内容'][0]['小节内容'][2]['段落']
describe.append(eva_01)
describe.append(eva_02)
describe.append(eva_03)
describe = ''.join(describe)
return describe
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_cc_rating_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_()
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_all_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]
data_last = list(json.loads(df_last[['净资产收益率', '存货周转率', '已获利息倍数', '应收账款周转率', '总资产周转率', '总资产增长率', '总资产报酬率',
'技术投入比率', '营业增长率', '资产负债率', '速动比率']].T.to_json()).values())
url = "http://api.fecribd.com/tfse_rating/rating/financial_score"
headers = {'token': "X0gSlC!YE8jmr2jJr&ilcjS83j!tsoh5", "content-type": "application/json"}
data = {"财务指标": data_last, "所属行业": industry}
score_last_origin = json.loads(requests.post(url=url, headers=headers, data=json.dumps(data)).text)[
'result']
score_avg = {
"盈利能力": 8,
"资产质量": 9,
"债务风险": 9,
"经营增长": 9
}
score_actl = {
"盈利能力": rating_result['财务评分']['盈利能力']['合计'],
"资产质量": rating_result['财务评分']['资产质量']['合计'],
"债务风险": rating_result['财务评分']['债务风险']['合计'],
"经营增长": rating_result['财务评分']['经营增长']['合计']
}
score_last = {
"盈利能力": score_last_origin['盈利能力']['合计'],
"资产质量": score_last_origin['资产质量']['合计'],
"债务风险": score_last_origin['债务风险']['合计'],
"经营增长": score_last_origin['经营增长']['合计']
}
df = pd.DataFrame({'今年值': score_actl, '去年值': score_last, "平均值": score_avg})
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 or '倍数' 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():
"""财务得分年度比较"""
self.compare_to_years = list()
def score_actl_script():
"""今年财务得分"""
compare = self.CompareToYears()
score_index = FinancialIndexs()
score_index.profitability = rating_result['财务评分']['盈利能力']['合计']
score_index.asset_quality = rating_result['财务评分']['资产质量']['合计']
score_index.debt_risk = rating_result['财务评分']['债务风险']['合计']
score_index.business_growth = rating_result['财务评分']['经营增长']['合计']
compare.year = df_this['年报期'][0]
compare.index = score_index
self.compare_to_years.append(compare.dict_to_save())
def score_last_script():
"""去年财务得分"""
compare = self.CompareToYears()
score_index = FinancialIndexs()
score_index.profitability = score_last_origin['盈利能力']['合计']
score_index.asset_quality = score_last_origin['资产质量']['合计']
score_index.debt_risk = score_last_origin['债务风险']['合计']
score_index.business_growth = score_last_origin['经营增长']['合计']
compare.year = df_last['年报期'][1]
compare.index = score_index
self.compare_to_years.append(compare.dict_to_save())
score_actl_script()
score_last_script()
def compare_to_industry():
"""财务得分同行比较"""
compare_industry = self.CompareToIndustry()
def company_level():
"""公司水平"""
company = FinancialIndexs()
company.profitability = rating_result['财务评分']['盈利能力']['合计']
company.asset_quality = rating_result['财务评分']['资产质量']['合计']
company.debt_risk = rating_result['财务评分']['债务风险']['合计']
company.business_growth = rating_result['财务评分']['经营增长']['合计']
compare_industry.company_score = company
def average_level():
"""平均水平"""
average = FinancialIndexs()
average.profitability = 8
average.asset_quality = 9
average.debt_risk = 9
average.business_growth = 9
compare_industry.average_score = average
company_level()
average_level()
self.compare_to_industry = compare_industry
def delta_to_year():
"""财务得分较去年变化"""
delat_data = json.loads(
(df['今年值'] / df['去年值'] - 1).apply(lambda x: round(x * 100, 2)).T.to_json())
delat = FinancialIndexs()
delat.profitability = delat_data['盈利能力']
delat.asset_quality = delat_data['资产质量']
delat.debt_risk = delat_data['债务风险']
delat.business_growth = delat_data['经营增长']
self.delta_to_years = delat
def delta_to_industry():
"""财务扽分交同行差异"""
delat_data = json.loads(
(df['今年值'] / df['平均值'] - 1).apply(lambda x: round(x * 100, 2)).T.to_json())
delat = FinancialIndexs()
delat.profitability = delat_data['盈利能力']
delat.asset_quality = delat_data['资产质量']
delat.debt_risk = delat_data['债务风险']
delat.business_growth = delat_data['经营增长']
self.delta_to_industry = delat
def _main_():
result_head()
index_detail()
compare_to_year()
compare_to_industry()
delta_to_year()
delta_to_industry()
result = self.dict_to_save()
self.db.upsert_single_data(
'企业数据',
'财务要素分析',
{"评价ID": self.rid},
result
)
_main_()
class BusinessAnalysisImpl(BusinessElementsAnalysis):
"""经营要素分析类"""
db = MongoHelper("tfse_v0.21")
def risk_analysis_etl(self):
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_()
class EsgAnalysisImpl(EsgRatingAnalysis):
"""ESG评价分析类"""
db = MongoHelper("tfse_v0.21")
def egs_analysis_etl(self):
rating_record = self.db.find_single_data(
'ESG评价数据',
'评价结果',
{"评价ID": self.rid},
["企业ID", "评价等级", "ESG得分", "环境得分", "社会得分", "公司治理得分"]
)
rating_input = self.db.find_single_data(
'ESG评价数据',
'填报数据',
{"评价ID": self.rid},
["所属行业"]
)
self.cid = rating_record['企业ID']
self.update_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
def esg_rating():
"""esg评级"""
rating = self.EsgRating()
rating.rating = rating_record['评价等级']
rating.score = rating_record['ESG得分']
rating.industry = rating_input['所属行业'][0]
self.esg_rating = rating
def dimension_rating():
"""维度得分情况"""
self.dimension_score = list()
def e():
"""环境"""
dimension = self.DimensionScore()
dimension.dimension = '环境'
dimension.weights = '35%'
dimension.score = rating_record['环境得分']['合计']
dimension.score_change = '-%'
dimension.industry_average = '-'
self.dimension_score.append(dimension.dict_to_save())
def s():
"""社会"""
dimension = self.DimensionScore()
dimension.dimension = '社会'
dimension.weights = '35%'
dimension.score = rating_record['社会得分']['合计']
dimension.score_change = '-%'
dimension.industry_average = '-'
self.dimension_score.append(dimension.dict_to_save())
def g():
"""治理"""
dimension = self.DimensionScore()
dimension.dimension = '治理'
dimension.weights = '30%'
dimension.score = rating_record['公司治理得分']['合计']
dimension.score_change = '-%'
dimension.industry_average = '-'
self.dimension_score.append(dimension.dict_to_save())
def _main_():
e()
s()
g()
_main_()
def __main__():
esg_rating()
dimension_rating()
result = self.dict_to_save()
self.db.upsert_single_data(
"企业数据",
"ESG评价分析",
{"评价ID": self.rid},
result
)
__main__()