1、先将下载链接分别提取出来,保存到文件‘新能源行业.csv’

In [ ]:
import re
import pandas as pd
import openpyxl
import os

os.chdir(r"/Users/caizuguang/Desktop/final_data")


xlsx = '新能源行业.xlsx'

df = pd.read_excel(xlsx)

exf = openpyxl.load_workbook(xlsx) #
sheet = exf.active #第一个表默认为extive
C2 = sheet['C2'] #c列的第3行
C = sheet['C'] #c列

links = [c.value for c in C]

links_1 = links[1:-1]
links_2 = ''.join(links_1)
#sample = 

p = re.compile('"(.*?)","(.*?)"')
list_of_tuple = p.findall(links_2)


df2 = pd.DataFrame({'link':[t[0] for t in list_of_tuple],
                    'f_name':[t[1]for t in list_of_tuple]})

df2.to_csv('新能源行业.csv')

2、筛选出所需的最新的年报链接

In [29]:
import pandas as pd
import re
import requests
import os 
import time

os.chdir(r"/Users/caizuguang/Desktop/final_data")


df = pd.read_csv('新能源行业.csv')

#p = re.compile('(?<=\d{4}(年报)|(年年报)')


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(['摘要','审计','财务'],df, False)

df_orig = filter_links(['(','('], df_all,include=False)
df_updt = filter_links(['(','('], df_all,include=True)

def sub_with_update(df_updt,df_orig):
    index_orig = []#;i =0
    index_updt =[]#;j = 0
    for i, f in enumerate(df_orig.f_name):#返回他的下角标,以及值
        for j, fn in enumerate(df_updt.f_name):
            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]
        df_orig.iloc[i,-1] = df_updt.iloc[j,-1]
    return(df_orig)
df_newest = sub_with_update(df_updt,df_orig)     

df_newest.sort_values(by = ['f_name'],
                     inplace = True,
                     ignore_index = True)  

df_newest['公司简称'] = df_newest['f_name'].str[:4]

counts = df_newest['公司简称'].value_counts()

ten_company = []

for cn in counts.index[:10]:
    ten_company.append(filter_links([cn],df_newest))
    
if not os.path.exists('10companies'):
    os.makedirs('10companies')
    #os.chdir(r"/Users/caizuguang/Desktop/finacedata/10companies")

for df_com in ten_company:
    cn = df_com['公司简称'].iloc[0]
    df_com.to_csv('%s.csv' %cn )
