pdf_code/zzb_data_prod/utils.py

813 lines
43 KiB
Python
Raw 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.

#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季度": "第四季度",
"调整后": "调整后",
"增减":"增减",
"": "",
"": "",
"": "",
"年内到期":"年内到期",
"16月":"",
"发行新股":"发行新股",
}
#针对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)