蒋奕涵的期末报告

解读

由“各公司10年来营业收入图”可知,海油工程公司营业收入波动性极大,在2022年其营业收入达到最低点。 剩余一些股票波动性很小,基本维持一种稳定状态。但海油发展自发行后营业收入便遥遥领先。其中,海油 工程的营业收入本来远远高于其他公司,但自2020年后,该公司受到某一刺激后,营业收入急剧下降,跌入 谷底。而宏大爆破和金诚信的营业收入基本没有什么变化。

由“各公司10基本每股收益”可知,基本每股收益整体波动性较大,呈现下降趋势。但2022年与2012年相比 较,我们发现,其每股收益基本没有变化,可见,疫情下的股市逐渐恢复稳定。与上图相对应,基本每股收益 与营业收入的波动性往往同向变化,海油工程的每股收益波动性较其他股票波动性强。

结果

结果截图 结果截图 结果截图 结果截图 结果截图 结果截图 结果截图 结果截图 结果截图 结果截图 结果截图 结果截图

代码一



import json
import os
from time import sleep
from urllib import parse
import requests
import time
import random
from fake_useragent import UserAgent

ua = UserAgent()
userAgen = ua.random

def get_adress(bank_name):
    url = "http://www.cninfo.com.cn/new/information/topSearch/detailOfQuery"
    data = {
        'keyWord': bank_name,
        'maxSecNum': 10,
        'maxListNum': 5,
    }
    hd = {
        'Host': 'www.cninfo.com.cn',
        'Origin': 'http://www.cninfo.com.cn',
        'Pragma': 'no-cache',
        'Accept-Encoding': 'gzip,deflate',
        'Connection': 'keep-alive',
        'Content-Length': '70',
        'User-Agent': userAgen,
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Accept': 'application/json,text/plain,*/*',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    }
    get_json = requests.post(url, headers=hd, data=data)
    data_json = get_json.content
    toStr = str(data_json, encoding="utf-8")
    last_json = json.loads(toStr)
    orgId = last_json["keyBoardList"][0]["orgId"]  # 获取参数
    plate = last_json["keyBoardList"][0]["plate"]
    code = last_json["keyBoardList"][0]["code"]
    return orgId, plate, code

def download_PDF(url, file_name):  # 下载pdf
    url = url
    r = requests.get(url)
    f = open(company + "/" + file_name + ".pdf", "wb")
    f.write(r.content)
    f.close()

def get_PDF(orgId, plate, code):
    url = "http://www.cninfo.com.cn/new/hisAnnouncement/query"
    data = {
        'stock': '{},{}'.format(code, orgId),
        'tabName': 'fulltext',
        'pageSize': 20,
        'pageNum': 1,
        'column': plate,
        'category': 'category_ndbg_szsh;',
        'plate': '',
        'seDate': '',
        'searchkey': '',
        'secid': '',
        'sortName': '',
        'sortType': '',
        'isHLtitle': 'true',
    }

    hd = {
        'Host': 'www.cninfo.com.cn',
        'Origin': 'http://www.cninfo.com.cn',
        'Pragma': 'no-cache',
        'Accept-Encoding': 'gzip,deflate',
        'Connection': 'keep-alive',
        'User-Agent': ua.random,
        'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
        'Accept': 'application/json,text/plain,*/*',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
        'X-Requested-With': 'XMLHttpRequest',
    }
    data = parse.urlencode(data)
    data_json = requests.post(url, headers=hd, data=data)
    toStr = str(data_json.content, encoding="utf-8")
    last_json = json.loads(toStr)
    reports_list = last_json['announcements']
    for report in reports_list:
        if '摘要' in report['announcementTitle'] or "20" not in report['announcementTitle']:
            continue
        if 'H' in report['announcementTitle']:
            continue
        else:  # http://static.cninfo.com.cn/finalpage/2019-03-29/1205958883.PDF
            pdf_url = "http://static.cninfo.com.cn/" + report['adjunctUrl']
            file_name = report['announcementTitle']
            print("正在下载:" + pdf_url, "存放在当前目录:/" + company + "/" + file_name)
            download_PDF(pdf_url, file_name)
            time.sleep(random.random()*3)