<ipython-input-29-c1bccdbff21d>:55: 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.sort_values(by = ['f_name'],
<ipython-input-29-c1bccdbff21d>:59: 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
  df_newest['公司简称'] = df_newest['f_name'].str[:4]

将提取的下载链接下载所需的年报

In [ ]:
import pandas as pd
import re
import requests
import os 
import time

os.chdir(r"/Users/caizuguang/Desktop/final_data/10companies")
file_1 = os.listdir() 
#file_1中含有要下载的链接
file_1.remove(file_1[2]) 

links = []
f_names = [] 


for file_2 in file_1:
    file_3 = pd.read_csv(file_2)
    for link in file_3['link']:
        links.append(link)
    for f_name in file_3['f_name']:
        f_names.append(f_name)

#links = df['link'];f_names = df['f_name']

url = 'http://news.windin.com/ns/bulletin.php?code=818C2D61C901&id=124505628&type=1'

def get_PDF_url(url):
    r = requests.get(url); r.encoding = 'utf-8'; html = r.text
    r.close()# 已获取html内容,结束connection
    p = re.compile('<a href=(.*?)\s.*?>(.*?)</a>',re.DOTALL)
    a = p.search(html) #因为第一个<a>即是目标标签,故用search
    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 link in links:
    href,fname = get_PDF_url(link)
    r = requests.get(href,allow_redirects = True)
    open('%s'%fname,'wb').write(r.content)
    time.sleep(10)
r.close()



href ,fname = get_PDF_url(links[0])

r = requests.get(href, allow_redirects = True)
open('%s' %fname,'wh').write(r.content)
In [41]:
import pandas as pd
import re
import requests
import os 
import time

os.chdir(r"/Users/caizuguang/Desktop/final_data/10companies")
file_1 = os.listdir() 
links = []
f_names = [] 


for file_2 in file_1:
    file_3 = pd.read_csv(file_2)
    for link in file_3['link']:
        links.append(link)
    for f_name in file_3['f_name']:
        f_names.append(f_name)
Out[41]:
['格林美:.csv',
 '冰轮环境.csv',
 '.DS_Store',
 '鹏辉能源.csv',
 '国轩高科.csv',
 '雪人股份.csv',
 '亿纬锂能.csv',
 '嘉化能源.csv',
 '大洋电机.csv',
 '英可瑞:.csv',
 '容百科技.csv']

下载的年报如下

In [28]:
import pandas as pd
import re
import requests
import os 
import time

os.chdir(r"/Users/caizuguang/Desktop/final_data/10companies")
file_1 = os.listdir() 
#file_1中含有要下载的链接
file_1.remove(file_1[2]) 

links = []
f_names = [] 

for file_2 in file_1:
    file_3 = pd.read_csv(file_2)
    for link in file_3['link']:
        links.append(link)
    for f_name in file_3['f_name']:
        f_names.append(f_name)
f_names
Out[28]:
['格林美:2019年年度报告',
 '格林美:2019年年度报告',
 '格林美:2020年年度报告',
 '冰轮环境:2019年年度报告',
 '冰轮环境:2020年年度报告',
 '鹏辉能源:2019年年度报告',
 '鹏辉能源:2020年年度报告',
 '国轩高科:2019年年度报告',
 '国轩高科:2019年年度报告',
 '国轩高科:2020年年度报告',
 '雪人股份:2019年年度报告',
 '雪人股份:2020年年度报告',
 '亿纬锂能:2019年年度报告',
 '亿纬锂能:2020年年度报告',
 '嘉化能源:2019年年度报告',
 '嘉化能源:2020年年度报告',
 '大洋电机:2019年年度报告',
 '大洋电机:2019年年度报告',
 '大洋电机:2020年年度报告',
 '英可瑞:2019年年度报告',
 '英可瑞:2020年年度报告',
 '容百科技:2019年年度报告',
 '容百科技:2020年年度报告']

pdf解析不出来,故从wind下载了新能源相关数据,进行分析

以下数据是以万得编制的新能源行业指数【 新能源 (000941.CSI)】为基础进行分析的

1.成分及权重分析

In [14]:
import tushare as ts
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime
import matplotlib.dates as mdate
import os

os.chdir('/Users/caizuguang/Desktop/新能源行业分析')
new_energy = pd.read_excel('新能源行业数据.xlsx',index_col = 0).dropna(axis =1)
new_energy.head(10)# 查看前10行的数据 12月31日数据
Out[14]:
简称 收盘价 涨跌 涨跌幅 成交量(万) 成交额(万) 总股本(亿) 自由流通股本(亿) 总市值(亿) 自由流通市值(亿) 上市板 市盈率-TTM 中信三级行业
代码
300750.SZ 宁德时代 588.00 -2.00 -0.34 937.11 554040.89 23.31 12.44 13705.41 7315.02 创业板 137.36 锂电池
601012.SH 隆基股份 86.20 4.97 6.12 12137.72 1042052.59 54.13 39.47 4665.97 3402.73 上证主板 47.85 太阳能
300014.SZ 亿纬锂能 118.18 -0.15 -0.13 2107.01 247725.57 18.98 12.31 2243.35 1454.73 创业板 76.78 锂电池
300274.SZ 阳光电源 145.80 4.83 3.43 2389.02 354085.75 14.85 9.29 2165.44 1353.79 创业板 95.66 太阳能
002812.SZ 恩捷股份 250.40 -4.49 -1.76 592.16 149220.69 8.92 4.68 2234.59 1173.09 深证主板 100.32 锂电化学品
600438.SH 通威股份 44.96 2.86 6.79 10509.43 472749.11 45.02 25.28 2023.90 1136.38 上证主板 32.54 太阳能
002129.SZ 中环股份 41.75 1.21 2.98 5676.29 237761.42 32.32 21.27 1349.25 888.21 深证主板 44.91 太阳能
002709.SZ 天赐材料 114.65 -1.70 -1.46 1356.67 157361.85 9.60 8.15 1100.44 934.60 深证主板 70.17 锂电化学品
300450.SZ 先导智能 74.37 0.17 0.23 954.09 71187.52 15.64 6.17 1162.99 459.07 创业板 102.76 锂电设备
601877.SH 正泰电器 53.89 4.13 8.30 4720.35 249071.22 21.50 10.10 1158.62 544.55 上证主板 18.82 配电设备

1.对新能源行业中起上市板、中信三级行业分别进行统计并可视化,代码及展示如下:

In [27]:
df0 = new_energy['中信三级行业'].value_counts()
df0 = pd.DataFrame(df0)
df0
Out[27]:
中信三级行业
太阳能 9
风电 9
锂电化学品 6
锂电池 5
光伏设备 4
镍钴锡锑 2
其他发电 2
输变电设备 2
基础件 2
消费电子设备 1
锂电设备 1
配电设备 1
玻璃纤维 1
核电 1
1
1
消费电子组件 1
玻璃 1
In [74]:
plt.figure(figsize = (12,6))
plt.bar(df0.index,df0['中信三级行业'])
plt.title('新能源行业细分行业统计',fontsize = 12)
plt.xticks(rotation =30)

for  x, y in enumerate(df0['中信三级行业']):# 将数据值标注在柱形上方
    plt.text(x, y+0.05, y, ha='center', fontsize=10)  # 比y值高0.03的位置
plt.xlabel('中信三级行业', fontsize = 16,color = 'r')  
plt.ylabel('数量',fontsize = 16, color = 'r')

plt.show()

从以上图中可以看到,新能源下游产业数量较多,太阳能、风能各占9家,其他细分行业也如上图展示。

2、新能源行业上市板统计:

In [52]:
df1 = new_energy['上市板'].value_counts()
df1 = pd.DataFrame(df1)
df1
Out[52]:
上市板
上证主板 18
创业板 17
深证主板 11
科创板 4
In [71]:
plt.pie(df1['上市板'],labels = df1.index,autopct="%0.2f%%")

plt.show()

我们从上图可以看到,该指数的上市公司上市板所占比例如上图,符合常识:上证主板上市最多。

2.指数数据分析

In [140]:
import tushare as ts
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime
import matplotlib.dates as mdate
import os

os.chdir('/Users/caizuguang/Desktop/新能源行业分析')
new_energy_index = pd.read_excel('指数数据.xlsx',index_col= 0 ).dropna(axis =1)
new_energy_index.head(10)# 查看前10行的数据 12月31日数据
Out[140]:
开盘点位 最高点位 最低点位 收盘价 涨跌 涨跌幅(%) 开始日累计涨跌 开始日累计涨跌幅 成交量(万股) 成交额(万)
交易日期
2021-12-30 4221.86 4284.71 4212.12 4232.03 11.94 0.28 2727.55 181.30 150316.29 5670569.10
2021-12-29 4233.20 4270.58 4191.71 4220.09 -14.81 -0.35 2715.61 180.50 161362.16 5959770.17
2021-12-28 4128.28 4238.96 4115.68 4234.90 106.28 2.57 2730.42 181.49 164965.47 6087643.17
2021-12-27 4109.79 4184.02 4086.55 4128.62 7.27 0.18 2624.14 174.42 196613.74 5745435.97
2021-12-24 4301.33 4306.00 4094.67 4121.35 -171.77 -4.00 2616.87 173.94 260181.50 7863583.48
2021-12-23 4272.48 4313.68 4245.71 4293.11 32.47 0.76 2788.64 185.36 210717.42 5827442.17
2021-12-22 4271.27 4287.06 4238.83 4260.65 14.16 0.33 2756.17 183.20 128329.75 4722292.64
2021-12-21 4244.91 4279.93 4176.09 4246.49 -1.91 -0.04 2742.01 182.26 148620.31 5962393.89
2021-12-20 4415.27 4429.52 4233.77 4248.40 -198.35 -4.46 2743.92 182.38 209743.03 7963467.82
2021-12-17 4548.94 4554.46 4438.57 4446.75 -130.01 -2.84 2942.27 195.57 211362.35 6951460.95
In [ ]:
以收盘价为准绘制其历年走势图用以反映新能源行业发展情况
In [141]:
#转换为时间序列
new_energy_index.index = pd.to_datetime(new_energy_index.index)
In [152]:
plt.figure(figsize = (10,5))
plt.title(u'新能源 (000941.CSI)走势图')
plt.plot(new_energy_index['收盘价'], lw=2,label = '收盘价',color = 'r')
plt.xticks(fontsize = 13 ,rotation =30)
plt.xlabel(u'日期',fontsize = 13)
plt.ylabel(u'收盘价',fontsize = 13,rotation = 90)
plt.legend()
plt.grid()
plt.show()

都说股市时经济的晴雨表,我们可以看到近来新能源行业发展迅速。

以下是现金分红统计分析

In [164]:
import tushare as ts
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import datetime
import matplotlib.dates as mdate
import os

os.chdir('/Users/caizuguang/Desktop/新能源行业分析')
profit_share= pd.read_excel('现金分红统计.xlsx',index_col= 0 ).dropna()
In [165]:
profit_share
Out[165]:
归母净利润(亿)\n 现金分红总额(亿元)\n 股息支付率\n 分红公司数量\n
年度
2020 679.78 195.35 28.74% 33
2019 445.77 129.91 29.14% 40
2018 501.38 154.64 30.84% 42
2017 465.52 145.93 31.35% 42
2016 402.12 118.97 29.59% 42
2015 258.38 90.17 34.90% 34
2014 188.33 76.86 40.81% 33
2013 62.08 20.87 33.62% 12
2012 -25.81 10.38 -40.22% 8
2011 70.85 18.05 25.48% 11
2010 74.90 24.60 32.84% 12
2009 34.52 3.09 8.96% 9
In [180]:
plt.figure(figsize = (10,6))
plt.title(u'历年现金分红')
profit_share['现金分红总额(亿元)\n'].plot(color = 'y')
plt.bar(profit_share.index,profit_share['现金分红总额(亿元)\n'])
plt.ylabel('亿元',fontsize = 13)

plt.show()

基本上历年现金分红越来越高