import pandas as pd
import numpy as np
import openpyxl
import re
import requests
import time
import os
import fitz
xls = 'E:/学习/第二学位/课程/python数据挖掘/半导体行业.xls'
xlsx = 'E:/学习/第二学位/课程/python数据挖掘/半导体行业.xlsx'
df = pd.read_excel(xls)
exf = openpyxl.load_workbook(xlsx)
sheet = exf.active
C2 = sheet['C2']
C = sheet['C']
links = [c.value for c in C]
links_1=links[1:-1]
links_2=''.join(links_1)
p=re.compile('"(.*?)","(.*?)"',re.DOTALL)
list_of_tuple = p.findall(links_2)
df1 = pd.DataFrame({'Link':[t[0] for t in list_of_tuple],
'f_name':[t[1] for t in list_of_tuple]})
df1.to_excel('半导体行业_final.xls')
print(df1)
Link f_name 0 http://news.windin.com/ns/bulletin.php?code=35... 寒武纪:2020年年度报告(修订版) 1 http://news.windin.com/ns/bulletin.php?code=EF... 敏芯股份:2020年年度报告全文(修订版) 2 http://news.windin.com/ns/bulletin.php?code=1B... 华润微:2020年年度报告摘要 3 http://news.windin.com/ns/bulletin.php?code=F9... 华润微:2020年年度报告 4 http://news.windin.com/ns/bulletin.php?code=13... 澜起科技:2020年年度报告 .. ... ... 495 http://news.windin.com/ns/bulletin.php?code=27... 士兰微:2015年年报摘要 496 http://news.windin.com/ns/bulletin.php?code=d1... 士兰微:2015年年报 497 http://news.windin.com/ns/bulletin.php?code=c3... 通富微电:2015年年度报告 498 http://news.windin.com/ns/bulletin.php?code=5b... 通富微电:2015年年度报告摘要 499 http://news.windin.com/ns/bulletin.php?code=18... 苏州固锝:2015年年度报告 [500 rows x 2 columns]
df1=pd.read_excel(r'E:\学习\第二学位\课程\python数据挖掘\金融数据获取期末\半导体行业_final.xls')
links=df1['Link'];f_names=df1['f_name']
p=re.compile('(?<=\d{4})(年报)|(年年报)')
f_names=[p.sub('年年度报告',f) for f in df1.f_name]
df1['f_name']=f_names;del p,f_names
print(df1)
Unnamed: 0 Link \ 0 0 http://news.windin.com/ns/bulletin.php?code=35... 1 1 http://news.windin.com/ns/bulletin.php?code=EF... 2 2 http://news.windin.com/ns/bulletin.php?code=1B... 3 3 http://news.windin.com/ns/bulletin.php?code=F9... 4 4 http://news.windin.com/ns/bulletin.php?code=13... .. ... ... 494 495 http://news.windin.com/ns/bulletin.php?code=27... 495 496 http://news.windin.com/ns/bulletin.php?code=d1... 496 497 http://news.windin.com/ns/bulletin.php?code=c3... 497 498 http://news.windin.com/ns/bulletin.php?code=5b... 498 499 http://news.windin.com/ns/bulletin.php?code=18... f_name 0 寒武纪:2020年年度报告(修订版) 1 敏芯股份:2020年年度报告全文(修订版) 2 华润微:2020年年度报告摘要 3 华润微:2020年年度报告 4 澜起科技:2020年年度报告 .. ... 494 士兰微:2015年年度报告摘要 495 士兰微:2015年年度报告 496 通富微电:2015年年度报告 497 通富微电:2015年年度报告摘要 498 苏州固锝:2015年年度报告 [499 rows x 3 columns]
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])
else:
ls.append([word not in f for f in df.f_name])
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)
df_all=filter_links(['摘要','问询函','社会责任','审计','财务','风险','债券'],df1,include=False)
df_orig=filter_links(['(','(',],df_all,include=False)
df_updt=filter_links(['(','(',],df_all,include=True)
df_updt=filter_links(['取消'],df_updt,include=False)
print(df_orig,df_updt)
Unnamed: 0 Link \ 3 3 http://news.windin.com/ns/bulletin.php?code=F9... 4 4 http://news.windin.com/ns/bulletin.php?code=13... 6 6 http://news.windin.com/ns/bulletin.php?code=D1... 8 8 http://news.windin.com/ns/bulletin.php?code=94... 10 10 http://news.windin.com/ns/bulletin.php?code=5E... .. ... ... 490 491 http://news.windin.com/ns/bulletin.php?code=1d... 492 493 http://news.windin.com/ns/bulletin.php?code=c8... 495 496 http://news.windin.com/ns/bulletin.php?code=d1... 496 497 http://news.windin.com/ns/bulletin.php?code=c3... 498 499 http://news.windin.com/ns/bulletin.php?code=18... f_name 3 华润微:2020年年度报告 4 澜起科技:2020年年度报告 6 *ST盈方:2020年年度报告 8 富瀚微:2020年年度报告 10 博通集成:2020年度报告 .. ... 490 聚飞光电:2015年年度报告 492 台基股份:2015年年度报告 495 士兰微:2015年年度报告 496 通富微电:2015年年度报告 498 苏州固锝:2015年年度报告 [232 rows x 3 columns] Unnamed: 0 Link \ 0 0 http://news.windin.com/ns/bulletin.php?code=35... 1 1 http://news.windin.com/ns/bulletin.php?code=EF... 19 19 http://news.windin.com/ns/bulletin.php?code=5C... 56 56 http://news.windin.com/ns/bulletin.php?code=78... 64 64 http://news.windin.com/ns/bulletin.php?code=29... 77 77 http://news.windin.com/ns/bulletin.php?code=FD... 135 135 http://news.windin.com/ns/bulletin.php?code=08... 152 152 http://news.windin.com/ns/bulletin.php?code=0D... 153 153 http://news.windin.com/ns/bulletin.php?code=0D... 154 154 http://news.windin.com/ns/bulletin.php?code=07... 156 156 http://news.windin.com/ns/bulletin.php?code=AE... 157 157 http://news.windin.com/ns/bulletin.php?code=3B... 224 225 http://news.windin.com/ns/bulletin.php?code=31... 266 267 http://news.windin.com/ns/bulletin.php?code=28... 267 268 http://news.windin.com/ns/bulletin.php?code=3D... 307 308 http://news.windin.com/ns/bulletin.php?code=14... 308 309 http://news.windin.com/ns/bulletin.php?code=47... 309 310 http://news.windin.com/ns/bulletin.php?code=18... 310 311 http://news.windin.com/ns/bulletin.php?code=04... 311 312 http://news.windin.com/ns/bulletin.php?code=2E... 352 353 http://news.windin.com/ns/bulletin.php?code=9A... 389 390 http://news.windin.com/ns/bulletin.php?code=FB... 391 392 http://news.windin.com/ns/bulletin.php?code=45... 393 394 http://news.windin.com/ns/bulletin.php?code=9C... 433 434 http://news.windin.com/ns/bulletin.php?code=FD... 458 459 http://news.windin.com/ns/bulletin.php?code=F0... 459 460 http://news.windin.com/ns/bulletin.php?code=AA... f_name 0 寒武纪:2020年年度报告(修订版) 1 敏芯股份:2020年年度报告全文(修订版) 19 晓程科技:2019年年度报告(更新后) 56 惠伦晶体:2020年年度报告(更新后) 64 力合微:2020年年度报告(更新后) 77 芯原股份:2020年年度报告(修订版) 135 泰晶科技:2020年年度报告(更正版) 152 富瀚微:2018年年度报告(更新后) 153 富瀚微:2017年年度报告(更新后) 154 富瀚微:2019年年度报告(更新后) 156 捷捷微电:2019年年度报告(更新后) 157 欧比特:2019年年度报告(更新后) 224 阿石创:2019年年度报告(更新后) 266 新亚制程:2018年年度报告(更新后) 267 弘高创意:2018年年度报告(更新后) 307 联建光电:2017年年度报告(更新后) 308 盈方微:2017年年度报告(更新后) 309 *ST海润:2017年年度报告(修订版) 310 长电科技:2017年年度报告(修订版) 311 三安光电:2017年年度报告(修订稿) 352 华微电子:2017年年度报告(修订版) 389 *ST弘高:2016年年度报告(更新后) 391 *ST海润:2016年年度报告(修订版) 393 联建光电:2016年年度报告(更新后) 433 *ST盈方:2016年年度报告(更新后) 458 弘高创意:2015年年度报告(更新后) 459 *ST盈方:2015年年度报告(更新后)
def sub_with_update(df_updt,df_orig):
index_orig=[];i=0
index_updt=[];j=0
for i,f in enumerate(df_orig):
for j,fn in enumerate(df_updt):
if f in fn:
index_orig.append(i)
index_updt.append(j)
for n in range(len(index_orig)):
i=index_orig[n]
j=index_updt[n]
df_orig.iloc[i,-2]=df_updt.iloc[j,-2]
return(df_orig)
df_newest=sub_with_update(df_updt,df_orig)
df_newest.sort_values(by=['f_name'],inplace=True,ignore_index=True)
print(df_newest)
Unnamed: 0 Link \ 0 350 http://news.windin.com/ns/bulletin.php?code=8A... 1 476 http://news.windin.com/ns/bulletin.php?code=9f... 2 313 http://news.windin.com/ns/bulletin.php?code=19... 3 449 http://news.windin.com/ns/bulletin.php?code=5E... 4 265 http://news.windin.com/ns/bulletin.php?code=F9... .. ... ... 227 249 http://news.windin.com/ns/bulletin.php?code=16... 228 26 http://news.windin.com/ns/bulletin.php?code=D5... 229 20 http://news.windin.com/ns/bulletin.php?code=26... 230 239 http://news.windin.com/ns/bulletin.php?code=A4... 231 95 http://news.windin.com/ns/bulletin.php?code=04... f_name 0 *ST弘高:2017年年度报告 1 *ST海润:2015年年度报告 2 *ST海润:2017年年度报告 3 *ST盈方:2016年年度报告 4 *ST盈方:2019年年度报告 .. ... 227 阿石创:2019年年度报告 228 阿石创:2020年年度报告 229 雅克科技:2020年年度报告 230 韦尔股份:2019年年度报告 231 韦尔股份:2020年年度报告全文 [232 rows x 3 columns]
c:\programdata\anaconda3\lib\site-packages\pandas\core\indexing.py:1763: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy isetter(loc, value) C:\Users\Administrator\AppData\Roaming\Python\Python37\site-packages\ipykernel_launcher.py:17: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
df_newest['公司简称']=[f[:4] for f in df_newest.f_name]
counts=df_newest['公司简称'].value_counts()
ten_company=[]
for cn in counts.index[:10]:
ten_company.append(filter_links([cn],df_newest))
print(ten_company)
[ Unnamed: 0 Link \ 204 499 http://news.windin.com/ns/bulletin.php?code=18... 205 442 http://news.windin.com/ns/bulletin.php?code=AD... 206 364 http://news.windin.com/ns/bulletin.php?code=26... 207 292 http://news.windin.com/ns/bulletin.php?code=99... 208 209 http://news.windin.com/ns/bulletin.php?code=3D... 209 140 http://news.windin.com/ns/bulletin.php?code=68... f_name 公司简称 204 苏州固锝:2015年年度报告 苏州固锝 205 苏州固锝:2016年年度报告 苏州固锝 206 苏州固锝:2017年年度报告 苏州固锝 207 苏州固锝:2018年年度报告 苏州固锝 208 苏州固锝:2019年年度报告 苏州固锝 209 苏州固锝:2020年年度报告 苏州固锝 , Unnamed: 0 Link \ 86 496 http://news.windin.com/ns/bulletin.php?code=d1... 87 451 http://news.windin.com/ns/bulletin.php?code=BE... 88 374 http://news.windin.com/ns/bulletin.php?code=F8... 89 289 http://news.windin.com/ns/bulletin.php?code=0E... 90 215 http://news.windin.com/ns/bulletin.php?code=9A... 91 148 http://news.windin.com/ns/bulletin.php?code=B1... f_name 公司简称 86 士兰微:2015年年度报告 士兰微: 87 士兰微:2016年年度报告 士兰微: 88 士兰微:2017年年度报告 士兰微: 89 士兰微:2018年年度报告 士兰微: 90 士兰微:2019年年度报告 士兰微: 91 士兰微:2020年年度报告 士兰微: , Unnamed: 0 Link \ 210 497 http://news.windin.com/ns/bulletin.php?code=c3... 211 444 http://news.windin.com/ns/bulletin.php?code=CA... 212 321 http://news.windin.com/ns/bulletin.php?code=DC... 213 286 http://news.windin.com/ns/bulletin.php?code=4A... 214 253 http://news.windin.com/ns/bulletin.php?code=53... 215 119 http://news.windin.com/ns/bulletin.php?code=02... f_name 公司简称 210 通富微电:2015年年度报告 通富微电 211 通富微电:2016年年度报告 通富微电 212 通富微电:2017年年度报告 通富微电 213 通富微电:2018年年度报告 通富微电 214 通富微电:2019年年度报告 通富微电 215 通富微电:2020年年度报告 通富微电 , Unnamed: 0 Link \ 60 485 http://news.windin.com/ns/bulletin.php?code=1b... 61 412 http://news.windin.com/ns/bulletin.php?code=30... 62 366 http://news.windin.com/ns/bulletin.php?code=6B... 63 294 http://news.windin.com/ns/bulletin.php?code=E4... 64 167 http://news.windin.com/ns/bulletin.php?code=09... 65 76 http://news.windin.com/ns/bulletin.php?code=FB... f_name 公司简称 60 南大光电:2015年年度报告 南大光电 61 南大光电:2016年年度报告 南大光电 62 南大光电:2017年年度报告 南大光电 63 南大光电:2018年年度报告 南大光电 64 南大光电:2019年年度报告 南大光电 65 南大光电:2020年年度报告 南大光电 , Unnamed: 0 Link \ 40 481 http://news.windin.com/ns/bulletin.php?code=49... 41 432 http://news.windin.com/ns/bulletin.php?code=A3... 42 377 http://news.windin.com/ns/bulletin.php?code=72... 43 270 http://news.windin.com/ns/bulletin.php?code=BC... 44 179 http://news.windin.com/ns/bulletin.php?code=09... 45 127 http://news.windin.com/ns/bulletin.php?code=82... f_name 公司简称 40 华天科技:2015年年度报告 华天科技 41 华天科技:2016年年度报告 华天科技 42 华天科技:2017年年度报告 华天科技 43 华天科技:2018年年度报告 华天科技 44 华天科技:2019年年度报告 华天科技 45 华天科技:2020年年度报告 华天科技 , Unnamed: 0 Link \ 13 428 http://news.windin.com/ns/bulletin.php?code=4A... 14 360 http://news.windin.com/ns/bulletin.php?code=B7... 15 282 http://news.windin.com/ns/bulletin.php?code=3E... 16 258 http://news.windin.com/ns/bulletin.php?code=24... 17 132 http://news.windin.com/ns/bulletin.php?code=F0... f_name 公司简称 13 上海贝岭:2016年年度报告 上海贝岭 14 上海贝岭:2017年年度报告 上海贝岭 15 上海贝岭:2018年年度报告 上海贝岭 16 上海贝岭:2019年年度报告 上海贝岭 17 上海贝岭:2020年年度报告 上海贝岭 , Unnamed: 0 Link \ 104 430 http://news.windin.com/ns/bulletin.php?code=3A... 105 372 http://news.windin.com/ns/bulletin.php?code=A5... 106 298 http://news.windin.com/ns/bulletin.php?code=D7... 107 261 http://news.windin.com/ns/bulletin.php?code=E4... 108 138 http://news.windin.com/ns/bulletin.php?code=FC... f_name 公司简称 104 康强电子:2016年年度报告 康强电子 105 康强电子:2017年年度报告 康强电子 106 康强电子:2018年年度报告 康强电子 107 康强电子:2019年年度报告 康强电子 108 康强电子:2020年年度报告 康强电子 , Unnamed: 0 Link \ 150 473 http://news.windin.com/ns/bulletin.php?code=df... 151 403 http://news.windin.com/ns/bulletin.php?code=ED... 152 340 http://news.windin.com/ns/bulletin.php?code=41... 153 158 http://news.windin.com/ns/bulletin.php?code=DF... 154 43 http://news.windin.com/ns/bulletin.php?code=31... f_name 公司简称 150 欧比特:2015年年度报告 欧比特: 151 欧比特:2016年年度报告 欧比特: 152 欧比特:2017年年度报告 欧比特: 153 欧比特:2019年年度报告 欧比特: 154 欧比特:2020年年度报告 欧比特: , Unnamed: 0 Link \ 68 493 http://news.windin.com/ns/bulletin.php?code=c8... 69 457 http://news.windin.com/ns/bulletin.php?code=4F... 70 382 http://news.windin.com/ns/bulletin.php?code=8E... 71 220 http://news.windin.com/ns/bulletin.php?code=C4... 72 62 http://news.windin.com/ns/bulletin.php?code=9B... f_name 公司简称 68 台基股份:2015年年度报告 台基股份 69 台基股份:2016年年度报告 台基股份 70 台基股份:2017年年度报告 台基股份 71 台基股份:2019年年度报告 台基股份 72 台基股份:2020年年度报告 台基股份 , Unnamed: 0 Link \ 114 479 http://news.windin.com/ns/bulletin.php?code=62... 115 406 http://news.windin.com/ns/bulletin.php?code=72... 116 331 http://news.windin.com/ns/bulletin.php?code=25... 117 193 http://news.windin.com/ns/bulletin.php?code=BA... 118 67 http://news.windin.com/ns/bulletin.php?code=C0... f_name 公司简称 114 惠伦晶体:2015年年度报告 惠伦晶体 115 惠伦晶体:2016年年度报告 惠伦晶体 116 惠伦晶体:2017年年度报告 惠伦晶体 117 惠伦晶体:2019年年度报告 惠伦晶体 118 惠伦晶体:2020年年度报告 惠伦晶体 ]
C:\Users\Administrator\AppData\Roaming\Python\Python37\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy """Entry point for launching an IPython kernel.
#封装下载pdf的函数
def get_PDF_url(url):
r=requests.get(url);r.encoding='utf-8';html=r.text
r.close()
p=re.compile('<a href=(.*?)\s.*?>(.*?)</a>',re.DOTALL)
a=p.search(html)
if a is None:
Warning('没有找到下载链接,请手动检查链接:%s' % url)
return()
else:
href=a.group(1);fname=a.group(2).strip()
href=r.url[:26]+href
return((href,fname))
#循环下载
for n in range(len(ten_company)):
df_One_Co = pd.DataFrame({'Link':[h for h in ten_company[n]['Link']],
'f_name':[f for f in ten_company[n]['f_name']]})
for i in range(len(df_One_Co)):
href,fname=get_PDF_url(df_One_Co.Link[i])
r=requests.get(href,allow_redirects=True)
open('%s'%fname,'wb').write(r.content)
time.sleep(10)
r.close()
filenames = os.listdir()
print(filenames)
['.ipynb_checkpoints', '10companies', 'daima.py', 'download_PDF.py', 'getInCampus.py', 'parse_annual_report.py', 'play_xlsx.py', 're_a_tag.py', 're_pdf.py', 'select_annual_reports.py', 'Untitled.ipynb', 'u_csv.py', '上海贝岭2016年年度报告.pdf', '上海贝岭2016财务数据.xls', '上海贝岭2017年年度报告.pdf', '上海贝岭2017财务数据.xls', '上海贝岭2018年年度报告.pdf', '上海贝岭2018财务数据.xls', '上海贝岭2019年年度报告.pdf', '上海贝岭2019财务数据.xls', '上海贝岭2020年年度报告.pdf', '上海贝岭2020财务数据.xls', '下载的年报.pdf', '半导体行业.csv', '半导体行业.xls', '半导体行业_final.xls', '半导体行业_final_links.csv', '华天科技2015财务数据.xls', '华天科技2016财务数据.xls', '华天科技2017财务数据.xls', '华天科技2018财务数据.xls', '华天科技2019财务数据.xls', '华天科技2020财务数据.xls', '华天科技:2015年年度报告.pdf', '华天科技:2016年年度报告.pdf', '华天科技:2017年年度报告.pdf', '华天科技:2018年年度报告.pdf', '华天科技:2019年年度报告.pdf', '华天科技:2020年年度报告.pdf', '南大光电2015财务数据.xls', '南大光电2016财务数据.xls', '南大光电2017财务数据.xls', '南大光电2018财务数据.xls', '南大光电2019财务数据.xls', '南大光电2020财务数据.xls', '南大光电:2015年年度报告.pdf', '南大光电:2016年年度报告.pdf', '南大光电:2017年年度报告.pdf', '南大光电:2018年年度报告.pdf', '南大光电:2019年年度报告.pdf', '南大光电:2020年年度报告.pdf', '卢慧娟-期末实验报告.html', '卢慧娟-期末实验报告.ipynb', '台基股份2015财务数据.xls', '台基股份2016财务数据.xls', '台基股份2017财务数据.xls', '台基股份2019财务数据.xls', '台基股份2020财务数据.xls', '台基股份:2015年年度报告.pdf', '台基股份:2016年年度报告.pdf', '台基股份:2017年年度报告.pdf', '台基股份:2019年年度报告.pdf', '台基股份:2020年年度报告.pdf', '士兰微2015年年度报告.pdf', '士兰微2015财务数据.xls', '士兰微2016年年度报告.pdf', '士兰微2016财务数据.xls', '士兰微2017年年度报告.pdf', '士兰微2017财务数据.xls', '士兰微2018年年度报告.pdf', '士兰微2018财务数据.xls', '士兰微2019年年度报告.pdf', '士兰微2019财务数据.xls', '士兰微2020年年度报告.pdf', '士兰微2020财务数据.xls', '康强电子2016财务数据.xls', '康强电子2017财务数据.xls', '康强电子2018财务数据.xls', '康强电子2019财务数据.xls', '康强电子2020财务数据.xls', '康强电子:2016年年度报告.pdf', '康强电子:2017年年度报告.pdf', '康强电子:2018年年度报告.pdf', '康强电子:2019年年度报告.pdf', '康强电子:2020年年度报告.pdf', '惠伦晶体2015财务数据.xls', '惠伦晶体2016财务数据.xls', '惠伦晶体2017财务数据.xls', '惠伦晶体2019财务数据.xls', '惠伦晶体2020财务数据.xls', '惠伦晶体:2015年年度报告.pdf', '惠伦晶体:2016年年度报告.pdf', '惠伦晶体:2017年年度报告.pdf', '惠伦晶体:2019年年度报告.pdf', '惠伦晶体:2020年年度报告.pdf', '期末实验报告.py', '欧比特2015财务数据.xls', '欧比特2016财务数据.xls', '欧比特2017财务数据.xls', '欧比特2019财务数据.xls', '欧比特2020财务数据.xls', '欧比特:2015年年度报告.pdf', '欧比特:2016年年度报告.pdf', '欧比特:2017年年度报告.pdf', '欧比特:2019年年度报告.pdf', '欧比特:2020年年度报告.pdf', '苏州固锝2015财务数据.xls', '苏州固锝2016财务数据.xls', '苏州固锝2017财务数据.xls', '苏州固锝2018财务数据.xls', '苏州固锝2019财务数据.xls', '苏州固锝2020财务数据.xls', '苏州固锝:2015年年度报告.pdf', '苏州固锝:2016年年度报告.pdf', '苏州固锝:2017年年度报告.pdf', '苏州固锝:2018年年度报告.pdf', '苏州固锝:2019年年度报告.pdf', '苏州固锝:2020年年度报告.pdf', '证券行业.csv', '通富微电2015财务数据.xls', '通富微电2016财务数据.xls', '通富微电2017财务数据.xls', '通富微电2018财务数据.xls', '通富微电2019财务数据.xls', '通富微电2020财务数据.xls', '通富微电:2015年年度报告.pdf', '通富微电:2016年年度报告.pdf', '通富微电:2017年年度报告.pdf', '通富微电:2018年年度报告.pdf', '通富微电:2019年年度报告.pdf', '通富微电:2020年年度报告.pdf']
for i in range(len(ten_company)):
prefix= ten_company[i].iloc[1,-1]
print(prefix)
pdf = [f for f in filenames if prefix[:3] in f and f.endswith('.pdf')]
print(pdf)
year = [p[-13:-9] for p in pdf]
print(year)
苏州固锝 ['苏州固锝:2015年年度报告.pdf', '苏州固锝:2016年年度报告.pdf', '苏州固锝:2017年年度报告.pdf', '苏州固锝:2018年年度报告.pdf', '苏州固锝:2019年年度报告.pdf', '苏州固锝:2020年年度报告.pdf'] ['2015', '2016', '2017', '2018', '2019', '2020'] 士兰微: ['士兰微2015年年度报告.pdf', '士兰微2016年年度报告.pdf', '士兰微2017年年度报告.pdf', '士兰微2018年年度报告.pdf', '士兰微2019年年度报告.pdf', '士兰微2020年年度报告.pdf'] ['2015', '2016', '2017', '2018', '2019', '2020'] 通富微电 ['通富微电:2015年年度报告.pdf', '通富微电:2016年年度报告.pdf', '通富微电:2017年年度报告.pdf', '通富微电:2018年年度报告.pdf', '通富微电:2019年年度报告.pdf', '通富微电:2020年年度报告.pdf'] ['2015', '2016', '2017', '2018', '2019', '2020'] 南大光电 ['南大光电:2015年年度报告.pdf', '南大光电:2016年年度报告.pdf', '南大光电:2017年年度报告.pdf', '南大光电:2018年年度报告.pdf', '南大光电:2019年年度报告.pdf', '南大光电:2020年年度报告.pdf'] ['2015', '2016', '2017', '2018', '2019', '2020'] 华天科技 ['华天科技:2015年年度报告.pdf', '华天科技:2016年年度报告.pdf', '华天科技:2017年年度报告.pdf', '华天科技:2018年年度报告.pdf', '华天科技:2019年年度报告.pdf', '华天科技:2020年年度报告.pdf'] ['2015', '2016', '2017', '2018', '2019', '2020'] 上海贝岭 ['上海贝岭2016年年度报告.pdf', '上海贝岭2017年年度报告.pdf', '上海贝岭2018年年度报告.pdf', '上海贝岭2019年年度报告.pdf', '上海贝岭2020年年度报告.pdf'] ['2016', '2017', '2018', '2019', '2020'] 康强电子 ['康强电子:2016年年度报告.pdf', '康强电子:2017年年度报告.pdf', '康强电子:2018年年度报告.pdf', '康强电子:2019年年度报告.pdf', '康强电子:2020年年度报告.pdf'] ['2016', '2017', '2018', '2019', '2020'] 欧比特: ['欧比特:2015年年度报告.pdf', '欧比特:2016年年度报告.pdf', '欧比特:2017年年度报告.pdf', '欧比特:2019年年度报告.pdf', '欧比特:2020年年度报告.pdf'] ['2015', '2016', '2017', '2019', '2020'] 台基股份 ['台基股份:2015年年度报告.pdf', '台基股份:2016年年度报告.pdf', '台基股份:2017年年度报告.pdf', '台基股份:2019年年度报告.pdf', '台基股份:2020年年度报告.pdf'] ['2015', '2016', '2017', '2019', '2020'] 惠伦晶体 ['惠伦晶体:2015年年度报告.pdf', '惠伦晶体:2016年年度报告.pdf', '惠伦晶体:2017年年度报告.pdf', '惠伦晶体:2019年年度报告.pdf', '惠伦晶体:2020年年度报告.pdf'] ['2015', '2016', '2017', '2019', '2020']
def getText(pdf):
text = ''
doc = fitz.open(pdf)
for page in doc:
text += page.getText()
doc.close()
return(text)
def parse_data_line(pdf):
text = getText(pdf)
p1 = re.compile('\w{1,2}、主要会计数据和财务指标(.*?)(?=\w{1,2}、)',re.DOTALL)
subtext = p1.search(text)
if subtext is None:
p1 = re.compile('(\w{1,2})\s*主要会计数据(.*?)(?=(\w{1,2})\s*主要财务指标)',re.DOTALL)
subtext = p1.search(text).group(0)
else:
subtext = p1.search(text).group(0)
subp='([0-9,.%\- ]*?)\n' and '([0-9,.%\- ]*?)\s'
psub='%s%s%s%s'%(subp,subp,subp,subp)
p=re.compile('(\D+\n)+%s'%psub)
lines=p.findall(subtext)
return(lines)
filenames = os.listdir()
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei'] #确保显示中文
plt.rcParams['axes.unicode_minus'] = False #确保显示负数的参数设置
for i in range(4):
prefix= ten_company[i].iloc[1,-1]
print(prefix)
pdf = [f for f in filenames if prefix[:3] in f and f.endswith('.pdf')]
year = [p[-13:-9] for p in pdf]
df_data=pd.DataFrame({'年份':year,
'年营业收入':''})
for y in range(len(pdf)):
lines=parse_data_line(pdf[y])
df_fnc=pd.DataFrame([l for l in lines],columns=['',year[y]+'年',str(eval(year[y])-1)+'年','本年比上年增减',str(eval(year[y])-2)+'年'])
#df_fnc.to_excel('%s%s财务数据.xls'%(prefix,year[y]))
s=df_fnc.iloc[0,1]
s=s.replace(',','')
df_data['年营业收入'][[y]]=eval(s)
print(df_data)
plt.figure()
plt.plot(df_data['年份'],df_data['年营业收入'],label=u'年营业收入',color='#FF8247')
for x,y in zip(df_data['年份'],df_data['年营业收入']):#显示bar数值
plt.text(x,y,'%.3e'%y,ha='center',va='bottom')
plt.xlabel(u'(年)',fontsize=13)
plt.ylabel(u'年营业收入(元)',fontsize=13,rotation=90)
plt.legend(loc='best')
plt.title(u'%s%s-%s年营业收入的可视化'%(prefix,str(year[0]),str(year[-1])),fontsize=13)
plt.yticks(range(0,10**10,10**9))
plt.grid(True)
plt.show()
苏州固锝 年份 年营业收入 0 2015 8.11946e+08 1 2016 1.18733e+09 2 2017 1.85459e+09 3 2018 1.88533e+09 4 2019 1.98055e+09 5 2020 1.80466e+09
士兰微: 年份 年营业收入 0 2015 1.92641e+09 1 2016 2.37505e+09 2 2017 2.74179e+09 3 2018 3.02586e+09 4 2019 3.11057e+09 5 2020 4.28056e+09
通富微电 年份 年营业收入 0 2015 2.3219e+09 1 2016 4.59166e+09 2 2017 6.51926e+09 3 2018 7.22286e+09 4 2019 8.26657e+09 5 2020 1.07687e+10
南大光电 年份 年营业收入 0 2015 1.20372e+08 1 2016 1.01325e+08 2 2017 1.77213e+08 3 2018 2.28175e+08 4 2019 3.21376e+08 5 2020 5.94959e+08
华天科技 年份 年营业收入 0 2015 3.87402e+09 1 2016 5.47503e+09 2 2017 7.00989e+09 3 2018 712170626 4 2019 8.10349e+09 5 2020 8.38208e+09
for i in range(5):
prefix= ten_company[-i].iloc[1,-1]
print(prefix)
pdf = [f for f in filenames if prefix[:3] in f and f.endswith('.pdf')]
year = [p[-13:-9] for p in pdf]
df_data=pd.DataFrame({'年份':year,
'年营业收入':''})
for y in range(len(pdf)):
lines=parse_data_line(pdf[y])
df_fnc=pd.DataFrame([l for l in lines],columns=['',year[y]+'年',str(eval(year[y])-1)+'年','本年比上年增减',str(eval(year[y])-2)+'年'])
#df_fnc.to_excel('%s%s财务数据.xls'%(prefix,year[y]))
s=df_fnc.iloc[0,1]
s=s.replace(',','')
df_data['年营业收入'][[y]]=eval(s)
print(df_data)
plt.figure()
plt.plot(df_data['年份'],df_data['年营业收入'],label=u'年营业收入',color='#FF8247')
for x,y in zip(df_data['年份'],df_data['年营业收入']):#显示bar数值
plt.text(x,y,'%.3e'%y,ha='center',va='bottom')
plt.xlabel(u'(年)',fontsize=13)
plt.ylabel(u'年营业收入(元)',fontsize=13,rotation=90)
plt.legend(loc='best')
plt.title(u'%s%s-%s年营业收入的可视化'%(prefix,str(year[0]),str(year[-1])),fontsize=13)
plt.yticks(range(0,10**10,10**9))
plt.grid(True)
plt.show()
苏州固锝 年份 年营业收入 0 2015 8.11946e+08 1 2016 1.18733e+09 2 2017 1.85459e+09 3 2018 1.88533e+09 4 2019 1.98055e+09 5 2020 1.80466e+09
惠伦晶体
mupdf: kid not found in parent's kids array
年份 年营业收入 0 2015 4.16417e+08 1 2016 3.69797e+08 2 2017 3.63278e+08 3 2019 3.09943e+08 4 2020 3.8784e+08
台基股份 年份 年营业收入 0 2015 1.66154e+08 1 2016 2.42092e+08 2 2017 2.78652e+08 3 2019 2.64938e+08 4 2020 3.88245e+08
欧比特: 年份 年营业收入 0 2015 3.88817e+08 1 2016 5.59937e+08 2 2017 7.38851e+08 3 2019 8.51704e+08 4 2020 8.69832e+08
康强电子 年份 年营业收入 0 2016 1.19675e+09 1 2017 1.30362e+09 2 2018 1.4829e+09 3 2019 1.41827e+09 4 2020 1.54863e+09
prefix= '上海贝岭'
pdf = [f for f in filenames if prefix[:3] in f and f.endswith('.pdf')]
year = [p[-13:-9] for p in pdf]
df_data=pd.DataFrame({'年份':year,
'年营业收入':''})
for i in range(len(year)):
df_fnc=pd.read_excel(r'%s%s财务数据.xls'%(prefix,year[i]))
s=df_fnc.iloc[0,2]
if type(s)==str:
s=s.replace(',','')
s=eval(s)
df_data['年营业收入'][[i]]=s
print(df_data)
plt.figure()
plt.plot(df_data['年份'],df_data['年营业收入'],label=u'年营业收入',color='#FF8247')
for x,y in zip(df_data['年份'],df_data['年营业收入']):#显示bar数值
plt.text(x,y,'%.3e'%y,ha='center',va='bottom')
plt.xlabel(u'(年)',fontsize=13)
plt.ylabel(u'年营业收入(元)',fontsize=13,rotation=90)
plt.legend(loc='best')
plt.title(u'%s%s-%s年营业收入的可视化'%(prefix,str(year[0]),str(year[-1])),fontsize=13)
plt.yticks(range(0,10**10,10**9))
plt.grid(True)
plt.show()
年份 年营业收入 0 2016 5.09094e+08 1 2017 5.61874e+08 2 2018 7.84344e+08 3 2019 8.78629e+08 4 2020 1.33221e+09
发现华天科技2018年数据有较大波动,经检查发现数据提取少一位数,经修正后图形如下:
prefix= '华天科技'
pdf = [f for f in filenames if prefix[:3] in f and f.endswith('.pdf')]
year = [p[-13:-9] for p in pdf]
df_data=pd.DataFrame({'年份':year,
'年营业收入':''})
for i in range(len(year)):
df_fnc=pd.read_excel(r'%s%s财务数据.xls'%(prefix,year[i]))
s=df_fnc.iloc[0,2]
if type(s)==str:
s=s.replace(',','')
s=eval(s)
df_data['年营业收入'][[i]]=s
print(df_data)
plt.figure()
plt.plot(df_data['年份'],df_data['年营业收入'],label=u'年营业收入',color='#FF8247')
for x,y in zip(df_data['年份'],df_data['年营业收入']):#显示bar数值
plt.text(x,y,'%.3e'%y,ha='center',va='bottom')
plt.xlabel(u'(年)',fontsize=13)
plt.ylabel(u'年营业收入(元)',fontsize=13,rotation=90)
plt.legend(loc='best')
plt.title(u'%s%s-%s年营业收入的可视化'%(prefix,str(year[0]),str(year[-1])),fontsize=13)
plt.yticks(range(0,10**10,10**9))
plt.grid(True)
plt.show()
年份 年营业收入 0 2015 3.87402e+09 1 2016 5.47503e+09 2 2017 7.00989e+09 3 2018 7.12171e+09 4 2019 8.10349e+09 5 2020 8.38208e+09
一种提取方式为: year1=[]#输入年份 for i in range(len(year1)): year2= year1[i] pdf = [f for f in filenames if year2 in f and f.endswith('.pdf')] fname = [p[:4] for p in pdf] df_data=pd.DataFrame(columns=['营收'],index= fname) df_data=df_data.fillna('') for y in range(len(fname)): lines=parse_data_line(pdf[y]) df_fnc1=pd.DataFrame([l for l in lines],columns=['0','1','1','2','3']) s=df_fnc1.iloc[0,1] s=s.replace(',','') df_data['营收'][[y]]=eval(s) 但该种方式提取出错不易发现,故作出改进。
df_income=pd.DataFrame({'年份':['2015','2016','2017','2018','2019','2020']})
df_income=df_income.set_index(['年份'])
print(df_income)
Empty DataFrame Columns: [] Index: [2015, 2016, 2017, 2018, 2019, 2020]
import pandas as pd
import numpy as np
p=[]
for i in range(10):
prefix= ten_company[i].iloc[1,-1]
if ':' in prefix:
prefix=prefix[:3]
p.append(prefix)
print(p)
['苏州固锝', '士兰微', '通富微电', '南大光电', '华天科技', '上海贝岭', '康强电子', '欧比特', '台基股份', '惠伦晶体']
for i in range(len(p)):
prefix= p[i]
pdf = [f for f in filenames if prefix in f and f.endswith('.pdf')]
year = [a[-13:-9] for a in pdf]
df_data=pd.DataFrame({'年份':year,
'%s'%prefix:''})
for y in range(len(year)):
df_fnc=pd.read_excel(r'%s%s财务数据.xls'%(prefix,year[y]))
s=df_fnc.iloc[0,2]
if type(s)==str:
s=s.replace(',','')
s=eval(s)
df_data['%s'%prefix][[y]]=s
df_data=df_data.set_index(['年份'])
print(df_data)
df_income=pd.concat([df_income,df_data],axis=1)
#df_income=pd.merge(df_income,df_data,how='left',on='年份')
df_income=df_income.fillna(0)
print(df_income)
苏州固锝 年份 2015 8.11946e+08 2016 1.18733e+09 2017 1.85459e+09 2018 1.88533e+09 2019 1.98055e+09 2020 1.80466e+09 士兰微 年份 2015 1.92641e+09 2016 2.37505e+09 2017 2.74179e+09 2018 3.02586e+09 2019 3.11057e+09 2020 4.28056e+09 通富微电 年份 2015 2.3219e+09 2016 4.59166e+09 2017 6.51926e+09 2018 7.22286e+09 2019 8.26657e+09 2020 1.07687e+10 南大光电 年份 2015 1.20372e+08 2016 1.01325e+08 2017 1.77213e+08 2018 2.28175e+08 2019 3.21376e+08 2020 5.94959e+08 华天科技 年份 2015 3.87402e+09 2016 5.47503e+09 2017 7.00989e+09 2018 7.12171e+09 2019 8.10349e+09 2020 8.38208e+09 上海贝岭 年份 2016 5.09094e+08 2017 5.61874e+08 2018 7.84344e+08 2019 8.78629e+08 2020 1.33221e+09 康强电子 年份 2016 1.19675e+09 2017 1.30362e+09 2018 1.4829e+09 2019 1.41827e+09 2020 1.54863e+09 欧比特 年份 2015 3.88817e+08 2016 5.59937e+08 2017 7.38851e+08 2019 8.51704e+08 2020 8.69832e+08 台基股份 年份 2015 1.66154e+08 2016 2.42092e+08 2017 2.78652e+08 2019 2.64938e+08 2020 3.88245e+08 惠伦晶体 年份 2015 4.16417e+08 2016 3.69797e+08 2017 3.63278e+08 2019 3.09943e+08 2020 3.8784e+08 苏州固锝 士兰微 通富微电 南大光电 华天科技 \ 2015 8.119459e+08 1.926415e+09 2.321903e+09 1.203723e+08 3.874017e+09 2016 1.187334e+09 2.375054e+09 4.591657e+09 1.013255e+08 5.475028e+09 2017 1.854591e+09 2.741792e+09 6.519255e+09 1.772135e+08 7.009887e+09 2018 1.885325e+09 3.025857e+09 7.222863e+09 2.281749e+08 7.121706e+09 2019 1.980553e+09 3.110574e+09 8.266575e+09 3.213758e+08 8.103491e+09 2020 1.804661e+09 4.280562e+09 1.076870e+10 5.949585e+08 8.382084e+09 上海贝岭 康强电子 欧比特 台基股份 惠伦晶体 2015 0.000000e+00 0.000000e+00 3.888175e+08 1.661545e+08 4.164171e+08 2016 5.090939e+08 1.196755e+09 5.599367e+08 2.420919e+08 3.697974e+08 2017 5.618740e+08 1.303618e+09 7.388514e+08 2.786518e+08 3.632782e+08 2018 7.843444e+08 1.482897e+09 0.000000e+00 0.000000e+00 0.000000e+00 2019 8.786292e+08 1.418270e+09 8.517035e+08 2.649378e+08 3.099427e+08 2020 1.332206e+09 1.548633e+09 8.698315e+08 3.882449e+08 3.878405e+08
x=df_income.columns
print(x)
y=df_income.iloc[0,:]
print(y)
index=df_income.index
print(index)
Index(['苏州固锝', '士兰微', '通富微电', '南大光电', '华天科技', '上海贝岭', '康强电子', '欧比特', '台基股份', '惠伦晶体'], dtype='object') 苏州固锝 8.119459e+08 士兰微 1.926415e+09 通富微电 2.321903e+09 南大光电 1.203723e+08 华天科技 3.874017e+09 上海贝岭 0.000000e+00 康强电子 0.000000e+00 欧比特 3.888175e+08 台基股份 1.661545e+08 惠伦晶体 4.164171e+08 Name: 2015, dtype: float64 Index(['2015', '2016', '2017', '2018', '2019', '2020'], dtype='object')
for i in range(len(df_income)):
plt.figure()
#colors=['#FF8247','33FF66','g','b','y','r','EEAEEE','dda0dd','BBFFFF','63B8FF']
y=df_income.iloc[i,:]
y=y.sort_values()
x=y.index
plt.bar(x=x,height=y,label=u'年营业收入',color='#EEAEEE')
for x,y in zip(x,y):#显示bar数值
plt.text(x,y,'%.1e'%y,ha='center',va='bottom')
plt.xlabel(u'(公司)',fontsize=13)
plt.ylabel(u'年营业收入(元)',fontsize=13,rotation=90)
plt.legend(loc='best')
plt.title(u'十家半导体行业公司%s年营业收入的可视化'%index[i],fontsize=13)
plt.yticks(range(0,10**10,10**9))
plt.xticks(rotation=45)
plt.grid(True)
plt.show()
#股票时间序列图
fig=plt.figure(figsize=(10,100))
fig,axs=plt.subplots(constrained_layout=True)
ax1=plt.subplot(211)
x=df_income.index
ax1.plot(x,df_income[p[1]],label=p[1],color='b')
ax1.plot(x,df_income[p[0]],label=p[0],color='g')
ax1.plot(x,df_income[p[2]],label=p[2],color='y')
ax1.plot(x,df_income[p[8]],label=p[8],color='r')
ax1.plot(x,df_income[p[3]],label=p[3],color='#FF8247')
ax1.plot(x,df_income[p[4]],label=p[4],color='#EE82EE')
ax1.plot(x,df_income[p[5]],label=p[5],color='#9ACD32')
ax1.plot(x,df_income[p[6]],label=p[6],color='#006400')
ax1.plot(x,df_income[p[7]],label=p[7],color='#1E90FF')
ax1.plot(x,df_income[p[9]],label=p[9],color='#9400D3')
ax1.set_ylabel('年营业收入(元)')
ax1.set_xlabel('年份')
ax1.set_title('十家半导体行业公司年营业收入图')
ax1.legend(bbox_to_anchor=(0.5,-0.2),ncol=2)
plt.yticks(range(0,10**10,10**9),rotation=90)
plt.xticks(rotation=45)
ax1.grid(True,axis='both')
plt.show()
<Figure size 720x7200 with 0 Axes>
1、欧比特、台基股份、惠伦晶体、南大光电的营收额在十亿元以下,欧比特、台基股份、南大光电从2015年至2020年营收增幅分别约为124%、134%和396%,惠伦晶体2020年的营收却比2015年的减少了;
2、上海贝岭在2020年的营收额首次突破十亿元,与2016年的营收相比增幅为161%;
3、苏州固锝的营收额在2015-2019年缓慢增长,2020年跌幅约为2019年的9%;
4、士兰微、通富微电、华天科技为十家公司中近五年年平均营业额最高且较为稳定的公司,其中士兰微、通富微电的营收额增长迅速,华天科技营收额增长也较为迅速,但在2018年有一次较大的跌幅,营收额仅为2017年的11.5%,2020年的9.7%;
5、2020年排名前三的公司营收与后面公司出现脱节;
6、通富微电从2015年开始,营收不断接近华天科技并在2019年超越,且2020年远远超越华天科技。
现就南大光电、通富微电、华天科技三家公司进行一些分析。
import tushare as ts
import statsmodels.api as sm
import scipy.stats as ss
tushare_token = 'bcdc17f16d4ffd6b15202220afaf06376e1c606e6b016c60cce7728c'
pro = ts.pro_api(tushare_token)
c:\programdata\anaconda3\lib\site-packages\statsmodels\compat\pandas.py:49: FutureWarning: The Panel class is removed from pandas. Accessing it from the top-level namespace will also be removed in the next version data_klasses = (pandas.Series, pandas.DataFrame, pandas.Panel)
from datetime import datetime
l=['300346.SZ','002156.SZ','002185.SZ']
df1=pd.DataFrame(columns=l)
for i in range(len(l)):
df2 = pro.daily(ts_code=l[i], start_date='20150101', end_date='20211213')
df2['日期']=''
for b in range(len(df2)):
df2['日期'][[b]]=datetime.strptime(df2['trade_date'].iloc[b],'%Y%m%d')
df2=df2.sort_values(by='日期')
df2=df2.set_index(['日期'])
df1.iloc[:,i]=df2.iloc[:,5]
#导入沪深300数据
df2 = pd.read_excel(r"C:\Users\Administrator\Desktop\hs300_2010.xls")
df2=df2.set_index(['交易日期'])
df1=pd.concat([df1,df2.iloc[:,1]],axis=1)
df1=df1.rename(columns={'收盘指数':'hs300'})
#删去nan值
df1=df1.dropna()
print(df1)
C:\Users\Administrator\AppData\Roaming\Python\Python37\site-packages\ipykernel_launcher.py:8: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
300346.SZ 002156.SZ 002185.SZ hs300 2015-01-05 30.46 8.08 12.16 3641.541 2015-01-06 31.48 8.24 12.64 3641.059 2015-01-07 31.00 8.16 12.47 3643.790 2015-01-08 31.39 8.15 12.65 3559.259 2015-01-09 31.15 8.17 12.76 3546.723 ... ... ... ... ... 2021-12-07 50.22 20.16 13.18 4922.102 2021-12-08 51.17 20.31 13.32 4995.930 2021-12-09 51.51 20.30 13.48 5078.690 2021-12-10 51.28 20.34 13.40 5055.117 2021-12-13 51.24 20.45 13.31 5083.801 [1554 rows x 4 columns]
df1.corr()
300346.SZ | 002156.SZ | 002185.SZ | hs300 | |
---|---|---|---|---|
300346.SZ | 1.000000 | 0.605184 | 0.777750 | 0.550505 |
002156.SZ | 0.605184 | 1.000000 | 0.634805 | 0.754145 |
002185.SZ | 0.777750 | 0.634805 | 1.000000 | 0.405747 |
hs300 | 0.550505 | 0.754145 | 0.405747 | 1.000000 |
从上面可看出通富微电与HS300指数的相关性最强,也就是说通富微电股价会受到大盘走势的明显影响,南大光电次之,华天科技相对受影响最小;华天科技和南大光电的相关性也要比华天科技和南大光电分别和通富微电的相关性小。
li=['南大光电','通富微电','华天科技']
fig=plt.figure()
fig,axs=plt.subplots(constrained_layout=True)
ax1=plt.subplot(221)
ax1.plot(df1.index,df1[l[0]],label=li[0],color='b')
ax1.plot(df1.index,df1[l[1]],label=li[1],color='r')
ax1.plot(df1.index,df1[l[2]],label=li[2],color='#EE82EE')
ax1.set_ylabel('价格/元')
ax1.set_title('股票时间序列图')
ax1.legend(loc='best',bbox_to_anchor=(0.5,-0.2),ncol=2)
plt.yticks(rotation=90)
plt.xticks(rotation=45)
ax1.grid(True,axis='both')
plt.show()
<Figure size 432x288 with 0 Axes>
for sym in df1.columns:
print("\nResults for symbol %s" % sym)
print(30 * "-")
log_data = np.array(df1[sym].dropna())
print_statistics(log_data)
# print(scs.describe(log_data))
Results for symbol 300346.SZ ------------------------------ statistic value ------------------------------ size 1554.00000 min 8.47000 max 82.28000 mean 28.33124 std 13.37224 skew 0.66914 kurtosis 0.45536 Results for symbol 002156.SZ ------------------------------ statistic value ------------------------------ size 1554.00000 min 7.09000 max 33.30000 mean 15.17065 std 6.17889 skew 0.72187 kurtosis -0.79216 Results for symbol 002185.SZ ------------------------------ statistic value ------------------------------ size 1554.00000 min 3.73000 max 27.68000 mean 10.93397 std 4.44991 skew 0.26418 kurtosis -0.24459 Results for symbol hs300 ------------------------------ statistic value ------------------------------ size 1554.00000 min 2853.75600 max 5807.71900 mean 3974.64903 std 671.68578 skew 0.62386 kurtosis -0.68523
南大光电、通富微电、华天科技的股价均值为:28.33、15.17、10.93,南大光电、通富微电、华天科技在2021-12-13的股价分别为:51.24、20.45、13.31(单位:元/股),可认为三只股票当前价格偏高,如果有强力支撑股价上升则可以考虑买入,反之则要警惕股价有回落风险,且三只股票的标准差较大,即波动较大,风险承受能力低者谨慎买入。
def normfun(x, mu, sigma):
pdf = np.exp(-((x - mu) ** 2) / (2 * sigma ** 2)) / (sigma * np.sqrt(2 * np.pi))
return pdf
for i in range(3):
df1.iloc[:,i].plot.hist(bins=50,subplots=True)#可视化
mu =df1.iloc[:,i].mean()
sigma =df1.iloc[:,i].std()
x = np.arange(-0.04, 0.04, 0.001)
y=normfun(x, mu, sigma)
plt.plot(x, y)
plt.title(df1.columns[i])
plt.show()
#第二步——分析每种资产的统计量,包括峰度和偏度
def print_statistics(array):
"""
Prints selected statistics
:param array: object to generate statistic on
:return:
"""
sta = ss.describe(array)
print("%14s %15s" % ('statistic', 'value'))
print(30 * "-")
print("%14s %15.5f" % ('size', sta[0]))
print("%14s %15.5f" % ('min', sta[1][0]))
print("%14s %15.5f" % ('max', sta[1][1]))
print("%14s %15.5f" % ('mean', sta[2]))
print("%14s %15.5f" % ('std', np.sqrt(sta[3])))
print("%14s %15.5f" % ('skew', sta[4]))#偏度 =0正态 >0左偏 <0右偏
print("%14s %15.5f" % ('kurtosis', sta[5]))#峰度 =0正态 >0尖 <0平
# 通过 qq 图检查数据与正态分布的贴近程度
for i in range(3):
sm.qqplot(df1.iloc[:,i], line='s')
plt.grid(True)
plt.xlabel('theoretical quantiles')
plt.ylabel('sample quantiles')
plt.title(df1.columns[i]+'qq图')
plt.show()
红线表示y=x,即要求理想正态分布的分位数与实际对比,如图所示,三只股票的qq图左下角处偏离红线,因而认为其不服从正态分布。
import numpy.random as npr
for i in range(4):
df3=df1.iloc[:,i]
R1=np.log(df3/df3.shift(1))
R1=R1.dropna()
mu=R1.mean()*252
sigma=R1.std()*np.sqrt(252)
date=pd.date_range('2021-12-13','2022-06-13',freq='B')
N=len(date)
I=500
dt=1.0/252
mu=np.array(mu)
sigma=np.array(sigma)
S_GBM=np.zeros((N,I))
S_GBM[0]=df1.iloc[-1,i]
for t in range(1,N):
epsilon=npr.standard_normal(I)
S_GBM[t]=S_GBM[t-1]*np.exp((mu-0.5*sigma**2)*dt+sigma*epsilon*np.sqrt(dt))
df4=pd.DataFrame(S_GBM,index=date)
#可视化
plt.figure()
plt.plot(df4)
plt.xlabel(u'日期',fontsize=13)
plt.ylabel(u'%s价格'%df1.columns[i],fontsize=13,rotation=90)
plt.xticks(fontsize=13,rotation=45)
plt.yticks(fontsize=13)
plt.title(u'服从几何布朗运动的%s价格模拟全部路径(2021年12月-2022年6月)'%df1.columns[i],fontsize=13)
plt.grid(True)
plt.show()
plt.figure()
plt.plot(df4.iloc[:,0:10])
plt.xlabel(u'日期',fontsize=13)
plt.ylabel(u'%s价格'%df1.columns[i],fontsize=13,rotation=90)
plt.xticks(fontsize=13,rotation=45)
plt.yticks(fontsize=13)
plt.title(u'服从几何布朗运动的%s价格前十条路径(2021年12月-2022年6月)'%df1.columns[i],fontsize=13)
plt.grid(True)
plt.show()