if __name__ == '__main__':
    list = ["002207","002554","002629","002683","002828","300084","300157","300164","300191","600339","600583","600871",
            "600968","601808","603619","603727","603979"]
    for company in list:
        os.mkdir(company)
        orgId, plate, code = get_adress(company)
        get_PDF(orgId, plate, code)
        print("下载成功")



结果一

结果截图 结果截图

解释一

将所分配的公司的年报从网站上爬取下来.

代码二



  import pdfplumber

import os
import pandas as pd
import pdfplumber

def getfns(path,suffix):
    res=[os.path.join(path,fname) for fname in os.listdir(path) if fname.endswith(suffix)]
    return res

paths = ['E:/系统/桌面/作业/002207', 'E:/系统/桌面/作业/002554','E:/系统/桌面/作业/002629','E:/系统/桌面/作业/002683','E:/系统/桌面/作业/002828','E:/系统/桌面/作业/300084','E:/系统/桌面/作业/300157','E:/系统/桌面/作业/300164','E:/系统/桌面/作业/300191','E:/系统/桌面/作业/600339','E:/系统/桌面/作业/600583','E:/系统/桌面/作业/600871','E:/系统/桌面/作业/600968','E:/系统/桌面/作业/601808','E:/系统/桌面/作业/603619','E:/系统/桌面/作业/603727','E:/系统/桌面/作业/603979']  # 文件夹路径列表
suffix = '.pdf'

def f1(lst):  # get c1
    c1 = [e[0] for e in lst]
    return c1

def f2(lst):  # get c1 and c2
    c12 = [e[:2] for e in lst]
    c6 = d[5]
    return c12

for path in paths:
    company_code = os.path.basename(path)
    fns = getfns(path,'.pdf')
    for e in fns:
        if '更新' not in e:
            with pdfplumber.open(e) as pdf:
                for page in pdf.pages:
                    d = page.extract_table()
                    if d is not None:
                        c1 = f1(d)
                        if '' == c1[0] and '营业收入(元)' in c1 and '基本每股收益(元/股)' in c1:
                            c12 = f2(d)
                            print(c12[0][1], c12[1][1])
                            for c in c12:
                                if c[0] == '基本每股收益(元/股)':
                                    print(c[1])
                                    data = {
                                        '年份': c12[0][1],
                                        '营业收入(元)': c12[1][1],
                                        '基本每股收益(元/股)': c[1],
                                        '股票代码': company_code,
                                        '办公地址': c12[10],
                                        '公司网址': c12[12],
                                    }
                                    df = pd.DataFrame([data])
                                    df.to_csv('数据.csv', index=False, mode='a', header=not os.path.exists('数据.csv'))
                            break  # 添加注释,结束循环
          
          
          

结果二

结果截图 结果截图 结果截图 结果截图 结果截图

解释二

此代码并不会生成文件,因为文件数据比较少。因此用代码来做辅助,然后直接把数据整理至文件“数据.csv”中。

代码三


      
                     import pandas as pd
from collections import Counter
from matplotlib import pyplot as plt

data = pd.read_csv("数据.csv")

map_data = dict(Counter(data['股票简称']))
print(map_data)
print("=========================================================")
print("共有{}家公司".format(len(map_data)))

data["营业收入(元)"] = [i.replace(",", "") for i in data["营业收入(元)"]]
data["营业收入(元)"] = data["营业收入(元)"].astype("float")
data["基本每股收益(元/股)"] = data["基本每股收益(元/股)"].astype("float")

top_10 = data.groupby("股票简称").sum().sort_values("营业收入(元)", ascending=False)["营业收入(元)"][0:10]
print(top_10)

import pandas as pd
from collections import Counter
from matplotlib import pyplot as plt
import os

data = pd.read_csv("数据.csv")

map_data = dict(Counter(data['股票简称']))
print(map_data)
print("=========================================================")
print("共有{}家公司".format(len(map_data)))

data["营业收入(元)"] = [i.replace(",", "") for i in data["营业收入(元)"]]
data["营业收入(元)"] = data["营业收入(元)"].astype("float")
data["基本每股收益(元/股)"] = data["基本每股收益(元/股)"].astype("float")

top_10 = data.groupby("股票简称").sum().sort_values("营业收入(元)", ascending=False)["营业收入(元)"][0:10]
print(top_10.index.tolist())

