813 lines
43 KiB
Python
813 lines
43 KiB
Python
#coding=utf-8
|
||
|
||
import dashscope
|
||
from http import HTTPStatus
|
||
from pymilvus import MilvusClient
|
||
import json
|
||
from datetime import datetime
|
||
import re,os,time
|
||
import requests
|
||
import config
|
||
import numpy as np
|
||
from docx2pdf import convert
|
||
|
||
def get_md5(str):
|
||
import hashlib
|
||
m = hashlib.md5()
|
||
m.update(str.encode('utf-8'))
|
||
return m.hexdigest()
|
||
|
||
def embed_with_str(input):
|
||
retry = 0
|
||
max_retry = 5
|
||
t = 0.1
|
||
while retry < max_retry:
|
||
#阿里接口限流
|
||
time.sleep(t)
|
||
resp = dashscope.TextEmbedding.call(
|
||
model=dashscope.TextEmbedding.Models.text_embedding_v2,
|
||
input=input)
|
||
if resp.status_code == HTTPStatus.OK:
|
||
return resp
|
||
elif resp.status_code == 429:
|
||
print(f'触发限流,等待{t}秒后重试')
|
||
retry += 1
|
||
t+=0.1
|
||
else:
|
||
print(f'请求失败,状态码:{resp.status_code}')
|
||
return None
|
||
print('重试超过上限')
|
||
return None
|
||
|
||
#如果存在‘归属于|扣非’,就保留括号内的内容,并去掉标点符号和中文数字。
|
||
#如果存在季度关键词,就将括号内容替换为季度
|
||
#如果存在‘±’,就将括号内容替换为同期增减
|
||
#其他情况,就删掉括号内全部内容
|
||
def get_clean_text(text):
|
||
text = text.replace('流动资产:','').replace('半年度','上半年')
|
||
#先对几个半年报的词做整理,防止向量识别不出来
|
||
terms = ["货币资金", "应收账款",'应付账款']
|
||
#这个是不要合计的
|
||
terms_2 = ["固定资产","短期借款","合同负债","在建工程","商誉","存货"]
|
||
#这个是需要调换位置的指标
|
||
#terms_3 = ["固定资产","短期借款","合同负债","在建工程","商誉"]
|
||
#不可以出现同比之类的
|
||
terms_4 = ['比', '率', '占','至','年以内','年以上','年内','1-2年','2-3年','3-4年','4-5年','准备','在途','增值','评估','利息','应计','改良','跌价','补助','投资']
|
||
dates = [ "2021年12月31日","2022年12月31日","2022年1月1日","2023年1月1日", "2023年12月31日", "2022年6月30日","2023年6月30日","2024年6月30日","2024年半年度","2023年半年度","2022年半年度"]
|
||
#dates = [ "2021年12月31日","2022年12月31日","2023年12月31日","2022年1月1日","2023年1月1日", "2024年1月1日", "2022年6月30日","2023年6月30日","2024年6月30日","2021年初","2022年初","2023年初","2024年初",'2021年末','2022年末','2023年末','2024年末',"2023年","2022年","2021年"]
|
||
if any(term in text for term in terms_4):
|
||
return text
|
||
if len(text) <= 20:
|
||
for term in terms:
|
||
for date in dates:
|
||
if term in text and date in text:
|
||
text = f"{date}{term}合计"
|
||
return text
|
||
if len(text) <= 20:
|
||
for term in terms_2:
|
||
for date in dates:
|
||
if term in text and date in text:
|
||
text = f"{date}{term}"
|
||
return text
|
||
|
||
import re
|
||
replacement_dict = {
|
||
'加:': '',
|
||
'减:': '',
|
||
'%' : '',
|
||
'其中:': '',
|
||
'实际': '',
|
||
'/': '',
|
||
'重述后':'',
|
||
'年末金额':'年末',
|
||
'比重增减':'同比增减',
|
||
'比例':'同比',
|
||
}
|
||
#针对整个text做替换
|
||
def replace_all(text, replacements):
|
||
pattern = re.compile("|".join(map(re.escape, replacements.keys())))
|
||
return pattern.sub(lambda match: replacements[match.group(0)], text)
|
||
text = replace_all(text, replacement_dict)
|
||
#单独出现12月31日时,就剔除掉
|
||
pattern_year = r'(?<!2023年|2022年|2021年)12月31日'
|
||
text = re.sub(pattern_year, '', text)
|
||
|
||
pattern = r"\([^)]*\)|\([^)]*\)" # 增加英文括号的匹配
|
||
matches = re.findall(pattern, text)
|
||
quarter_keywords = {
|
||
"1-3月": "第一季度",
|
||
"第1季度": "第一季度",
|
||
"4-6月": "第二季度",
|
||
"第2季度": "第二季度",
|
||
"7-9月": "第三季度",
|
||
"第3季度": "第三季度",
|
||
"10-12月": "第四季度",
|
||
"第4季度": "第四季度",
|
||
"调整后": "调整后",
|
||
"增减":"增减",
|
||
"一": "",
|
||
"二": "",
|
||
"三": "",
|
||
"年内到期":"年内到期",
|
||
"1-6月":"",
|
||
"发行新股":"发行新股",
|
||
}
|
||
#针对text的括号内容进行识别判断
|
||
for match in matches:
|
||
month_keywords_found = re.search(r"归属于|扣非", match)
|
||
if not month_keywords_found: # 改为不包含时的处理
|
||
replaced = False
|
||
for keyword, replacement in quarter_keywords.items():
|
||
if re.search(keyword, match):
|
||
text = re.sub(re.escape(match), replacement, text) #触发关键词替换
|
||
replaced = True
|
||
break
|
||
if not replaced:
|
||
text = re.sub(re.escape(match), "", text) # 如果没有找到匹配的关键词,直接删除
|
||
else:# 如果包含特殊关键词,删除整个括号内容
|
||
text = re.sub(r"[^\w\s]", "", text)
|
||
return text
|
||
|
||
def convert_docx_to_pdf(file_path):
|
||
# 检查文件是否为 .docx 格式
|
||
if file_path.lower().endswith('.docx'):
|
||
# 生成 PDF 文件路径
|
||
pdf_path = os.path.splitext(file_path)[0] + '.pdf'
|
||
|
||
try:
|
||
# 执行转换
|
||
convert(file_path, pdf_path)
|
||
print(f"转换成功: {pdf_path}")
|
||
except Exception as e:
|
||
print(f"转换失败: {e}")
|
||
else:
|
||
print("错误: 文件必须是 .docx 格式。")
|
||
|
||
def save_pdf_from_url(url, file_path):
|
||
from urllib.parse import unquote
|
||
# 发起 GET 请求并保存文件
|
||
response = requests.get(url)
|
||
local_file_path = ''
|
||
url = unquote(url)
|
||
# 检查响应状态码
|
||
if response.status_code == 200:
|
||
# 文件下载成功
|
||
url_without_params = url.split('?')[0]
|
||
# 从处理后的URL中提取文件名
|
||
# 提取文件名
|
||
file_name = url_without_params.split('/')[-1]
|
||
#https://financial-report-test.obs.cn-east-3.myhuaweicloud.com:443/upload/file/909f3dd3337a4dd4bc24fb4748c6c76e.PDF?AccessKeyId=IIDIMIUZ1UBBVPKIVB4W&Expires=1726798358&Signature=fKgrDPjmd99Nje4wwvBJxmFlXZY%3D
|
||
# 指定本地文件保存路径
|
||
local_file_path = file_path + file_name
|
||
# local_file_path = convert_docx_to_pdf(local_file_path)
|
||
|
||
with open(local_file_path, 'wb') as file:
|
||
file.write(response.content)
|
||
print(f"文件已下载到 {local_file_path}")
|
||
else:
|
||
# 文件下载失败
|
||
print(f"无法下载文件,状态码:{response.status_code}")
|
||
|
||
return local_file_path
|
||
|
||
def get_range(count,parts_num):
|
||
# 获取 CPU 核数
|
||
if count < parts_num:
|
||
parts_num = count
|
||
# 使用 divmod() 函数计算除法结果和余数
|
||
quotient, remainder = divmod(count, parts_num)
|
||
count_range_parts = []
|
||
for i in range(parts_num):
|
||
start_num = i * quotient
|
||
if i < parts_num-1:
|
||
start_num = i * quotient
|
||
end_num = start_num+quotient
|
||
else:
|
||
end_num = count
|
||
count_range_parts.append(f'{start_num}-{end_num}')
|
||
return count_range_parts
|
||
|
||
def cosine_similarity(vector_a, vector_b):
|
||
# 将向量转换为 NumPy 数组
|
||
vector_a = np.array(vector_a)
|
||
vector_b = np.array(vector_b)
|
||
|
||
# 计算两个向量的点积
|
||
dot_product = np.dot(vector_a, vector_b)
|
||
|
||
# 计算两个向量的欧几里得范数
|
||
norm_a = np.linalg.norm(vector_a)
|
||
norm_b = np.linalg.norm(vector_b)
|
||
|
||
# 计算余弦相似度
|
||
cosine_sim = dot_product / (norm_a * norm_b)
|
||
|
||
return cosine_sim
|
||
|
||
def get_period_type(text, year):
|
||
l_year = f'{int(year)-1}'
|
||
bl_year = f'{int(year)-2}'
|
||
c_period = f'当期|本期|本报告期|报告期|本年|本期|{year}'
|
||
l_period = f'上年|上期|上年度|{l_year}'
|
||
bl_period = f'前年|{bl_year}'
|
||
|
||
if len(re.findall(c_period, text)) > 0:
|
||
return 'c'
|
||
elif len(re.findall(l_period, text)) > 0:
|
||
return 'l'
|
||
elif len(re.findall(bl_period, text)) > 0:
|
||
return 'bl'
|
||
else:
|
||
return 'c'
|
||
|
||
def get_period_type_other(text, year):
|
||
l_year = f'{int(year)-1}'
|
||
bl_year = f'{int(year)-2}'
|
||
c_period = f'当期|本期|本报告期|报告期|本年|本期|{year}'
|
||
l_period = f'上年|上期|上年度|{l_year}'
|
||
bl_period = f'前年|{bl_year}'
|
||
|
||
if len(re.findall(c_period, text)) > 0:
|
||
return 'c'
|
||
elif len(re.findall(l_period, text)) > 0:
|
||
return 'l'
|
||
elif len(re.findall(bl_period, text)) > 0:
|
||
return 'bl'
|
||
else:
|
||
return 'c_n'
|
||
|
||
def get_start_period_type(text):
|
||
s_period = '期初|1月1日|年初'
|
||
|
||
if len(re.findall(s_period, text)) > 0:
|
||
return ''
|
||
else:
|
||
return '0'
|
||
|
||
def get_season_flag(text):
|
||
season_period = '第1季度|第2季度|第3季度|第4季度|一季度|二季度|三季度|四季度|1-3月|4-6月|7-9月|10-12月'
|
||
if len(re.findall(season_period, text)) > 0:
|
||
return '1'
|
||
else:
|
||
return '0'
|
||
|
||
def get_percent_flag(text):
|
||
percent_word = '收益率|占比|比重|比例|同比增减|同比上升|同比下降|变化幅度|同期增减|本年比上年增减|同比变动|变动比例|本年度比上年度增减|增减'
|
||
if len(re.findall(percent_word, text)) > 0:
|
||
return '1'
|
||
else:
|
||
return '0'
|
||
|
||
def get_kf_flag(text):
|
||
kf_word = '扣非|扣除非经常性损益'
|
||
if len(re.findall(kf_word, text)) > 0:
|
||
return '1'
|
||
else:
|
||
return '0'
|
||
|
||
def get_report_start(text):
|
||
kf_word = '报告期初|1月1日'
|
||
if len(re.findall(kf_word, text)) > 0:
|
||
return '1'
|
||
else:
|
||
return '0'
|
||
|
||
def get_percent_growth(text):
|
||
percent_growth_word = '变动|本年比上年|比例同比增减|比例同比上升|比例同比下降|比例变化幅度|比例变动比例|比例本期比上年同期增减|比例本年比上年增减|比例同比变动|比例本期期末金额较上期期末变动比例|比率同比增减|比率同比上升|比率同比下降|比率变化幅度|比率变动比例|比率本期比上年同期增减|比率本年比上年增减|比率同比变动|比率本期期末金额较上期期末变动比例|占比同比增减|占比同比上升|占比同比下降|占比变化幅度|占比变动比例|占比本期比上年同期增减|占比本年比上年增减|占比同比变动|占比本期期末金额较上期期末变动比例|费用同比增减|费用同比上升|费用同比下降|费用变化幅度|费用变动比例|费用本期比上年同期增减|费用本年比上年增减|费用同比变动|费用本期期末金额较上期期末变动比例'
|
||
if len(re.findall(percent_growth_word, text)) > 0:
|
||
return '1'
|
||
else:
|
||
return '0'
|
||
def check_black_list(meta_measure, pdf_measure, black_array):
|
||
# 获取黑名单数据
|
||
#black_array = fetch_black_list_data(cursor)
|
||
|
||
for black in black_array:
|
||
black_meta = black.split(':')[0]
|
||
black_pdfs = black.split(':')[1].split(',')
|
||
if meta_measure==black_meta:
|
||
for pdf in black_pdfs:
|
||
if pdf_measure.find(pdf) >= 0:
|
||
return True
|
||
return False
|
||
|
||
def check_black_list_old(meta_measure,pdf_measure):
|
||
# 判断指标名是否包含黑名单词
|
||
#black_array = ['非经常性损益:非经常性损益合计,非经常性损益总额','营业收入:营业外收入,主营业务,营业总收入,扣除,年度公司','归母净利润:净资产,净利率,扣除,年度公司','扣非净利润:净资产,净利率,年度公司','经营活动现金流净额:筹资活动,投资活动,流入小计,流出小计','筹资活动现金流净额:经营活动,投资活动,流入小计,流出小计','投资活动现金流净额:经营活动,筹资活动,流入小计,流出小计','非经常性损益:扣除非经常性损益','基本每股收益:稀释每股收益','稀释每股收益:基本每股收益','总资产:净资产','应收账款:应付账款','短期借款:长期借款','应付账款:应收账款','长期借款:短期借款','研发投入:比例,比率,占比,费用','资本化研发投入:比例,比率,占比,费用','资本化研发投入占比:金额,费用','研发投入占营业收入比例:金额,费用','上年年末:1月1日']
|
||
black_array = ['非经常性损益:非经常性损益合计,非经常性损益总额,合计'
|
||
,'营业收入:营业外收入,主营业务,营业总收入,扣除,年底公司,合计,汇总'
|
||
,'归母净利润:净资产,净利率,扣除,年度公司,归属于本公司普通股股东的净利润'
|
||
,'扣非净利润:净资产,净利率,年度公司'
|
||
,'经营活动现金流净额:筹资活动,投资活动,流入小计,流出小计,每股,扣除'
|
||
,'筹资活动现金流净额:经营活动,投资活动,流入小计,流出小计,每股,扣除'
|
||
,'投资活动现金流净额:经营活动,筹资活动,流入小计,流出小计,每股,扣除'
|
||
,'非经常性损益:扣除非经常性损益'
|
||
,'基本每股收益:稀释每股收益,发行新股'
|
||
,'稀释每股收益:基本每股收益,发行新股'
|
||
,'总资产:净资产','应收账款:应付账款,年以上,内,至,到'
|
||
,'短期借款:长期借款,非流动负债,年以上,年以内,内,至,到'
|
||
,'应付账款:应收账款,年以上,内,至,到'
|
||
,'长期借款:短期借款,非流动负债,年以上,内,至,到,保证,抵押'
|
||
,'研发投入:比例,比率,占比,费用,占'
|
||
,'资本化研发投入:比例,比率,占比,费用,占'
|
||
,'资本化研发投入占比:金额,费用'
|
||
,'研发投入占营业收入比例:金额,费用'
|
||
,'上年年末:1月1日'
|
||
,'期加权平均净资产收益率:同比,扣除,扣非,年化,每股'
|
||
,'期扣非加权平均净资产收益率:同比,年化,每股'
|
||
,'加权平均净资产收益率同比变动:年化,每股'
|
||
,'研发费用:制造,投入,直接,管理'
|
||
,'应收账款:1-2年','货币资金:在途'
|
||
,'当期:2023年1-6月,调整后'
|
||
,'营业成本:营业总成本'
|
||
,'长期借债:年内到期','研发投入:直接'
|
||
,'第一季度:第二季度,第三季度,第四季度'
|
||
,'第二季度:第一季度,第三季度,第四季度'
|
||
,'第三季度:第二季度,第一季度,第四季度'
|
||
,'第四季度:第二季度,第三季度,第一季度'
|
||
,'研发费用:研发支出,研发投入','存货:跌价准备'
|
||
,'费用:日常,付现','固定资产:改良,补助,投资']
|
||
# current_period = f'当期:{report_year}年1-6月'
|
||
# black_array.append(current_period)
|
||
for black in black_array:
|
||
black_meta = black.split(':')[0]
|
||
black_pdfs = black.split(':')[1].split(',')
|
||
if meta_measure.find(black_meta) >= 0:
|
||
for pdf in black_pdfs:
|
||
if pdf_measure.find(pdf) >= 0:
|
||
return True
|
||
return False
|
||
def check_white_list(meta_measure,pdf_measure):
|
||
white_array = ['基本每股收益:每股收益','加权平均净资产收益率同比变动:比','季度变动比例:比']
|
||
for black in white_array:
|
||
black_meta = black.split(':')[0]
|
||
black_pdfs = black.split(':')[1].split(',')
|
||
if meta_measure.find(black_meta) >= 0:
|
||
for pdf in black_pdfs:
|
||
if pdf_measure.find(pdf) < 0:
|
||
return True
|
||
return False
|
||
|
||
def check_title_black_list(meta_measure,text_info):
|
||
# 判断指标名是否包含黑名单词
|
||
black_array = ['营业收入:前五名,前5名,合计','营业成本:合计','财务费用:现金流','销售费用:现金流','管理费用:现金流','研发费用:现金流','非经常性损益:合计']
|
||
for black in black_array:
|
||
black_meta = black.split(':')[0]
|
||
black_pdfs = black.split(':')[1].split(',')
|
||
if meta_measure.find(black_meta) >= 0:
|
||
for pdf in black_pdfs:
|
||
if text_info.find(pdf) >= 0:
|
||
return True
|
||
return False
|
||
|
||
# 文本中数字的占比
|
||
def under_non_alpha_ratio(text: str, threshold: float = 0.6):
|
||
|
||
if len(text) == 0:
|
||
return False
|
||
|
||
alpha_count = len([char for char in text if char.strip() and char.isalpha()])
|
||
total_count = len([char for char in text if char.strip()])
|
||
try:
|
||
ratio = alpha_count / total_count
|
||
return ratio <= threshold
|
||
except:
|
||
return False
|
||
def check_table_title_black_list(text,table_title_black_list):#report_year
|
||
#previous_year = int(report_year) - 1
|
||
if table_title_black_list is None:
|
||
return False
|
||
if len(re.findall(table_title_black_list, text)) > 0:
|
||
return True
|
||
if re.search(r'上年度\s*$', text):
|
||
return True
|
||
return False
|
||
#通过关键词黑名单匹配表格上方的文本区域,提取需要过滤的表格
|
||
def check_table_title_black_list_old(text,report_year):#report_year
|
||
previous_year = int(report_year) - 1
|
||
table_title_black_list = f"""所有权或使用权受到限制的资产|持有待售资产|关联交易|未确认递延所得税资产明细|{previous_year}年度|{previous_year}年1-6月|自{previous_year}年1月1日至6月30日止期间|流动性风险|关联交易|账龄超过|流动风险|公司资产负债表|按账龄组合|线上直营|线上直销|公司现金流量表|公司利润表|应收账款|在建工程|固定资产|其他与筹资活动有关的现金|汇率风险|市场风险|主营业务收入|主营收入|其他收入|前五名|前5名|经营活动有关的现金|股份变动对最近一年和最近一期每股收益、每股净资产等财务指标的影响|合同产生的收入情况|子公司|参股公司|控股公司|分解信息|经营活动产生的现金|行业分类|产品分类|地区分类|业绩快报|销售渠道|调整情况说明|合同分类|计入当期损益的政府补助|股份变动对最近一年和最近一期|分部的财务信息|显示服务创收|线上销售情况|试运行销售|会计政策变更|品牌经营业务|工程施工业务|开发业务|制造业务|合营安排或联营企业中的权益|联营企业的主要财务信息|汇率及通货膨胀|与金融工具相关的风险|运营业务|B端业务|终止经营现金流量|终止经营|公司股份总数及股东结构变动及公司资产和负债结构的变动情况|母公司|现金流量表补充|直营店店效情况|担保人2023年度未经审计的|外汇风险|公司各业务板块经营情况|报告期确认的包括在合同负债期初账面价值中的收入|资产受限情况|资产权利受限情况|内控自我评价报告|所有权或使用权受限资产|合并日被合并方资产、负债的账面价值|经营租赁资产|前5|前五|②|不属于现金及现金等价物的货币资金|按销售模式分|按产品类别分|按照销售区域|产品类别|销售模式|经销模式|关键管理人员|截至{previous_year}年6月30日止六个月期间|关联方提供的存款及贷款服务|报告期内各销售渠道的盈利情况|报告期内各地区的盈利情况|报告期内各产品的盈利情况|其他非流动负债|关联方提供的存款及贷款服务|自营销售分商品类别数据|组合计提|考核指标|不属于现金及现金等价物的货币资金|应收款项融资|本期计提、收回或转回的坏账准备情况|存货跌价准备|持有待售负债"""
|
||
|
||
if len(re.findall(table_title_black_list, text)) > 0:
|
||
return True
|
||
if re.search(r'上年度\s*$', text):
|
||
return True
|
||
return False
|
||
#通过关键词黑名单匹配页面下方的文本区域,提取需要过滤的表格
|
||
|
||
def check_table_title_black_list_button(text,table_title_black_list):
|
||
|
||
if table_title_black_list is None:
|
||
return False
|
||
|
||
if len(re.findall(table_title_black_list, text)) > 0:
|
||
return True
|
||
if re.search(r'上年度\s*$', text):
|
||
return True
|
||
return False
|
||
def check_table_title_black_list_button_old(text):
|
||
|
||
table_title_black_list = """公司资产负债表|公司现金流量表|公司利润表|主营业务收入|主营收入|其他收入|前五名|前5名|经营活动有关的现金|股份变动对最近一年和最近一期每股收益、每股净资产等财务指标的影响|合同产生的收入情况|子公司|参股公司|控股公司|分解信息|经营活动产生的现金|2022年度|行业分类|产品分类|地区分类|业绩快报|销售渠道|调整情况说明|合同分类|计入当期损益政府补助|股份变动对最近一年和最近一期|分部的财务信息|显示服务创收|线上销售情况|试运行销售|品牌经营业务|工程施工业务|开发业务|制造业务|合营安排或联营企业中的权益|联营企业的主要财务信息|汇率及通货膨胀|与金融工具相关的风险|运营业务|B端业务|终止经营现金流量|终止经营|公司股份总数及股东结构变动及公司资产和负债结构的变动情况|不属于现金及现金等价物的货币资金|经营租赁资产|分地区|分产品|分行业|使用权受限资产|资产受限情况|经销模式|持续的第三层次公允价值计量项目,期初与期末账面价值间的调节信息及不可观察参数敏感|权利受限情况|应收款项融资|本期计提、收回或转回的坏账准备情况"""
|
||
|
||
|
||
if len(re.findall(table_title_black_list, text)) > 0:
|
||
return True
|
||
if re.search(r'上年度\s*$', text):
|
||
return True
|
||
return False
|
||
def check_table_title_black_list_measure(text):
|
||
#black_array = ['补充资料:研发费用,管理费用,财务费用'
|
||
# ,'营业收入:营业外收入,主营业务,营业总收入,扣除,年底公司,合计,汇总'
|
||
#]
|
||
table_title_black_list = """补充资料|测试文本|其他非流动负债|应收款项融资|本期计提、收回或转回的坏账准备情况|筹资活动产生的各项负债变动情况|持有待售资产|账龄超过 1 年或逾期的重要应付账款|经营租赁资产|计息金融工具|坏账准备"""
|
||
if len(re.findall(table_title_black_list, text)) > 0:
|
||
return True
|
||
return False
|
||
#过滤原始指标中包含黑名单
|
||
def check_pdf_measure_black_list(text):
|
||
pdf_measure_black_list = '股权变动前|股权变动后|含股份支付|境内|境外|调整前|有限公司|责任公司|其他|变更前|差异|同口径|调整金额'
|
||
if len(re.findall(pdf_measure_black_list, text)) > 0:
|
||
return True
|
||
if "其中:营业收入" in text:
|
||
return False
|
||
if "同比" in text and "额" in text:
|
||
#if text.find("同比") < text.find("额"):
|
||
if text.endswith("额"):
|
||
return True
|
||
return False
|
||
|
||
|
||
def check_pdf_measure(pdf_measure):
|
||
keywords_1 = [
|
||
'2022年', '2023年', '2021年', '第一季度', '第二季度', '第三季度', '第四季度', '增减', '变动', '本期','同期', '当期', '报告期', '前年',
|
||
'上年', '上期', '本年', '1-3月', '4-6月', '7-9月', '10-12月'
|
||
]
|
||
|
||
keywords_2 = ['这里是一个测试文本']
|
||
|
||
contain_keyword_1 = any(keyword in pdf_measure for keyword in keywords_1)
|
||
contain_keyword_2 = any(keyword in pdf_measure for keyword in keywords_2)
|
||
#只有 未出现周期,同时出现了'调整后'才会删掉指标
|
||
if not contain_keyword_1 and contain_keyword_2:
|
||
return True
|
||
return False
|
||
# def check_white_list(meta_measure,pdf_measure):
|
||
# # 判断指标名是否包含白名单词
|
||
# black_array = ['营业收入:营业外收入,主营业务,营业总收入,扣除','归母净利润:净资产,净利率,扣除','扣非净利润:净资产,净利率','经营活动现金流净额:筹资活动,投资活动,流入小计,流出小计','筹资活动现金流净额:经营活动,投资活动,流入小计,流出小计','投资活动现金流净额:经营活动,筹资活动,流入小计,流出小计','非经常性损益:扣除非经常性损益','基本每股收益:稀释每股收益','稀释每股收益:基本每股收益','总资产:净资产','应收账款:应付账款','短期借款:长期借款','应付账款:应收账款','长期借款:短期借款','研发投入:比例,比率,占比,费用','资本化研发投入:比例,比率,占比,费用','资本化研发投入占比:金额,费用','研发投入占营业收入比例:金额,费用']
|
||
# for black in black_array:
|
||
# black_meta = black.split(':')[0]
|
||
# black_pdfs = black.split(':')[1].split(',')
|
||
# if meta_measure.find(black_meta) >= 0:
|
||
# for pdf in black_pdfs:
|
||
# if pdf_measure.find(pdf) >= 0:
|
||
# return True
|
||
# return False
|
||
def check_line_text(line_text):
|
||
if line_text == 'PAGE':
|
||
return False
|
||
if line_text == '(续)':
|
||
return False
|
||
if line_text.endswith('(续)'):
|
||
return False
|
||
if line_text.endswith("年度财务报表") and "有限公司" in line_text:
|
||
return False
|
||
if len(line_text) < 20 and line_text.endswith("有限公司"):
|
||
return False
|
||
substrings = [
|
||
'对内加快发展方式绿色转型、对外形成绿色生产和生活方式',
|
||
'可持续发展、创新发展;“8”是八大绿色行动',
|
||
'色新赋能、催生绿色新科技、筑牢绿色新支撑',
|
||
'接上表','续上表',
|
||
]
|
||
for substring in substrings:
|
||
if substring in line_text:
|
||
return False
|
||
return True
|
||
|
||
def pdf_text_flag(text : str):
|
||
if under_non_alpha_ratio(text):
|
||
return True
|
||
|
||
if len(text) < 5:
|
||
return True
|
||
|
||
if not re.findall(',|,|。|、|(|)',text):
|
||
return True
|
||
|
||
if text.find('适用') != -1 and text.find('不适用') != -1:
|
||
return True
|
||
|
||
if text.find('是') != -1 and text.find('否') != -1:
|
||
return True
|
||
|
||
return False
|
||
|
||
def get_change_rate_flag(text):
|
||
percent_word = '同比增减|同比上升|同比下降|变化幅度|变动比例|本期比上年同期增减|本年比上年增减|同比变动|本期期末金额较上期期末变动比例'
|
||
if len(re.findall(percent_word, text)) > 0:
|
||
return '1'
|
||
else:
|
||
return '0'
|
||
|
||
def check_pdf_measure_black_list_v3(file_id,table_num,table_index,pdf_measure,conn_app,cursor_app):
|
||
content_value = f"{table_num}_{table_index}"
|
||
measure_index_array = []
|
||
select_measure_index_query = '''
|
||
SELECT DISTINCT text FROM measure_parser_info_linetext WHERE file_id = %s AND type = 'measure_index' and content = %s
|
||
'''
|
||
cursor_app.execute(select_measure_index_query, (file_id,content_value,))
|
||
measure_index_records = cursor_app.fetchall()
|
||
for measure_index_record in measure_index_records:
|
||
measure_index_array.append(measure_index_record[0])
|
||
black_array = ['补充资料:研发费用,管理费用,财务费用,销售费用'
|
||
,'测试标题:测试指标'
|
||
,'其他非流动负债:合同负债'
|
||
,'应收款项融资:应收账款'
|
||
,'本期计提、收回或转回的坏账准备情况:应收账款'
|
||
,'筹资活动产生的各项负债变动情况:短期借款,长期借款'
|
||
,'持有待售资产:固定资产'
|
||
,'账龄超过 1 年或逾期的重要应付账款:应付账款'
|
||
,'经营租赁资产:固定资产'
|
||
,'计息金融工具:货币资金,短期借款,交易性金融资产'
|
||
,'坏账准备:应收账款'
|
||
]
|
||
for black in black_array:
|
||
black_meta = black.split(':')[0]
|
||
black_pdfs = black.split(':')[1].split(',')
|
||
#if measure_index_array.find(black_meta) >= 0:
|
||
#if black_meta in measure_index_array:
|
||
if any(black_meta in measure_index for measure_index in measure_index_array):
|
||
if any(pdf in pdf_measure for pdf in black_pdfs):
|
||
#for pdf in black_pdfs:
|
||
#if pdf in pdf_measure:
|
||
#if pdf_measure.find(pdf) >= 0:
|
||
return True
|
||
return False
|
||
def check_black_table_list(data):
|
||
black_array = ['补充资料:研发费用,管理费用,财务费用,销售费用',
|
||
#'补充目录:母公司'
|
||
]
|
||
for black in black_array:
|
||
black_meta = black.split(':')[0]
|
||
black_pdfs = black.split(':')[1].split(',')
|
||
if any(black_meta in cell for row in data for cell in row):
|
||
print(data)
|
||
for pdf in black_pdfs:
|
||
data = [row for row in data if not any(pdf in cell for cell in row)]
|
||
return data
|
||
|
||
if __name__ == '__main__':
|
||
|
||
print(len('我是我'))
|
||
|
||
# print(under_non_alpha_ratio('202水电费水电费水电费是的205月'))
|
||
# title = '母公司财务报表主要项目注释'
|
||
# if len(re.findall('母公司|现金流量表补充', title)) >0 and len(re.findall('项目注释', title)) == 0:
|
||
# print('1')
|
||
# else:
|
||
# print('0')
|
||
|
||
# print(check_black_list('当期投资活动现金流净额','当前筹资活动现金流净额'))
|
||
# test = '2023年1-12月'
|
||
# print(get_period_type('上年度本期费用化研发投入'))
|
||
# print(get_period_type('费用化研发投入本年度'))
|
||
# vector_a = embed_with_str('第一季度营业收入')
|
||
# vector = vector_a.output["embeddings"][0]["embedding"]
|
||
|
||
# vector_b = embed_with_str('营业收入第一季度')
|
||
# vector1 = vector_b.output["embeddings"][0]["embedding"]
|
||
|
||
# similarity = cosine_similarity(vector, vector1)
|
||
# print(f"余弦相似度: {similarity}")
|
||
|
||
# measure_data = [
|
||
# '1,1,营业收入2023年金额,1003535799.51',
|
||
# '1,1,营业收入2022年金额,869401513.71',
|
||
# '1,1,营业收入变动比例,15.43%',
|
||
# '1,1,营业成本2023年金额,810779075.89',
|
||
# '1,1,营业成本2023年占营业收入的比重,80.79%',
|
||
# '1,1,营业成本2022年金额,702990363.57',
|
||
# '1,1,营业成本2022年占营业收入的比重,80.86%',
|
||
# '1,1,营业成本变动比例,15.33%',
|
||
# '1,1,毛利率2023年金额,19.21%',
|
||
# '1,1,毛利率2022年金额,19.14%',
|
||
# '1,1,销售费用2023年金额,34065464.60',
|
||
# '1,1,销售费用2023年占营业收入的比重,3.39%',
|
||
# '1,1,销售费用2022年金额,28038106.19',
|
||
# '1,1,销售费用2022年占营业收入的比重,3.22%',
|
||
# '1,1,销售费用变动比例,21.50%',
|
||
# '1,1,管理费用2023年金额,50807308.69',
|
||
# '1,1,管理费用2023年占营业收入的比重,5.06%',
|
||
# '1,1,管理费用2022年金额,38251704.48',
|
||
# '1,1,管理费用2022年占营业收入的比重,4.40%',
|
||
# '1,1,管理费用变动比例,32.82%',
|
||
# '1,1,研发费用2023年金额,35312198.23',
|
||
# '1,1,研发费用2023年占营业收入的比重,3.52%',
|
||
# '1,1,研发费用2022年金额,30081787.99',
|
||
# '1,1,研发费用2022年占营业收入的比重,3.46%',
|
||
# '1,1,研发费用变动比例,17.39%',
|
||
# '1,1,财务费用2023年金额,8015604.52',
|
||
# '1,1,财务费用2023年占营业收入的比重,0.80%',
|
||
# '1,1,财务费用2022年金额,5739677.85',
|
||
# '1,1,财务费用2022年占营业收入的比重,0.66%',
|
||
# '1,1,财务费用变动比例,39.65%',
|
||
# '1,1,信用减值损失2023年金额,-11873626.82',
|
||
# '1,1,信用减值损失2023年占营业收入的比重,-1.18%',
|
||
# '1,1,信用减值损失2022年金额,-8903293.61',
|
||
# '1,1,信用减值损失2022年占营业收入的比重,-1.02%',
|
||
# '1,1,信用减值损失变动比例,33.36%',
|
||
# '1,1,资产减值损失2023年金额,-2328729.46',
|
||
# '1,1,资产减值损失2023年占营业收入的比重,-0.23%',
|
||
# '1,1,资产减值损失2022年金额,-2285987.53',
|
||
# '1,1,资产减值损失2022年占营业收入的比重,-0.26%',
|
||
# '1,1,资产减值损失变动比例,1.87%',
|
||
# '1,1,其他收益2023年金额,17886048.88',
|
||
# '1,1,其他收益2023年占营业收入的比重,1.78%',
|
||
# '1,1,其他收益2022年金额,11025908.32',
|
||
# '1,1,其他收益2022年占营业收入的比重,1.27%',
|
||
# '1,1,其他收益变动比例,62.22%',
|
||
# '1,1,投资收益2023年金额,323361.47',
|
||
# '1,1,投资收益2023年占营业收入的比重,0.03%',
|
||
# '1,1,投资收益2022年金额,1119730.43',
|
||
# '1,1,投资收益2022年占营业收入的比重,0.13%',
|
||
# '1,1,投资收益变动比例,-71.12%',
|
||
# '1,1,公允价值变动收益2023年占营业收入的比重,0.00%',
|
||
# '1,1,公允价值变动收益2022年金额,10183.62',
|
||
# '1,1,公允价值变动收益2022年占营业收入的比重,0.00%',
|
||
# '1,1,公允价值变动收益变动比例,-100.00%',
|
||
# '1,1,资产处置收益2023年金额,12782544.48',
|
||
# '1,1,资产处置收益2023年占营业收入的比重,1.27%',
|
||
# '1,1,资产处置收益2022年金额,-59.56',
|
||
# '1,1,资产处置收益2022年占营业收入的比重,0.00%',
|
||
# '1,1,资产处置收益变动比例,21461726.06%',
|
||
# '1,1,汇兑收益2023年金额,0',
|
||
# '1,1,汇兑收益2023年占营业收入的比重,0%',
|
||
# '1,1,汇兑收益2022年金额,0',
|
||
# '1,1,汇兑收益2022年占营业收入的比重,0%',
|
||
# '1,1,汇兑收益变动比例,0%',
|
||
# '1,1,营业利润2023年金额,76175407.00',
|
||
# '1,1,营业利润2023年占营业收入的比重,7.59%',
|
||
# '1,1,营业利润2022年金额,63332601.81',
|
||
# '1,1,营业利润2022年占营业收入的比重,7.28%',
|
||
# '1,1,营业利润变动比例,20.28%',
|
||
# '1,1,营业外收入2023年金额,5788307.99',
|
||
# '1,1,营业外收入2023年占营业收入的比重,0.58%',
|
||
# '1,1,营业外收入2022年金额,1083997.19',
|
||
# '1,1,营业外收入2022年占营业收入的比重,0.12%',
|
||
# '1,1,营业外收入变动比例,433.98%',
|
||
# '1,1,营业外支出2023年金额,687271.68',
|
||
# '1,1,营业外支出2023年占营业收入的比重,0.07%',
|
||
# '1,1,营业外支出2022年金额,1554243.54',
|
||
# '1,1,营业外支出2022年占营业收入的比重,0.18%',
|
||
# '1,1,营业外支出变动比例,-55.78%',
|
||
# '1,1,净利润2023年金额,72975283.09',
|
||
# '1,1,净利润2023年占营业收入的比重,7.27%',
|
||
# '1,1,净利润2022年金额,57747603.98',
|
||
# '1,1,净利润2022年占营业收入的比重,6.64%',
|
||
# '1,1,净利润变动比例,26.37%',
|
||
# '1,1,税金及附加2023年金额,5170339.13',
|
||
# '1,1,税金及附加2023年占营业收入的比重,0.52%',
|
||
# '1,1,税金及附加2022年金额,1933753.49',
|
||
# '1,1,税金及附加2022年占营业收入的比重,0.22%',
|
||
# '1,1,税金及附加变动比例,167.37%',
|
||
# '1,1,所得税费用2023年金额,8301160.22',
|
||
# '1,1,所得税费用2023年占营业收入的比重,0.83%',
|
||
# '1,1,所得税费用2022年金额,5114751.48',
|
||
# '1,1,所得税费用2022年占营业收入的比重,0.59%',
|
||
# '1,1,所得税费用变动比例,62.30%',
|
||
# '1,1,少数股东损益2023年金额,-58350.22',
|
||
# '1,1,少数股东损益2023年占营业收入的比重,-0.01%',
|
||
# '1,1,少数股东损益2022年金额,-946.60',
|
||
# '1,1,少数股东损益2022年占营业收入的比重,0.00%',
|
||
# '1,1,少数股东损益变动比例,-6064.19%',
|
||
# '1,1,归属于母公司所有者的净利润2023年金额,73033633.31',
|
||
# '1,1,归属于母公司所有者的净利润2023年占营业收入的比重,7.28%',
|
||
# '1,1,归属于母公司所有者的净利润2022年金额,57748550.58',
|
||
# '1,1,归属于母公司所有者的净利润2022年占营业收入的比重,6.64%',
|
||
# '1,1,归属于母公司所有者的净利润变动比例,26.47%',
|
||
# '1,1,归属于少数股东的综合收益总额2023年金额,-58350.22',
|
||
# '1,1,归属于少数股东的综合收益总额2023年占营业收入的比重,-0.01%',
|
||
# '1,1,归属于少数股东的综合收益总额2022年金额,-946.60',
|
||
# '1,1,归属于少数股东的综合收益总额2022年占营业收入的比重,0.00%',
|
||
# '1,1,归属于少数股东的综合收益总额变动比例,-6064.19%',
|
||
# '1,1,归属于母公司所有者的综合收益总额2023年金额,73033633.31',
|
||
# '1,1,归属于母公司所有者的综合收益总额2023年占营业收入的比重,7.28%',
|
||
# '1,1,归属于母公司所有者的综合收益总额2022年金额,57748550.58',
|
||
# '1,1,归属于母公司所有者的综合收益总额2022年占营业收入的比重,6.64%',
|
||
# '1,1,归属于母公司所有者的综合收益总额变动比例,26.47%',
|
||
# '2,1,主营业务收入2023年,983698831.48',
|
||
# '2,1,主营业务收入2022年,854682261.31',
|
||
# '2,1,主营业务收入变动比例,15.10%',
|
||
# '2,1,其他业务收入2023年,19836968.03',
|
||
# '2,1,其他业务收入2022年,14719252.40',
|
||
# '2,1,其他业务收入变动比例,34.77%',
|
||
# '2,1,主营业务成本2023年,793604607.43',
|
||
# '2,1,主营业务成本2022年,690932741.27',
|
||
# '2,1,主营业务成本变动比例,14.86%',
|
||
# '2,1,其他业务成本2023年,17174468.46',
|
||
# '2,1,其他业务成本2022年,12057622.30',
|
||
# '2,1,其他业务成本变动比例,42.44%',
|
||
# '3,1,变压器营业收入,490028234.05',
|
||
# '3,1,变压器营业成本,402179824.08',
|
||
# '3,1,变压器毛利率,17.93%',
|
||
# '3,1,变压器营业收入比上年同期增减,16.22%',
|
||
# '3,1,变压器营业成本比上年同期增减,16.33%',
|
||
# '3,1,变压器毛利率比上年同期增减,减少0.07个百分点',
|
||
# '3,1,高低压成套开关设备营业收入,261342442.26',
|
||
# '3,1,高低压成套开关设备营业成本,206645237.99',
|
||
# '3,1,高低压成套开关设备毛利率,20.93%',
|
||
# '3,1,高低压成套开关设备营业收入比上年同期增减,-8.93%',
|
||
# '3,1,高低压成套开关设备营业成本比上年同期增减,-9.91%',
|
||
# '3,1,高低压成套开关设备毛利率比上年同期增减,增加0.86个百分点',
|
||
# '3,1,户外成套设备营业收入,198013248.27',
|
||
# '3,1,户外成套设备营业成本,157856817.84',
|
||
# '3,1,户外成套设备毛利率,20.28%',
|
||
# '3,1,户外成套设备营业收入比上年同期增减,62.25%',
|
||
# '3,1,户外成套设备营业成本比上年同期增减,65.30%',
|
||
# '3,1,户外成套设备毛利率比上年同期增减,减少1.47个百分点',
|
||
# '3,1,其他营业收入,54151874.93',
|
||
# '3,1,其他营业成本,44097195.98',
|
||
# '3,1,其他毛利率,18.57%',
|
||
# '3,1,其他营业收入比上年同期增减,39.68%',
|
||
# '3,1,其他营业成本比上年同期增减,36.10%',
|
||
# '3,1,其他毛利率比上年同期增减,增加2.14个百分点',
|
||
# '3,1,合计营业收入,1003535799.51',
|
||
# '3,1,合计营业成本,810779075.89',
|
||
# '3,2,东北地区营业收入,2425280.53',
|
||
# '3,2,东北地区营业成本,1427939.37',
|
||
# '3,2,东北地区毛利率,41.12%',
|
||
# '3,2,东北地区营业收入比上年同期增减,-69.51%',
|
||
# '3,2,东北地区营业成本比上年同期增减,-77.58%',
|
||
# '3,2,东北地区毛利率比上年同期增减,增加21.20个百分点',
|
||
# '3,2,华北地区营业收入,70542020.62',
|
||
# '3,2,华北地区营业成本,53044055.18',
|
||
# '3,2,华北地区毛利率,24.81%',
|
||
# '3,2,华北地区营业收入比上年同期增减,205.32%',
|
||
# '3,2,华北地区营业成本比上年同期增减,203.18%',
|
||
# '3,2,华北地区毛利率比上年同期增减,增加0.54个百分点',
|
||
# '3,2,华东地区营业收入,770352353.33',
|
||
# '3,2,华东地区营业成本,636803535.34',
|
||
# '3,2,华东地区毛利率,17.34%',
|
||
# '3,2,华东地区营业收入比上年同期增减,24.17%',
|
||
# '3,2,华东地区营业成本比上年同期增减,25.30%',
|
||
# '3,2,华东地区毛利率比上年同期增减,减少0.74个百分点',
|
||
# '3,2,华南地区营业收入,18509519.71',
|
||
# '3,2,华南地区营业成本,14496855.46',
|
||
# '3,2,华南地区毛利率,21.68%',
|
||
# '3,2,华南地区营业收入比上年同期增减,-57.08%',
|
||
# '3,2,华南地区营业成本比上年同期增减,-57.98%',
|
||
# '3,2,华南地区毛利率比上年同期增减,增加1.67个百分点',
|
||
# '3,2,华中地区营业收入,60588394.64',
|
||
# '3,2,华中地区营业成本,44559969.21',
|
||
# '3,2,华中地区毛利率,26.45%',
|
||
# '3,2,华中地区营业收入比上年同期增减,-51.24%',
|
||
# '3,2,华中地区营业成本比上年同期增减,-55.13%',
|
||
# '3,2,华中地区毛利率比上年同期增减,增加6.38个百分点',
|
||
# '3,2,西北地区营业收入,58618014.32',
|
||
# '3,2,西北地区营业成本,42844719.81',
|
||
# '3,2,西北地区毛利率,26.91%',
|
||
# '3,2,西北地区营业收入比上年同期增减,178.59%',
|
||
# '3,2,西北地区营业成本比上年同期增减,173.62%',
|
||
# '3,2,西北地区毛利率比上年同期增减,增加1.33个百分点',
|
||
# '3,2,西南地区营业收入,22500216.36',
|
||
# '3,2,西南地区营业成本,17602001.52',
|
||
# '3,2,西南地区毛利率,21.77%',
|
||
# '3,2,西南地区营业收入比上年同期增减,-23.74%',
|
||
# '3,2,西南地区营业成本比上年同期增减,-17.89%',
|
||
# '3,2,西南地区毛利率比上年同期增减,减少5.57个百分点',
|
||
# '3,2,合计营业收入,1003535799.51',
|
||
# '3,2,合计营业成本,810779075.89',
|
||
# '5,2,经营活动产生的现金流量净额2023年,-44713443.44',
|
||
# '5,2,经营活动产生的现金流量净额2022年,-53241071.45',
|
||
# '5,2,经营活动产生的现金流量净额变动比例,16.02%',
|
||
# '5,2,投资活动产生的现金流量净额2023年,-88649920.50',
|
||
# '5,2,投资活动产生的现金流量净额2022年,-94251741.15',
|
||
# '5,2,投资活动产生的现金流量净额变动比例,5.94%',
|
||
# '5,2,筹资活动产生的现金流量净额2023年,96607197.26',
|
||
# '5,2,筹资活动产生的现金流量净额2022年,210537586.22',
|
||
# '5,2,筹资活动产生的现金流量净额变动比例,-54.11%'
|
||
# ]
|
||
|
||
# client = MilvusClient(
|
||
# uri="http://localhost:19530"
|
||
# )
|
||
# vector_obj = embed_with_str('2023年营业收入')
|
||
# vector = vector_obj.output["embeddings"][0]["embedding"]
|
||
# data = [vector]
|
||
# res = client.search(
|
||
# collection_name="zzb_measure", # Replace with the actual name of your collection
|
||
# # Replace with your query vector
|
||
# data=data,
|
||
# limit=1, # Max. number of search results to return
|
||
# search_params={"metric_type": "COSINE", "params": {}}, # Search parameters
|
||
# output_fields=["measure_name","measure_value"]
|
||
# )
|
||
|
||
# # Convert the output to a formatted JSON string
|
||
# result = json.dumps(res, indent=4, ensure_ascii=False)
|
||
# print(result)
|
||
|
||
# insert_measure_data(client, measure_data)
|
||
# text = '营业收入第一季度(1-3月份)'
|
||
# new_text = re.sub(r'([^)]*)', '',text)
|
||
# print(new_text)
|