print('大作业实验报告')
#####运行
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl
import datetime
mpl.rcParams['font.sans-serif']=['FangSong']
mpl.rcParams['axes.unicode_minus']=False
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
import requests
import fitz
import re
import pandas as pd
from pprint import pprint
import os
##需要的股票代码
codes1=['688566',
'688575',
'688578',
'688606',
'688656',
'688658',
'688670',
'688687',
'688767',
'688799']
codes2=['688575',
'688670',
'688767' ]
codes3=['688566',
'688575',
'688578',
# '688606', #
'688656',
'688658',
'688670',
'688687',
# '688767', #
'688799']
##################################
###1.批量下载PDF网站
from get_html import pl_get_table_see
pl_get_table_see(codes1)
##################################
##2.删除无关的网站
from leach import pl_shanchu,pl_filter_nb_10y
pl_shanchu(codes1)
pl_filter_nb_10y(codes1)
##################################
##3.下载年报
from download import prepare_hrefs_years,download_pdfs
for code in codes1:
fname = f'C:/Users/lenovo/Desktop/{code}.csv'
df =pd.read_csv(fname)
n=prepare_hrefs_years(df)
hrefs=n[0]
years=n[1]
download_pdfs(hrefs,code,years)
利用定义的函数从网址获取到下载网址,再对网址进行过滤,接着根据过滤好的网址来下载年报PDF文件。
1.结果一:下载的网址文件。
2.结果一(以688566为例):结果一具体截图以股票688566来展示(由于公司上市时间比较晚,故数据量少)。
3.结果二(以688566为例):过滤后的网址文件
4.结果三:下载好的年报PDF文件
##4.解析年报
from parse import key,math1,math2,get_subtxt,get_account_data,cov
################4.1提取关键指标
for code in codes1:
math1(code)
###### 只有部分成功——是年份问题
for code in codes2:
math2(code)
#########对其中格式不统一的文件进行处理
#由于 '688799' #特殊
#######2022
filename='C:/Users/lenovo/Desktop/688799_2022.PDF'
doc=fitz.Document(filename)
txt = get_subtxt(doc)
revenue=get_account_data('营业收入', txt) #txt在后面
profit_shlder=get_account_data('\n*'.join('归属于上市公司股东的净利润'), txt)
revenue=cov(revenue)
profit_shlder=cov(profit_shlder)
dic={'2022': [revenue,profit_shlder]} #列表
sta1=pd.DataFrame(dic,index=['营业收入','归属于上市公司股东的净利润'])
#######2021
filename='C:/Users/lenovo/Desktop/688799_2021.PDF'
doc=fitz.Document(filename)
txt = get_subtxt(doc)
revenue=get_account_data('营业收入', txt) #txt在后面
profit_shlder=get_account_data('\n*'.join('归属于上市公司股东的净'), txt)
revenue=cov(revenue)
profit_shlder=cov(profit_shlder)
dic={'2021': [revenue,profit_shlder]} #列表
sta2=pd.DataFrame(dic,index=['营业收入','归属于上市公司股东的净利润'])
f688799=pd.concat([sta1,sta2],axis=1)
filename=f'C:/Users/lenovo/Desktop/688799_数据.csv'
f688799.to_csv(filename)
################4.2提取关键信息
#########对其中格式不统一的文件进行处理
##对688606
filename='C:/Users/lenovo/Desktop/688606_2022.PDF'
doc=fitz.Document(filename)
txtkey1 = get_subtxt(doc,bounds=('公司基本情况','联系人和联系方式'))
subtext=txtkey1
s1= subtext.find('公司办公地址')
s2= subtext.find('公司办公地址的邮政编码')
s3= subtext.find('公司网址')
s4= subtext.find('电子信箱')
s5= subtext.find('二、')
s6= subtext.find('\n董事会秘书')
s7= subtext.find('姓名')
s8= subtext.find('联系地址')
s9= subtext.find('电子信箱')
s10= subtext.find('三、信息披露及备置地点')
L1=subtext[s1:s5]
d1=L1.split()
L2=subtext[s6:s10] ##字符串
L2=cov(L2)
d2=L2.split() ##列表
c={'公司代码': '688799'}
i = 0
address1=['公司办公地址', '公司网址', '电子信箱']
for index1 in address1:
i=i+1
address_index = d1.index(index1) # 找到对应的索引
next_row = d1[address_index + 1] # 提取对应索引的下一行内容
if i == 1:
c1={'公司办公地址': next_row}
elif i == 2:
c2={'公司网址': next_row}
else:
c3={'公司电子信箱': next_row}
address2=['姓名', '电话', '电子信箱']
j=0
for index2 in address2:
j=j+1
address_index = d2.index(index2) # 找到对应的索引
next_row = d2[address_index + 1] # 提取对应索引的下一行内容
if j == 1:
g1={'董秘姓名': next_row}
elif j == 2:
g2={'董秘电话': next_row}
else:
g3={'董秘电子信箱': next_row}
c.update(c1)
c.update(c2)
c.update(c3)
g1.update(g2)
g1.update(g3)
c.update(g1)
need1=c #字典
##对688767
filename='C:/Users/lenovo/Desktop/688767_2022.PDF'
doc=fitz.Document(filename)
subtext = get_subtxt(doc,bounds=('公司基本情况','联系人和联系方式'))
s1= subtext.find('公司办公地址')
s2= subtext.find('公司办公地址的邮政编码')
s3= subtext.find('公司网址')
s4= subtext.find('电子信箱')
s5= subtext.find('三、')
s6= subtext.find('\n董事会秘书')
s7= subtext.find('姓名')
s8= subtext.find('联系地址')
s9= subtext.find('电话')
s10= subtext.find('电子信箱')
s11= subtext.find('四')
L1=subtext[s1:s5]
d1=L1.split()
L2=subtext[s6:s11] ##字符串
L2=L2.replace("义\n路", "义路")
d2=L2.split() ##列表
c={'公司代码': '688767'}
i = 0
address1=['公司办公地址', '公司网址', '电子信箱']
for index1 in address1:
i=i+1
address_index = d1.index(index1) # 找到对应的索引
next_row = d1[address_index + 1] # 提取对应索引的下一行内容
if i == 1:
c1={'公司办公地址': next_row}
elif i == 2:
c2={'公司网址': next_row}
else:
c3={'公司电子信箱': next_row}
address2=['姓名', '电话', '电子信箱']
j=0
for index2 in address2:
j=j+1
address_index = d2.index(index2) # 找到对应的索引
next_row = d2[address_index + 1] # 提取对应索引的下一行内容
if j == 1:
g1={'董秘姓名': next_row}
elif j == 2:
g2={'董秘电话': next_row}
else:
g3={'董秘电子信箱': next_row}
c.update(c1)
c.update(c2)
c.update(c3)
g1.update(g2)
g1.update(g3)
c.update(g1)
need2=c #字典
#####合并并保存数据
df = pd.DataFrame()
for code in codes3:
df = df.append(key(code),ignore_index=True)
df = df.append(need1,ignore_index=True)
df = df.append(need2,ignore_index=True)
print(df)
df.to_csv('C:/Users/lenovo/Desktop/10家公司的信息.csv')
1.结果四:利用定义的函数对年报数据进行解析,从中提取关键指标:营业收入和归属于上市公司股东的净利润,并对其中格式特殊的,进行单独处理。
2.结果四(以股票688566为例):结果具体截图以股票688566来展示(由于公司上市时间比较晚,故数据量少)。
3.结果五:利用定义的函数对年报数据进行解析,从中提取关键信息:公司网址、办公地址、电子信箱、董秘的姓名以及董秘的电话号码和董秘的电子信箱信息。
##5.画图
from draw import con
con(codes1)
#导入数据
df=pd.read_csv('C:/Users/lenovo/Desktop/十支股票的营业收入(改数据类型).csv',header=0)
df=df.fillna(0)
df.rename(columns={'Unnamed: 0': '年份'}, inplace=True)
df=df.set_index('年份')
#数据可视化——时间序列图
df.plot(figsize=(20,10))
plt.xlabel(u'日期',fontsize=18)
plt.ylabel(u'营业收入(元)',fontsize=18)
plt.xticks(fontsize=18)
plt.yticks(fontsize=18)
plt.title(u'十支股票营业收入的时间序列图',fontsize=18)
plt.grid()
plt.legend(loc=1,fontsize=10)
plt.show()
### 选688799画营业收入和归属于上市公司股东的净利润
file=pd.read_csv('C:/Users/lenovo/Desktop/688799_数据.csv')
t1=file.iloc[0,1:].rename('营业收入', inplace = True)
t2=file.iloc[1,1:].rename('归属于上市公司股东的净利润', inplace = True)
t=pd.concat([t1,t2],axis=1).reset_index()
t.rename(columns={'index': '年份'}, inplace=True)
t=t.set_index('年份')
t=t.reindex(['2021','2022'])
#数据可视化——时间序列图
t=t.astype('float64')
t.plot(kind='line',subplots=True,sharey=False,figsize=(16,10),title=u'688799营业收入和归属于上市公司股东的净利润的时间序列图',grid=True,fontsize=13)
1.结果六:将10家公司的营业收入十年的数据进行展示(由于公司上市时间比较晚,故数据量少)。
2.结果七:选一家公司(这里用的是688799)将其营业收入、归属于上市公司股东的净利润的十年时间序列数据(由于公司上市时间比较晚,故只有两年数据)用折线图展示。
##################################################1.获取网页代码
# 从上海证券提取网页
def get_table_see(code):
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
import time
browser = webdriver.Chrome()
browser.get("http://www.sse.com.cn/disclosure/listedinfo/regular/") #从上海证券交易所获取文件
browser.set_window_size(1550, 830)
browser.find_element(By.ID, "inputCode").click()
browser.find_element(By.ID, "inputCode").send_keys(code) #可改
time.sleep(5)
browser.find_element(By.CSS_SELECTOR, ".sse_outerItem:nth-child(4) .filter-option-inner-inner").click()
browser.find_element(By.LINK_TEXT, "年报").click()
time.sleep(5)
css_selector = "body > div.container.sse_content > div > div.col-lg-9.col-xxl-10 > div > div.sse_colContent.js_regular > div.table-responsive > table"
element = browser.find_element(By.CSS_SELECTOR, css_selector)
table_html = element.get_attribute('innerHTML')
f = open('C:/Users/lenovo/Desktop/table.html','w',encoding='utf-8') #改名称
f.write(table_html)
f.close()
###
import re
import pandas as pd
def get_data(tr):
p_td = re.compile('(.*?)', re.DOTALL)
tds = p_td.findall(tr)
#
s = tds[0].find('>') + 1
e = tds[0].rfind('<')
code = tds[0][s:e]
#
s = tds[1].find('>') + 1
e = tds[1].rfind('<')
name = tds[1][s:e]
#
s = tds[2].find('href="') + 6
e = tds[2].find('.pdf"') + 4
href = 'http://www.sse.com.cn' + tds[2][s:e]
s = tds[2].find('$(this))">') + 10
e = tds[2].find('')
title = tds[2][s:e]
#
date = tds[3].strip()
data = [code,name,href,title,date]
return(data)
# data = get_data(trs_new[1])
def parse_table(table_html):
p = re.compile('(.+?)', re.DOTALL)
trs = p.findall(table_html)
#
trs_new = []
for tr in trs:
if tr.strip() != '':
trs_new.append(tr)
#
data_all = [get_data(tr) for tr in trs_new[1:]]
df = pd.DataFrame({
'code': [d[0] for d in data_all],
'name': [d[1] for d in data_all],
'href': [d[2] for d in data_all],
'title': [d[3] for d in data_all],
'date': [d[4] for d in data_all]
})
return(df)
# f = open('table.html', encoding='utf-8')
f = open('C:/Users/lenovo/Desktop/table.html', encoding='utf-8') #该名称
html = f.read()
f.close()
# fname = f'{code}.html'
fname = f'C:/Users/lenovo/Desktop/{code}.csv'
df = parse_table(html)
df.to_csv(fname) #改名称
# df.to_csv('C:/Users/lenovo/Desktop/00000.csv') #改名称
####
import os
if os.path.exists("C:/Users/lenovo/Desktop/table.html"):
os.remove("C:/Users/lenovo/Desktop/table.html")
else:
print("The file does not exist")
###批量下载PDF网站
def pl_get_table_see(codes):
for code in codes:
get_table_see(code)
#################################################2.过滤删除无关的网站
import re
import pandas as pd
def filter_links(words,df,include=True):
ls=[]
for word in words:
if include:
#ls.append([word in f for f in df.f_name])
ls.append([word in f for f in df['title']])
else:
#ls.append([word not in f for f in df.f_name])
ls.append([word not in f for f in df['title']])
index=[]
for r in range(len(df)):
flag = not include
for c in range(len(words)):
if include:
flag = flag or ls[c][r]
else:
flag = flag and ls[c][r]
index.append(flag)
df2=df[index]
return(df2)
def shanchu(df):
df_all1 = filter_links(['年年度报告'], df,include=True) #保留title列中,包含“年年度报告”的行
df_need = filter_links(['摘要'], df_all1,include=False)#删去title列中,包含“摘要”的行
df = filter_links(['修订'], df_need,include=False)
return df
###定义批量删除无关网站的函数
def pl_shanchu(codes):
for code in codes:
fname = f'C:/Users/lenovo/Desktop/{code}.csv'
df =pd.read_csv(fname)
df_need=shanchu(df)
df_need.to_csv(fname) #改名称
###########筛选时间
def filter_date(start,end,df):
date = df['date']
v=[d>=start and d <= end for d in date]
df_new=df[v]
return(df_new)
import datetime
def start_end_10y():
dt_now = datetime.datetime.now()
current_year = dt_now.year
start = f'{-9}-01-01'
end = f'{current_year}-12-31'
return((start,end))
def filter_nb_10y(df,
keep_words=['年报','年度报告'],
exclude_words=['摘要'],
start=''):
if start =='':
start,end = start_end_10y()
else:
start_y = int(start[0:4])
end = f'{start_y + 9}-12-31'
#
df= filter_links(keep_words, df,include=True)
df= filter_links(exclude_words, df,include=False)
df= filter_date(start, end, df)
return(df)
#提取出链接、年份
def prepare_hrefs_years(df):
hrefs = df['href'].to_list()
years = [int(d[0:4])-1 for d in df['date']]
return ((hrefs,years))
#############
###批量处理年份
def pl_filter_nb_10y(codes):
for code in codes:
fname = f'C:/Users/lenovo/Desktop/{code}.csv'
df =pd.read_csv(fname)
df_fixd=filter_nb_10y(df)
df_fixd.to_csv(fname)
#################################################3.下载年报
##下载不同年份的年报
###################
import requests
def download_pdf(href,code,year):
'''
下载单份年报,自动命名保持
:param href:download link address
:type string:str
:param code:证券代码
:type string:str
:param year:年报年份
:type string:str
:return: None
:rtype: None
'''
r=requests.get(href, allow_redirects=True)
fname = f'C:/Users/lenovo/Desktop/{code}_{year}.pdf' ###指定文件名和路径
f = open(fname,'wb')
f.write(r.content)
f.close()
#
r.close()
import time
def download_pdfs(hrefs,code,years):
for i in range(len(hrefs)):
href = hrefs[i]
year = years[i]
download_pdf(href, code, year)
time.sleep(30)
return()
def download_pdfs_codes(list_hrefs,codes,list_years):
for i in range(len(list_hrefs)):
hrefs = list_hrefs[i]
years = list_years[i]
code = codes[i]
download_pdfs(hrefs, codes, years)
time.sleep(30)
return()
####
import pandas as pd
def pl_download_pdfs_codes(codes):
for code in codes:
fname = f'C:/Users/lenovo/Desktop/{code}.csv'
df =pd.read_csv(fname)
list_hrefs=df['href']
list_years=df['year']
for i in range(len(list_hrefs)):
hrefs = list_hrefs[i]
years = list_years[i]
# code = codes[i]
download_pdfs(hrefs, code, years)
time.sleep(30)
return()
def prepare_hrefs_years(df):
hrefs = df['href'].to_list()
years = [int(d[0:4])-1 for d in df['date']]
return ((hrefs,years))
#################################################4.解析年报
import fitz
import re
import pandas as pd
from pprint import pprint
import os
###############################4.1提取关键指标
#找到'主要会计数据和财务指标'所在的页码(该条注释要改)
def get_subtxt(doc,bounds=('主要会计数据和财务指标','总资产')):
#默认设置为首尾页码
start_pageno=0
end_pageno= len(doc) - 1
#
lb,ub = bounds #lb:lower bound (下界)
#获取左界页码
for n in range(len(doc)):
page = doc[n]
txt = page.get_text()
if lb in txt:
start_pageno = n
break
#获取右界页码
for n in range(start_pageno,len(doc)):
if ub in doc[n].get_text():
end_pageno = n
break
#获取小范围内字符串
txt=''
for n in range(start_pageno,end_pageno+1):
page = doc[n]
txt += page.get_text()
return(txt)
#获取‘营业收入’和‘归属于上市公司股\n东的净利润’
def get_account_data(account,txt):
p_txt='%s\D*?(\d{1,3}(?:,\d{3})*(?:\.\d+)?)' % account
#%s是占位符,用‘account’替换,\D是非数字,\d{1,3}是数字1或2或3个,*可重复,?非贪婪,()内是所要的数字,小数点后\d+表示小数点后至少一位数字
p=re.compile(p_txt)
matchobj=p.search(txt)
amt=matchobj.group(1)
return(amt)
#将获取的数据转换成浮点数
def cov(f):
f=f.replace(",", "")
f=float(f)
return f
def math1(code):
stata=pd.DataFrame()
for i in range(2020,2023): ##可根据已有年报的年份调整
fname = f'C:/Users/lenovo/Desktop/{code}_{i}.PDF' #?? i
import os
if os.path.exists(fname):
doc=fitz.Document(fname)
txt = get_subtxt(doc)
#
revenue=get_account_data('营业收入', txt) #txt在后面
profit_shlder=get_account_data('\n*'.join('归属于上市公司股东的净利润'), txt)
#
dic={i: [revenue,profit_shlder]} #列表
sta=pd.DataFrame(dic,index=['营业收入','归属于上市公司股东的净利润']) #字典转列表
stata=pd.concat([stata,sta],axis=1)
# df.to_csv('C:/Users/lenovo/Desktop/00000.csv') #改名称
else:
break
filename=f'C:/Users/lenovo/Desktop/{code}_数据.csv'
stata.to_csv(filename) #改名称
return stata
###### 只有部分成功——可能是年份问题
def math2(code):
stata=pd.DataFrame()
for i in range(2021,2023): ##可根据已有年报的年份调整
fname = f'C:/Users/lenovo/Desktop/{code}_{i}.PDF' #?? i
import os
if os.path.exists(fname):
doc=fitz.Document(fname)
txt = get_subtxt(doc)
#
revenue=get_account_data('营业收入', txt) #txt在后面
profit_shlder=get_account_data('\n*'.join('归属于上市公司股东的净利润'), txt)
#
dic={i: [revenue,profit_shlder]} #列表
sta=pd.DataFrame(dic,index=['营业收入','归属于上市公司股东的净利润'])
stata=pd.concat([stata,sta],axis=1)
# df.to_csv('C:/Users/lenovo/Desktop/00000.csv') #改名称
else:
break
filename=f'C:/Users/lenovo/Desktop/{code}_数据.csv'
stata.to_csv(filename) #改名称
return stata
#将获取的会计指标的代码封装成函数
def parse_key_fin_data(subtext,keywords):
ss=[]
s = 0
for kw in keywords:
n = subtext.find(kw,s)
ss.append(n)
s = n+len(kw)
ss.append(len(subtext))
data =[]
#
p = re.compile('\D+\s+\D*')
p2 = re.compile('\s')
for n in range(len(ss)-1):
s=ss[n]
e=ss[n+1]
line = subtext[s:e]
#获取可能换行的账户名称
matchobj = p.search(line)
account_name = p2.sub('',matchobj.group())
#获取三年数据
amnts = line[matchobj.end():].split()
#加上账户名称
amnts.insert(0, account_name)
# 追加到总数据
data.append(amnts)
return(data)
###################
#由于 '688799' #特殊
#######2022
filename='C:/Users/lenovo/Desktop/688799_2022.PDF'
doc=fitz.Document(filename)
txt = get_subtxt(doc)
revenue=get_account_data('营业收入', txt) #txt在后面
profit_shlder=get_account_data('\n*'.join('归属于上市公司股东的净利润'), txt)
revenue=cov(revenue)
profit_shlder=cov(profit_shlder)
dic={'2022': [revenue,profit_shlder]} #列表
sta1=pd.DataFrame(dic,index=['营业收入','归属于上市公司股东的净利润'])
#######2021
filename='C:/Users/lenovo/Desktop/688799_2021.PDF'
doc=fitz.Document(filename)
txt = get_subtxt(doc)
revenue=get_account_data('营业收入', txt) #txt在后面
profit_shlder=get_account_data('\n*'.join('归属于上市公司股东的净'), txt)
revenue=cov(revenue)
profit_shlder=cov(profit_shlder)
dic={'2021': [revenue,profit_shlder]} #列表
sta2=pd.DataFrame(dic,index=['营业收入','归属于上市公司股东的净利润'])
f688799=pd.concat([sta1,sta2],axis=1)
filename=f'C:/Users/lenovo/Desktop/688799_数据.csv'
f688799.to_csv(filename)
###############################4.2提取关键信息
##提取关键字
import fitz
import re
import pandas as pd
from pprint import pprint
import os
#找到'主要会计数据和财务指标'所在的页码(该条注释要改)
def get_subtxt(doc,bounds=('主要会计数据和财务指标','总资产')):
#默认设置为首尾页码
start_pageno=0
end_pageno= len(doc) - 1
#
lb,ub = bounds #lb:lower bound (下界)
#获取左界页码
for n in range(len(doc)):
page = doc[n]
txt = page.get_text()
if lb in txt:
start_pageno = n
break
#获取右界页码
for n in range(start_pageno,len(doc)):
if ub in doc[n].get_text():
end_pageno = n
break
#获取小范围内字符串
txt=''
for n in range(start_pageno,end_pageno+1):
page = doc[n]
txt += page.get_text()
return(txt)
def key(code):
filename=f'C:/Users/lenovo/Desktop/{code}_2022.PDF'
doc=fitz.Document(filename)
txtkey = get_subtxt(doc,bounds=('公司基本情况','联系人和联系方式'))
##切分所需内容
subtext=txtkey
s1= subtext.find('公司办公地址')
s2= subtext.find('公司办公地址的邮政编码')
s3= subtext.find('公司网址')
s4= subtext.find('电子信箱')
s5= subtext.find('二、')
L1=subtext[s1:s5]
d1=L1.split()
s6= subtext.find('董事会秘书')
s7= subtext.find('姓名')
s8= subtext.find('联系')
s9= subtext.find('电话')
s10= subtext.find('电子信箱')
s11= subtext.find('三')
L2=subtext[s6:s11] ##字符串
d2=L2.split() ##列表
c={'公司代码': code}
i = 0
address1=['公司办公地址', '公司网址', '电子信箱']
for index1 in address1:
i=i+1
address_index = d1.index(index1) # 找到对应的索引
next_row = d1[address_index + 1] # 提取对应索引的下一行内容
if i == 1:
c1={'公司办公地址': next_row}
elif i == 2:
c2={'公司网址': next_row}
else:
c3={'公司电子信箱': next_row}
address2=['姓名', '电话', '电子信箱']
j=0
for index2 in address2:
j=j+1
address_index = d2.index(index2) # 找到对应的索引
next_row = d2[address_index + 1] # 提取对应索引的下一行内容
if j == 1:
g1={'董秘姓名': next_row}
elif j == 2:
g2={'董秘电话': next_row}
else:
g3={'董秘电子信箱': next_row}
c.update(c1)
c.update(c2)
c.update(c3)
g1.update(g2)
g1.update(g3)
c.update(g1)
need=c #字典
return (c)
#########对其中格式不统一的文件进行处理
codes=['688606',
'688767'] ##格式不一样的文件
#将获取的数据中不必要的空格去了
def cov(f):
f=f.replace(" ", "")
return f
##对688606
filename='C:/Users/lenovo/Desktop/688606_2022.PDF'
doc=fitz.Document(filename)
txtkey1 = get_subtxt(doc,bounds=('公司基本情况','联系人和联系方式'))
subtext=txtkey1
s1= subtext.find('公司办公地址')
s2= subtext.find('公司办公地址的邮政编码')
s3= subtext.find('公司网址')
s4= subtext.find('电子信箱')
s5= subtext.find('二、')
s6= subtext.find('\n董事会秘书')
s7= subtext.find('姓名')
s8= subtext.find('联系地址')
s9= subtext.find('电子信箱')
s10= subtext.find('三、信息披露及备置地点')
L1=subtext[s1:s5]
d1=L1.split()
L2=subtext[s6:s10] ##字符串
L2=cov(L2)
d2=L2.split() ##列表
c={'公司代码': '688799'}
i = 0
address1=['公司办公地址', '公司网址', '电子信箱']
for index1 in address1:
i=i+1
address_index = d1.index(index1) # 找到对应的索引
next_row = d1[address_index + 1] # 提取对应索引的下一行内容
if i == 1:
c1={'公司办公地址': next_row}
elif i == 2:
c2={'公司网址': next_row}
else:
c3={'公司电子信箱': next_row}
address2=['姓名', '电话', '电子信箱']
j=0
for index2 in address2:
j=j+1
address_index = d2.index(index2) # 找到对应的索引
next_row = d2[address_index + 1] # 提取对应索引的下一行内容
if j == 1:
g1={'董秘姓名': next_row}
elif j == 2:
g2={'董秘电话': next_row}
else:
g3={'董秘电子信箱': next_row}
c.update(c1)
c.update(c2)
c.update(c3)
g1.update(g2)
g1.update(g3)
c.update(g1)
need1=c #字典
##对688767
filename='C:/Users/lenovo/Desktop/688767_2022.PDF'
doc=fitz.Document(filename)
subtext = get_subtxt(doc,bounds=('公司基本情况','联系人和联系方式'))
s1= subtext.find('公司办公地址')
s2= subtext.find('公司办公地址的邮政编码')
s3= subtext.find('公司网址')
s4= subtext.find('电子信箱')
s5= subtext.find('三、')
s6= subtext.find('\n董事会秘书')
s7= subtext.find('姓名')
s8= subtext.find('联系地址')
s9= subtext.find('电话')
s10= subtext.find('电子信箱')
s11= subtext.find('四')
L1=subtext[s1:s5]
d1=L1.split()
L2=subtext[s6:s11] ##字符串
L2=L2.replace("义\n路", "义路")
d2=L2.split() ##列表
c={'公司代码': '688767'}
i = 0
address1=['公司办公地址', '公司网址', '电子信箱']
for index1 in address1:
i=i+1
address_index = d1.index(index1) # 找到对应的索引
next_row = d1[address_index + 1] # 提取对应索引的下一行内容
if i == 1:
c1={'公司办公地址': next_row}
elif i == 2:
c2={'公司网址': next_row}
else:
c3={'公司电子信箱': next_row}
address2=['姓名', '电话', '电子信箱']
j=0
for index2 in address2:
j=j+1
address_index = d2.index(index2) # 找到对应的索引
next_row = d2[address_index + 1] # 提取对应索引的下一行内容
if j == 1:
g1={'董秘姓名': next_row}
elif j == 2:
g2={'董秘电话': next_row}
else:
g3={'董秘电子信箱': next_row}
c.update(c1)
c.update(c2)
c.update(c3)
g1.update(g2)
g1.update(g3)
c.update(g1)
need2=c #字典
#################################################5.画图
mport pandas as pd
import numpy as np
#import seaborn as sns
import matplotlib.pyplot as plt
from pylab import mpl
import datetime
#from pylab import plt, mpl
#plt.style.use('seaborn')###设置画图风格
mpl.rcParams['font.sans-serif']=['FangSong']
mpl.rcParams['axes.unicode_minus']=False
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
##提取营业收入,并合并合并十支股票的营业收入
def con(codes):
stata=pd.DataFrame()
for code in codes:
fname=f'C:/Users/lenovo/Desktop/{code}_数据.csv' #导入数据
df=pd.read_csv(fname,header=0)
m=df.iloc[0,1:].rename(code, inplace = True)
stata=pd.concat([stata,m],axis=1)
filename=f'C:/Users/lenovo/Desktop/十支股票的营业收入.csv'
stata.to_csv(filename)
#导入数据
df=pd.read_csv('C:/Users/lenovo/Desktop/十支股票的营业收入(改数据类型).csv',header=0)
df=df.fillna(0)
df.rename(columns={'Unnamed: 0': '年份'}, inplace=True)
df=df.set_index('年份')
#数据可视化——时间序列图
df.plot(figsize=(20,10))
plt.xlabel(u'日期',fontsize=18)
plt.ylabel(u'营业收入(元)',fontsize=18)
plt.xticks(fontsize=18)
plt.yticks(fontsize=18)
plt.title(u'十支股票营业收入的时间序列图',fontsize=18)
plt.grid()
plt.legend(loc=1,fontsize=10)
plt.show()
### 选688799画营业收入和归属于上市公司股东的净利润
file=pd.read_csv('C:/Users/lenovo/Desktop/688799_数据.csv')
t1=file.iloc[0,1:].rename('营业收入', inplace = True)
t2=file.iloc[1,1:].rename('归属于上市公司股东的净利润', inplace = True)
t=pd.concat([t1,t2],axis=1).reset_index()
t.rename(columns={'index': '年份'}, inplace=True)
t=t.set_index('年份')
t=t.reindex(['2021','2022'])
#数据可视化——时间序列图
t=t.astype('float64')
t.plot(kind='line',subplots=True,sharey=False,figsize=(16,10),title=u'688799营业收入和归属于上市公司股东的净利润的时间序列图',grid=True,fontsize=13)