year = dict(Counter(data['年份']))
year_list = [int(i) for i in year.keys()]
year_list.sort()
print(year_list)

plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
plt.rcParams['axes.unicode_minus'] = False # 显示负号

for name in top_10.index.tolist():
    plt.figure(figsize=(13,8)) # 每家公司单独绘制一张图
    plt.rcParams['lines.linestyle']='--' # 线条显示形式
    
    temp = data[data['股票简称'] == name] # 获取某家公司的数据
    
    plt.bar(temp['年份'], temp['营业收入(元)'], label="营业收入(元)") # 绘制营业收入柱状图
    plt.plot(temp['年份'], temp['基本每股收益(元/股)'], label="基本每股收益(元/股)", marker='o') # 绘制基本每股收益折线图
    
    plt.title(name) # 添加图标题
    plt.xlabel('年份') # 添加x轴标签
    plt.ylabel('金额(亿)') # 添加y轴标签
    
    ax2 = plt.gca().twinx() # 添加副坐标轴
    ax2.set_ylabel('基本每股收益(元/股)') # 设置副坐标轴y轴标签
    ax2.set_ylim((temp["基本每股收益(元/股)"].min(), temp["基本每股收益(元/股)"].max())) # 设置副坐标轴y轴范围
    plt.yticks(temp["基本每股收益(元/股)"].unique()) # 设置副坐标轴刻度标签
    
    plt.legend(fontsize=12) # 添加图例,并调整字体大小
    plt.grid(linestyle='--') # 添加网格线
    
    # 自动保存图片到文件夹中
    if not os.path.exists('公司图片'):
        os.makedirs('公司图片')
    plt.savefig('公司图片/{}.png'.format(name))
    
    plt.show() # 显示图像

    import pandas as pd
import matplotlib.pyplot as plt
import os

# 设置字体为SimHei显示中文
import matplotlib as mpl
mpl.rcParams['font.family'] = 'SimHei'
mpl.rcParams['axes.unicode_minus'] = False

data = pd.read_csv("数据.csv", dtype={"营业收入(元)": float}, thousands=',', na_values=['--'])

# 获取所有公司名称和年份范围
company_names = sorted(set(data['股票简称']))
year_range = range(2013, 2023)

# 绘制营业收入对比折线图
plt.figure(figsize=(12, 8))
plt.title('营业收入对比折线图')
plt.xlabel('年份')
plt.ylabel('营业收入(亿)')
plt.grid(linestyle='--')

for company in company_names:
    company_data = data[data['股票简称'] == company]
    if len(company_data) == 0:
        continue

    # 将y轴数据的长度设置为10
    y_data = company_data['营业收入(元)'].tolist()
    if len(y_data) < 10:
        y_data = [None] * (10 - len(y_data)) + y_data

    # 绘制折线图
    plt.plot(year_range, y_data, label=company)

# 设置x轴刻度标签
plt.xticks(year_range)

# 添加图例
plt.legend(loc='best')

# 自动保存图片到文件夹中
if not os.path.exists('营业收入对比图片'):
    os.makedirs('营业收入对比图片')
plt.savefig('营业收入对比图片/营业收入对比折线图.png')

plt.show()

# 绘制基本每股收益对比折线图
plt.figure(figsize=(12, 8))
plt.title('基本每股收益对比折线图')
plt.xlabel('年份')
plt.ylabel('基本每股收益(元/股)')
plt.grid(linestyle='--')

for company in company_names:
    company_data = data[data['股票简称'] == company]
    if len(company_data) == 0:
        continue

    # 将y轴数据的长度设置为10
    y_data = company_data['基本每股收益(元/股)'].tolist()
    if len(y_data) < 10:
        y_data = [None] * (10 - len(y_data)) + y_data

    # 绘制折线图
    plt.plot(year_range, y_data, label=company)

# 设置x轴刻度标签
plt.xticks(year_range)

# 添加图例
plt.legend(loc='best')

# 自动保存图片到文件夹中
if not os.path.exists('基本每股收益对比图片'):
    os.makedirs('基本每股收益对比图片')
plt.savefig('基本每股收益对比图片/基本每股收益对比折线图.png')

plt.show()


结果三

结果截图 结果截图 结果截图 结果截图 结果截图 结果截图 结果截图 结果截图 结果截图 结果截图 结果截图 结果截图