上市公司代码 | 上市公司简称 |
---|---|
000002 | 万科A |
000006 | 深振业 |
000007 | ST全新 |
000014 | 沙河股份 |
000029 | 深深房A |
000036 | 华联控股 |
000042 | 中洲控股 |
000402 | 金融街 |
000517 | 荣安地产 |
000537 | 广宇发展 |
公司的营业收入代表了其在一定期间内从销售产品或提供服务中获得的总收入额。它是公司经营活动的主要来源之一,反映了公司销售能力和市场表现的重要指标。
根据图1-1可以分析得:万科A的整体营业收入在十年间得到了飞速提升,发展迅速且稳健。整体折线图呈现出飞速上升的趋势。
作为房地产企业中处于领先地位的万科,在十年的发展中逐渐扩大了在市场中的份额,市场竞争力以及市场渗透度很高。该情况可能得益于万科积极拓展市场推出多个房地产项目,并同时收益于近十年来中国房地产市场增长,中国国民痴迷于购置房地产资产的状况。
聚焦图像中2020年到2022年的折线图走势可以发现趋势放缓,可能与当时中国受疫情影响经济发展放缓以及国民购置房地产资产热情降低有关。这个情况在图1-2中能得到更清晰地表现。
归属于股东净利润数据折线图在2020年出现了明显的转折,2020年前归属于股东净利润数额都有稳步提升,但2020年达到了峰值后急转直下,仅仅一年就下降了近70%。
分析原因:
i.疫情影响导致购房热情下降使销售额下降。
ii.经济环境低迷。
总结房地产市场现状:2016年至2021年间,监管部门持续颁布房地产行业紧缩政策,房地产企业经历了强监管时代。房企融资渠道、销售回款以及盈利空间等方面均受到不同程度的负面影响,再叠加全球疫情以及宏观经济下行的因素,中国房地产企业面临着重大挑战。
首先观察图2-1和图2-2,可以发现房地产企业近十年的营业情况存在较大的波动,情况不一。
继续分析图2-3、图2-5可以发现万科企业作为中国最大的房地产开发企业之一,营业收入始终保持一骑绝尘的态势,无论是营业收入还是归属于上市公司股东净利润相较于其他房地产企业都有很大的优势。那我们剔除实力卓越的万科,来聚焦一下房地产市场中其余的企业。根据图2-4和图2-5我们可以发现这些企业的营业收入情况整体处于同一水平,但也有分别,比如000402金融街在这九家企业中属于领先水平。
【疫情影响分析】
分析图2-4和图2-6,其实我们可以看到2020年以后十家企业的业绩走势都是向下的,说明疫情对于房地产市场的冲击是比较大的。具体分析原因如下:
1. 建筑停工和项目延迟:由于疫情限制和防控措施,许多建筑工地曾经停工或项目进展受到延迟。这可能导致项目交付时间延迟,对企业的现金流和盈利能力产生影响。
2. 销售活动下降:疫情期间,购房者对房地产市场的信心可能下降,购买决策被推迟。购房活动的减少可能导致销售额下降,特别是在封锁期间和市场不确定性较高的时期。
3. 租赁市场受冲击:疫情对商业租赁市场和住宅租赁市场都产生了影响。商业租户可能面临业务萎缩或关闭,导致商业租赁需求下降。同时,部分住宅租户可能面临收入不稳定,导致租金支付能力下降。
4. 投资信心下降:疫情带来的不确定性和经济衰退的担忧可能导致房地产投资者的信心下降。投资者可能对市场风险持谨慎态度,推迟或取消房地产投资计划。
5. 数字化转型加速:疫情推动了房地产行业的数字化转型。虚拟房产展示、在线销售和远程办公等趋势加速发展,以适应疫情期间的限制和改变的消费行为。
【国家政策分析】
另外,我们也可以看到折线图中的走势有逐年放缓的趋势,这可能也与中国的针对房地产发展的相关政策有关。为了抑制房地产市场投资过热、稳定房价,调整住房供给结构,中央政府先后出台了“国八条”、“新国八条”、“国六条”以及九部委“十五条”。如下图所示。政府政策通过多种紧缩政策制约房地产市场泡沫。
1. 房地产市场调控政策:中国政府采取了一系列调控措施来稳定房地产市场,以防止过度波动和房价过快上涨。这些措施包括限购、限贷、限售、限价、差别化住房信贷政策等。例如,限购政策限制了购房者的购房数量和条件,限贷政策则限制了购房者的贷款额度和利率。
2. 土地供应政策:中国政府通过控制土地供应来影响房地产市场。土地供应政策包括限制土地使用、减少土地拍卖或供应量、提高土地出让价格等。政府通过土地供应政策来控制开发商的土地成本和开发规模,从而对房地产市场施加影响。
3. 融资政策:中国政府对房地产开发商的融资活动实施监管,以控制过度负债和金融风险。融资政策包括对开发商的贷款额度、利率、贷款条件和审批程序等方面的限制。政府通过限制融资渠道和加强金融监管,调控房地产市场。
4. 税收政策:中国政府通过调整房地产相关税收政策来影响市场行为。这可能包括增值税、契税、房产税等税率和税收优惠政策的调整。税收政策的调整旨在平衡市场供需,控制投机性购房行为,并鼓励合理的房地产投资。
5. 城市规划政策:中国政府根据城市发展规划,对土地使用、建筑高度、用途等方面进行规划和限制,以确保城市的可持续发展和良好的居住环境。城市规划政策包括土地用途规划、建筑规范、居住区划等,以引导和控制房地产市场的发展。
在这次金融数据获取与处理实验中,我有机会应用所学的编程知识来解决问题和实现功能。一步步跟着老师从爬取数据开始,解析年报,制作图表到最终完成实验,我认为受益良多。
通过这次实验,我对Python的应用有了更深入的了解,并学会了一些新的编程技巧。
首先,我注意到在编写代码时,良好的代码结构和注释是非常重要的。在实验中,我尽量遵循Python的最佳实践,编写易于阅读和理解的代码。我努力命名变量和函数,以便在后续的开发和维护过程中能够轻松理解和修改代码。
其次,我学会了如何利用Python的库和模块来加快开发速度。在实验中,我使用了一些常用的Python库,如NumPy和Pandas,它们为我提供了处理数据和进行数学计算的强大工具。这让我能够更高效地完成实验任务,并且代码更具可重用性。
在实验过程中,我也遇到了一些挑战。有时候,我会遇到一些错误或异常,需要花费一些时间来调试和修复代码。然而,这些挑战也使我学会了如何通过调试技巧和查找文档来解决问题。我学会了如何利用错误信息和日志来追踪问题,并逐步修复代码。
除此之外,我还发现了一些改进的空间。首先,我意识到在编写代码之前,更好地规划和设计程序的结构是很重要的。这样可以避免后期代码混乱和不易维护的问题。其次,我希望能够进一步扩展我的Python知识,学习更多高级技巧和库,以便在未来的项目中能够应对更复杂的需求。
总的来说,这次Python实验对我的编程能力和知识应用提供了很好的锻炼。我通过实践掌握了Python编程的基础知识和技巧,并且意识到了自己在编程中的优势和不足之处。我期待着在未来的学习和实践中不断提升自己的编程能力。
#################深交所网页数据爬取函数####################
def get_table_szse(code):
browser = webdriver.Edge()
browser.get("http://www.szse.cn/disclosure/listed/fixed/index.html")
time.sleep(1)
browser.set_window_size(1296, 705)
browser.find_element(By.ID, "input_code").click()
browser.find_element(By.ID, "input_code").send_keys(code)
time.sleep(1)
browser.find_element(By.CSS_SELECTOR, ".active:nth-child(1) > a").click()
time.sleep(1)
browser.find_element(By.CSS_SELECTOR, "#select_gonggao .glyphicon").click()
browser.find_element(By.LINK_TEXT, "年度报告").click()
time.sleep(1)
browser.find_element(By.ID, "query-btn").click()
time.sleep(1)
css_selector = "#disclosure-table > div > div.table-con-outer > div > table"
element = browser.find_element(By.CSS_SELECTOR,css_selector)
table_html = element.get_attribute('innerHTML')
fname=f'{code}.html'
f = open(fname,'w',encoding='utf-8')
f.write(table_html)
f.close()
browser.quit()
#################深交所网页数据筛选股票代码、股票简称、下载网址、时间函数####################
def get_data(tr):
p_td = re.compile('(.*?)',re.DOTALL) #(.*?)仅捕获括号内部的
tds = p_td.findall(tr)
#
s = tds[0].find('">') + 2 #起始索引,
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('attachpath="') + 12
#由于深交所网页PDF文件下载的特殊性,读取的部分为attachpath="以后的部分
e = tds[2].find('" target="')
href = 'https://disc.szse.cn/download' + tds[2][s:e]
#加上关于深交所的域名
s = tds[2].find('ellipsis" title="') + 17 #
e = tds[2].find('')
title = tds[2][s:e] #取出title
#
s = tds[3].find('') + 24
e = tds[3].find('')
date = tds[3][s:e]
data = [code,name,href,title,date]
return(data)
def parse_table(html):
p = re.compile('(.+?) ',re.DOTALL)
trs = p.findall(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)
def filter_words(words,df,include=True):
'''
筛选保留年报链接
'''
ls=[]
for word in words:
if include:
ls.append([word in f for f in df['title']])
else:
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 filter_date(start,end,df):#筛选日期,设置start和end日期,只取出其中有的部分
date = df['date']
v= [d >= start and d <= end for d in date]
df_new= df[v]
return(df_new)
def start_end_10y():
dt_now=datetime.datetime.now() #取出现在的日期,
current_year= dt_now.year #
start=f'{current_year-9}-01-01'
end=f'{current_year}-12-31'
return((start,end))
#返回值为所需要的开始和结束的日期
#######主要使用函数
def filter_nb_10y(df,keepword=['年报','年度报告'],exclude_word=['摘要'],end=''):
if end=='':
start,end=start_end_10y()
else:
end_y=int(end[0:4])
start_y= f'{end_y - 9}-01-01'
df=filter_words(keepword,df,include=True)
df= filter_words(exclude_word,df,include=False)
df = filter_date(start,end,df)
return(df)
#输入的df指的是CSV文件
#用于筛选下载年报中有用的数据,即筛选出保存的CSV文件中有用的符合要求的链接
#(包括年报不含摘要,以及年份数据筛选)
def prepare_hrefs_years(df):
hrefs = df['href'].to_list()
years = [int(d[:4])-1 for d in df['date']]
return((hrefs,years))
#这里输入的df指的是读取出来的CSV文件,
#取出CSV文件中href和year部分变成列表
#返回值是有用的hrefs和years的列表
########################下载PDF函数定义#######################
def prepare_hrefs_years(df):
hrefs = df['href'].to_list()
years = [int(d[:4])-1 for d in df['date']]
return((hrefs,years))
#这里输入的df指的是读取出来的CSV文件,
#取出CSV文件中href和year部分变成列表
#返回值是有用的hrefs和years的列表
def download_pdf(href,code,year):
r= requests.get(href,allow_redirects=True)
pdf_name=f'{code}_{year}.pdf'
f= open(pdf_name,'wb')
f.write(r.content)
f.close()
#
r.close()
#适用于单个年报下载,但工作量过大
def download_pdfs(hrefs,years,code):
for i in range(len(hrefs)):
href = hrefs[i]
year = years[i]
download_pdf(href,year,code)
time.sleep(30)
return()
#用于下载PDF,适用于批量操作,此代码使用版
#####以下函数可用于读取出hrefs和years的列表后批量使用,此处由于使用了循环进行并没有使用以下函数
def download_pdfs_codes(list_hrefs,list_years,codes):
for i in range(len(list_hrefs)):
hrefs = list_hrefs[i]
years = list_years[i]
download_pdfs(hrefs,years,code)
time.sleep(30)
return()
def download_pdf_1_code(df,code):
hrefs = df['href'].to_list()
years = [int(d[:4])-1 for d in df['date']]
download_pdfs(hrefs,years,code)
return()
#######################批量获取网页数据及下载年报【集合版】############
def get_table_szse_codes(codes):
i=1
for code in codes:
fname=f'{code}.html'
get_table_szse(code)#在网页中关于code的数据保存下来存在fname命名的html中
f=open(fname,encoding='utf-8')#打开fname命名的html,并读取里面的数据
html=f.read() #将读取的数据暂时存在html中
f.close
content= parse_table(html) #使用parse_table函数取出网页数据中有效的部分
get_csv(codes,content) #将有用的部分保存成CSV
print('取出网页数据成功,当前进度{}/{}'.format(i,len(codes)))
i += 1
def get_content_CSVs_pdf(codes):
i=1
for code in codes:
csv_name=f'{code}.csv'
path= r"D:\学习\文档学习\222金融数据获取与分析\数据储存\年报"
#批量表格所在文件路径
csv_data=pd.read_csv(csv_name)
csv_new = filter_nb_10y(csv_data,keepword=['年度报告','年报'],exclude_word=['摘要','年报摘要'],end='')
get_csv(code,csv_new)
#这一步将新的选择出来的部分重新存进csv_name的CSV文件中
hrefs,years=prepare_hrefs_years(csv_new)
#这一步将先取出来的有用的部分中网页和时间部分读出,
#存成列表,得到的是hrefs和years的列表
download_pdfs(hrefs,years,code)
#用函数在网络上取出对应的hrefs和years的列表的PDF,并存储
print('下载PDF文件成功,当前进度{}/{}'.format(i,len(codes)))
i += 1
########使用以上两个函数后可以一次性完成获取网页数据及下载年报操作###################
#################解析下载的年报数据函数定义####################
def get_subtxt(doc,bounds=('主要会计数据和财务指标','总资产')):
# 默认设置为首尾页码
start_pageno = 0
end_pageno = len(doc) - 1
#
lb,ub = bounds # lb:lower bound(下界); ub: upper 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 get_th_span(txt):
nianfen ='(20\d\d|199\d)\s*年末?' #|199\d
s = f'{nianfen}\s*{nianfen}.*?{nianfen}'
p = re.compile(s,re.DOTALL)
matchobj = p.search(txt)
end = matchobj.end()
year1 = matchobj.group(1)
year2 = matchobj.group(2)
year3 = matchobj.group(3)
flag = (int(year1) - int(year2) == 1) and (int(year2) - int(year3) == 1)
while(not flag):
matchobj = p.search(txt[end:])
end = matchobj.end()
year1 = matchobj.group(1)
year2 = matchobj.group(2)
year3 = matchobj.group(3)
flag = (int(year1) - int(year2) == 1)
flag = flag and (int(year2) - int(year3) == 1)
return(matchobj.span())
def get_bounds(txt):
th_span_1st = get_th_span(txt)
end = th_span_1st[1]
th_span_2nd = get_th_span(txt[end:])
th_span_2nd = (end + th_span_2nd[0],end + th_span_2nd[1])
s = th_span_1st[1]
e = th_span_2nd[0]
while (txt[e] not in '0123456789'):
e = e - 1
return(s,e)
def get_keywords(txt):
p = re.compile(r'\d+\s*?\n\s*?([\u2E80-\u9FFF]+)')
keywords = p.findall(txt)
keywords.insert(0,'营业收入')
return(keywords)
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)-1
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)
##########以下函数为上面函数的集合版,同样是为了实现批量操作##############
def get_datas(code):
for Y in years:
pdf_name=f'{Y}_{code}.pdf'
doc = fitz.open(pdf_name)
txt = get_subtxt(doc)
txt=txt.replace(' ','')
span = get_bounds(txt)
subtext = txt[span[0]:span[1]]
subtext=subtext.replace(' ','')#去除字符串头部的所有空格函数用法
keywords = get_keywords(subtext)
data = parse_key_fin_data(subtext,keywords)
all_data.append(data)
continue
def get_sep(tr):
data=[]
for i in range(len(tr)):
temp=re.search(r'\d{1,3}(,\d{3})*(\.\d+)?',tr[i]).group()
s=re.search(r'\d{1,3}(,\d{3})*(\.\d+)?',tr[i]).start()
e=re.search(r'\d{1,3}(,\d{3})*(\.\d+)?',tr[i]).end()
p=re.search(r'(\.)',tr[i]).start()
num=change_int(s,e,p,temp)
data.append(num)
return(data)
##该函数用于将字符串转成浮点数并存在列表里用于作图
def change_int(s,e,p,temp):
a=int((p-s)/4)
b=(p-s)-(a*4)
num=(int(temp[0:b]))*(10**(3*a))
for n in range(a+1):
if n == a:
if temp[b+1+(4*n):] =='':
num += 0
else:
num += (int(temp[b+1+(4*n):]))*(10**-(len(temp[b+1+(4*n):])))
else:
num += (int(temp[b+1+(4*n):b+4+(4*n)]))*(10**((2-n)*a))
return(num)
##该函数用于将字符串转成浮点数
def get_csv(code,content):
csv_name=f'{code}.csv'
content.to_csv(csv_name)
#这一步将有用的数据保存在csv_name的CSV中
def get_data_csv(code,data):
csv_name=f'{code}_data.csv'
data.to_csv(csv_name)
#这一步将有用的数据保存在csv_name的CSV中
##以上两个保存函数定义过程相同,只是用在了不同的位置
#############深交所的部分#########################
import numpy as np
import re
import pandas as pd
import matplotlib.pyplot as plt
from pylab import mpl
from datetime import datetime
import warnings
warnings.filterwarnings('ignore')
mpl.rcParams['font.sans-serif']=['FangSong']
mpl.rcParams['axes.unicode_minus']=False
from sklearn.impute import SimpleImputer
import statsmodels.api as sm
import statsmodels.formula.api as smf
import os
import pandas as pd
codes=['000002','000006','000007','000014','000029','000036','000042','000402','000517','000537']
years=['2022','2021','2020','2019','2018','2017','2016','2015','2014','2013']
get_table_szse_codes(codes)
get_content_CSVs_pdf(codes)
################指定某公司#########
all_data=[]
get_datas('000002')
get_data_csv('000002',pd.DataFrame(all_data))
###############储存财报数据########
data_000002=pd.read_csv(r'D:\学习\文档学习\222金融数据获取与分析\数据储存\年报\最后一次\000002_data.csv')
data_000002.index = years
##############处理财报数据######营业收入,营业利润
O_income=data_000002.iloc[:,1]
S_profit=data_000002.iloc[:,4]
data_profit=get_sep(S_profit)
data_income=get_sep(O_income)
x=years
y=data_income
plt.figure(figsize=(9,6),dpi=80)
plt.plot(x,y,'m*-')
for a, b in zip(x,data_income):
plt.text(a, b+3, b, ha='center', va='bottom')
plt.xlabel(u'年份',fontsize=13)#
plt.xticks(fontsize=13)
plt.ylabel(u'营业收入',fontsize=13)
plt.yticks(fontsize=13)
plt.title(u'000002万科A营业收入十年时间序列图',fontsize=13)
plt.legend(fontsize=13)
plt.grid()
plt.show()
x=years
y=data_profit
plt.figure(figsize=(9,6),dpi=80)
plt.plot(x,y,'m*-')
for a, b in zip(x,data_profit):
plt.text(a, b+3, b, ha='center', va='bottom')
plt.xlabel(u'年份',fontsize=13)#
plt.xticks(fontsize=13)
plt.ylabel(u'归属于股东净利润',fontsize=13)
plt.yticks(fontsize=13)
plt.title(u'000002万科A归属于股东净利润十年时间序列图',fontsize=13)
plt.legend(fontsize=13)
plt.grid()
plt.show()
all_data=[]
for i in range(len(codes)):
# all_data.append(codes[i])
code=codes[i]
get_datas(code)
get_data_csv('all',pd.DataFrame(all_data))
all_data=pd.read_csv(r'D:\学习\文档学习\222金融数据获取与分析\数据储存\年报\最后一次\all_data.csv')
profit=[]
income=[]
for i in range(len(codes)):
data_temp=all_data.iloc[0+(10*i):10+(10*i),:]
data_temp.index = years
O_income=data_temp.iloc[:,1]
S_profit=data_temp.iloc[:,2]
data_profit=get_sep(S_profit)
data_income=get_sep(O_income)
profit.append(data_profit)
income.append(data_income)
##########################营业收入图#####################################
###十家公司十年营业收入时间序列图(折线图)
x = years
fig1 = plt.figure(figsize=(36,15))
ax1 = fig1.add_subplot(251)
ax1.plot(x,income[0],'m*-')
for a, b in zip(x,income[0]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax1.set_xlabel('年 份',fontsize=10)
ax1.set_ylabel('营业收入',fontsize=10)
ax1.set_title('000002',fontsize=10)
ax2 = fig1.add_subplot(252)
ax2.plot(x,income[1],'m*-')
for a, b in zip(x,income[1]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax2.set_xlabel('年 份',fontsize=10)
ax2.set_ylabel('营业收入',fontsize=10)
ax2.set_title('000006',fontsize=10)
ax3 = fig1.add_subplot(253)
ax3.plot(x,income[2],'m*-')
for a, b in zip(x,income[2]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax3.set_xlabel('年 份',fontsize=10)
ax3.set_ylabel('营业收入',fontsize=10)
ax3.set_title('000007',fontsize=10)
ax4 = fig1.add_subplot(254)
ax4.plot(x,income[3],'m*-')
for a, b in zip(x,income[3]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax4.set_xlabel('年 份',fontsize=10)
ax4.set_ylabel('营业收入',fontsize=10)
ax4.set_title('000014',fontsize=10)
ax5 = fig1.add_subplot(255)
ax5.plot(x,income[4],'m*-')
for a, b in zip(x,income[4]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax5.set_xlabel('年 份',fontsize=10)
ax5.set_ylabel('营业收入',fontsize=10)
ax5.set_title('000029',fontsize=10)
ax6 = fig1.add_subplot(256)
ax6.plot(x,income[5],'m*-')
for a, b in zip(x,income[5]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax6.set_xlabel('年 份',fontsize=10)
ax6.set_ylabel('营业收入',fontsize=10)
ax6.set_title('000036',fontsize=10)
ax7 = fig1.add_subplot(257)
ax7.plot(x,income[6],'m*-')
for a, b in zip(x,income[6]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax7.set_xlabel('年 份',fontsize=10)
ax7.set_ylabel('营业收入',fontsize=10)
ax7.set_title('000042',fontsize=10)
ax8 = fig1.add_subplot(258)
ax8.plot(x,income[7],'m*-')
for a, b in zip(x,income[7]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax8.set_xlabel('年 份',fontsize=10)
ax8.set_ylabel('营业收入',fontsize=10)
ax8.set_title('000402',fontsize=10)
ax9 = fig1.add_subplot(259)
ax9.plot(x,income[8],'m*-')
for a, b in zip(x,income[8]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax9.set_xlabel('年 份',fontsize=10)
ax9.set_ylabel('营业收入',fontsize=10)
ax9.set_title('000517',fontsize=10)
ax10 = fig1.add_subplot(2,5,10)
ax10.plot(x,income[9],'m*-')
for a, b in zip(x,income[9]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax10.set_xlabel('年 份',fontsize=10)
ax10.set_ylabel('营业收入',fontsize=10)
ax10.set_title('000537',fontsize=10)
plt.show()
###十家公司十年营业收入时间序列图(折线图)对比图
x = years
y = income
fig= plt.figure(figsize=(40,15))
plt.xlabel("年份")
plt.ylabel("营业收入")
plt.title("十家公司十年营业收入对比图")
for i in range(len(y)):
plt.plot(x,y[i],label = 'id %s'%codes[i])
plt.legend()
plt.show()
###########################营业利润图##########################
####十家公司十年归属于股东净利润时间序列图(折线图)
x = years
fig1 = plt.figure(figsize=(36,100))
#plt.title(u'十家公司营业利润时间序列图',fontsize=13)
ax1 = fig1.add_subplot(251)
ax1.plot(x,profit[0],'m*-')
for a, b in zip(x,profit[0]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax1.set_xlabel('年 份',fontsize=10)
ax1.set_ylabel('营业利润',fontsize=10)
ax1.set_title('000002',fontsize=10)
ax2 = fig1.add_subplot(252)
ax2.plot(x,profit[1],'m*-')
for a, b in zip(x,profit[1]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax2.set_xlabel('年 份',fontsize=10)
ax2.set_ylabel('营业利润',fontsize=10)
ax2.set_title('000006',fontsize=10)
ax3 = fig1.add_subplot(253)
ax3.plot(x,profit[2],'m*-')
for a, b in zip(x,profit[2]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax3.set_xlabel('年 份',fontsize=10)
ax3.set_ylabel('营业利润',fontsize=10)
ax3.set_title('000007',fontsize=10)
ax4 = fig1.add_subplot(254)
ax4.plot(x,profit[3],'m*-')
for a, b in zip(x,profit[3]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax4.set_xlabel('年 份',fontsize=10)
ax4.set_ylabel('营业利润',fontsize=10)
ax4.set_title('000014',fontsize=10)
ax5 = fig1.add_subplot(255)
ax5.plot(x,profit[4],'m*-')
for a, b in zip(x,profit[4]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax5.set_xlabel('年 份',fontsize=10)
ax5.set_ylabel('营业利润',fontsize=10)
ax5.set_title('000029',fontsize=10)
ax6 = fig1.add_subplot(256)
ax6.plot(x,profit[5],'m*-')
for a, b in zip(x,profit[5]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax6.set_xlabel('年 份',fontsize=10)
ax6.set_ylabel('营业利润',fontsize=10)
ax6.set_title('000036',fontsize=10)
ax7 = fig1.add_subplot(257)
ax7.plot(x,profit[6],'m*-')
for a, b in zip(x,profit[6]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax7.set_xlabel('年 份',fontsize=10)
ax7.set_ylabel('营业利润',fontsize=10)
ax7.set_title('000042',fontsize=10)
ax8 = fig1.add_subplot(258)
ax8.plot(x,profit[7],'m*-')
for a, b in zip(x,profit[7]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax8.set_xlabel('年 份',fontsize=10)
ax8.set_ylabel('营业利润',fontsize=10)
ax8.set_title('000402',fontsize=10)
ax9 = fig1.add_subplot(259)
ax9.plot(x,profit[8],'m*-')
for a, b in zip(x,profit[8]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax9.set_xlabel('年 份',fontsize=10)
ax9.set_ylabel('营业利润',fontsize=10)
ax9.set_title('000517',fontsize=10)
ax10 = fig1.add_subplot(2,5,10)
ax10.plot(x,profit[9],'m*-')
for a, b in zip(x,profit[9]):
plt.text(a, b+3, b, ha='center', va='bottom')
ax10.set_xlabel('年 份',fontsize=10)
ax10.set_ylabel('营业利润',fontsize=10)
ax10.set_title('000537',fontsize=10)
plt.show()
###十家公司十年归属于股东净利润时间序列图(折线图)对比图
x = years
y = profit
fig= plt.figure(figsize=(40,15))
plt.xlabel("年份")
plt.ylabel("归属于股东净利润")
plt.title("十家公司十年归属于股东净利润对比图")
for i in range(len(y)):
plt.plot(x,y[i],label = 'id %s'%codes[i])
plt.legend()
plt.show()
df_content=pd.DataFrame()
for i in range(len(codes)): #循环访问每年的年报
code=codes[i]
pdf_name=f'{2021}_{code}.pdf'
csv_name=f'{code}.csv'
path= r"D:\学习\文档学习\222金融数据获取与分析\数据储存\年报\深交所一定成功版"
#批量表格所在文件路径
csv_data=pd.read_csv(csv_name)
doc = fitz.open(pdf_name)
text=''
for j in range(30): #读取每份年报前15页的数据(一般财务指标读15页就够)
page = doc[j]
text += page.get_text()
p_site = re.compile('(?<=\n)\w*办公地址:?\s?\n?(.*?)\s?(?=\n)',re.DOTALL)
p_web =re.compile('(?<=\n)\w*网址:?\s?\n?([a-zA-Z./:]*)\s?(?=\n)',re.DOTALL)
site=p_site.search(text).group(1)
web=p_web.search(text).group(1)
#匹配办公地址和网址(由于取最近一年的,所以只要匹配一次不用循环匹配)
df_temp=pd.DataFrame(columns=[codes[i]])
df_temp=df_temp.append({codes[i]: codes[i]}, ignore_index=True)
df_temp=df_temp.append({codes[i]: csv_data['name'][0]}, ignore_index=True)
df_temp=df_temp.append({codes[i]: site}, ignore_index=True)
df_temp=df_temp.append({codes[i]: web}, ignore_index=True)
df_content=pd.concat([df_content, df_temp], axis=1, ignore_index=False)
get_data_csv('all_content',pd.DataFrame(df_content))