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()