一、课题研究背景与意义
有人把数据比喻为蕴藏能量的煤矿。煤炭按照性质有焦煤、无烟煤、肥煤、贫煤等分类,而露天煤矿、深山煤矿的挖掘成本又不一样。与此类似,大数据并不在“大”,而在于“有用”。价值含量、挖掘成本比数量更为重要。对于很多行业而言,如何利用这些大规模数据是赢得竞争的关键。在本文中,我们利用东方财富网上的股票数据作为我们的分析数据,对于过往的数据进行分析,为买家提供更多的信息和决策的依据。
股票的信息每秒钟都在发生变化,产生大量的数据。股票一直以来被认为是投机的行为。但是我们也可以从股票的一些信息数据中,发现其涨跌的规律。通过本次实验,我们想要发现影响股票的因素,以及投资那些股票可以获得较高的收益率,哪些因素可以反映股票是一支绩优股等。利用这些我们获取得到的信息,能够做出更加合理的决策。可以利用python平台,更加理性合理的分析股票涨跌的内在因素。用数据说话。
二、主题式网络爬虫设计方案
在本文中的数据集通过爬虫的方法,在东方财富网上的股票数据作为我们的分析数据。我们爬取的内容是东方财富网站上的股票数据。具体内容包括:。一些对于分析股票较为重要的内容。
整个系统主要由两大块组成:爬虫+可视化。首先我们会借助于python对于东方财富网站进行访问,并且爬取网页上关于股票的代码,名称,现价,动态市盈率,市净率,总市值,流通市值等信息。然后将所有的数据存入到excel表中进行统一的整合。爬虫部分就完成了,可视化的部分,是依托于python的matplotlib包进行,主要整合了现价,动态市盈率,市净率,总市值,流通市值的排名,还有现价和市净率之间是否存在线性关系进行了分析与讨论。
三、主题页面的结构特征分析
其网页如下图所示。可以看到在网站上,有股票的的名称,总市值等信息。的名字,这些详细的信息在后文中都会一一介绍,是如何爬取并且获得的。具体网页的代码,可以用开发者模式去看,有详细的CSS还有html代码,我们所要做的就是在这个代码中,获取到我们想要的信息。
四.基于python的股票数据可视化分析
1. 数据爬取与采集
在本文中,我们主要应用了python自带的urllib(urllib 库用于操作网页 URL,并对网页的内容进行抓取处理)和 BeautifulSoup这两个包进行爬取。其中Beautiful Soup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。
python2有urllib和urllib2两种模块,都用来实现网络请求的发送。python3将urllib和urllib2模块整合并命名为urllib模块。urllib模块有多个子模块,各有不同的功能:
①urllib.request模块:用于实现基本的http请求。
②urllib.error模块:用于异常处理。如在发送网络请求时出现错误,用该模块捕捉并处理。
Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,所有对象可以归纳为4种:Tag、NavigableString、BeautifulSoup、Comment
Tag就是 HTML 中的一个个标签;得到了标签的内容用 .string 即可获取标签内部的文字。BeautifulSoup 对象表示的是一个文档的全部内容.大部分时候,可以把它当作 Tag 对象,是一个特殊的 Tag,我们可以分别获取它的类型,名称。爬取出来的结果我们用print打印出来。
2. 对数据进行清洗和处理
我们采用的是isnull函数来判断是否含有空值,并且将含有空值的函数去除。
3. 数据分析与可视化
通过上一章获得了在excel中的股票数据,下面就对其中的一些数据之间的相关性进行分析。利用matplotlib库我们进行了现价排名前7的股票的分析。可以看到,古井贡酒的现价排名第一超过了250.,形成了断层的现象。紧随其后的是湖州老窖,长春高新等。股票玩家可以考虑买一些白酒类的股票。
剩余的几张图和上述代码没有很大的差别,因此没有列出代码,将图表进行一一的展示。下图是动态市盈率的排名。南华生物以超过5000的动态市盈率排在了第一位。
下面是对市净率进行分析,市净率,股价除以账面价值,可衡量该种股票的投资价值和投资风险。可以看到南华生物的市净率较高,因此不建议购入。
市场价格总值,可以市值的增加幅度或减少幅度来衡量该种股票发行公司的经营状况。可以看出排名前7的公司的市场价格总值非常不错。可以购入这几家的股票。
流通市值的排名中,美的集团的流通市值也是很高,因此在这些榜单中股票都可以考虑购入。
下面展示了现价和市净率的散点图,可以从图上粗略的看出,二者并没有很明显的线性关系。为了更加确定我们的结论,我们利用sklearn库中的线性回归函数进行求解。
可以从上述参数中看出,二者确实没有相似性的关系。
4. 数据持久化
将所有股票的数据放入到datalist中作为最终我们爬取出来的数据。
为了方便我们读取看到的datalist数据,我们将datalist变量存放在excel表格中。在这里用到的是python中的xlwt包,进行excel表格的创建和读写。其代码如下:
其中xlwt包是python专门用于读取xls文件结尾的excel。通过上述的操作,我们将从爬虫得到的数据表单成功的放到了excel中。其可视化如下:
源码
import requests
import xlwt #进行excel操作
import xlrd
import numpy as np
from sklearn import datasets, linear_model
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import cross_val_score
import sklearn.linear_model
import sklearn.datasets
import numpy as np
from sklearn.model_selection import train_test_split,cross_val_score
import matplotlib.pyplot as plt
from sklearn.metrics import mean_squared_error
url = 'http://27.push2.eastmoney.com/api/qt/clist/get'
datalist=[]
for i in range(1, 10):
data = {
'fields': 'f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f12,f13,f14,f15,f16,f17,f18,f20,f21,f23,f24,f25,f22,f11,f62,f128,f136,f115,f152',
'pz': 1000, # 每页条数
'pn': i, # 页码
'fs': 'm:0 t:6,m:0 t:80,m:1 t:2,m:1 t:23,m:0 t:81 s:2048'
}
response = requests.get(url, data)
response_json = response.json()
print(i, response_json)
# 返回数据为空时停止循环
if response_json['data'] is None:
break
for j, k in response_json['data']['diff'].items():
datas=[]
code = k['f12'] # 代码
name = k['f14'] # 名称
price = k['f2'] # 股价
pe = k['f9'] # 动态市盈率
pb = k['f23'] # 市净率
total_value = k['f20'] # 总市值
currency_value = k['f21'] # 流通市值
price = round(price/100, 2) # 价格转换为正确值(保留2位小数)
pe = round(pe/100, 2) # 市盈率转换为正确值(保留2位小数)
pb = round(pb/100, 2) # 市净率转换为正确值(保留2位小数)
total_value = round(total_value / 100000000, 2) # 总市值转换为亿元(保留2位小数)
currency_value = round(currency_value / 100000000, 2) # 流通市值转换为亿元(保留2位小数)
print('代码: %s, 名称: %s, 现价: %s, 动态市盈率: %s, 市净率: %s, 总市值: %s亿, 流通市值: %s'%(code,name,price,pe,pb,total_value,currency_value))
datas.append(code)
datas.append(name)
datas.append(price)
datas.append(pe)
datas.append(pb)
datas.append(total_value)
datas.append(currency_value)
datalist.append(datas)
print("save......")
book=xlwt.Workbook(encoding='utf-8',style_compression=0)
sheet=book.add_sheet('stockers',cell_overwrite_ok=True)
col=('代码',"名称","现价","动态市盈率","市净率","总市值","流通市值")
for i in range(0,7):
sheet.write(0,i,col[i])
for i in range(0,250):
print("第%d条"%i)
data=datalist[i]
for j in range(0,7):
sheet.write(i+1,j,data[j])
book.save(".\\stockers.xls")
###数据清洗
import pandas as pd
excel = pd.read_excel("stockers.xls") # 打开excel文件
# 1、是否存在空值
print(pd.isnull(excel.values))
excel=excel.dropna()
######
####数据可视化
import matplotlib.pyplot as plt
import numpy as np
#获取现价排名最高的前10名股票
sort_df = excel.sort_values(by="现价",ascending=[False])
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
index=sort_df ['名称'][:7]
values=sort_df ['现价'][:7]
plt.bar(index,values.values)
plt.title("现价排名")
# 设置x轴标签名
plt.xlabel("股票名称")
# 设置y轴标签名
plt.ylabel("现价")
# 显示
plt.show()
#获取现价排名最高的前10名股票
sort_df = excel.sort_values(by="动态市盈率",ascending=[False])
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
index=sort_df ['名称'][:7]
values=sort_df ['动态市盈率'][:7]
plt.bar(index,values.values,color="green")
plt.title("动态市盈率排名")
# 设置x轴标签名
plt.xlabel("股票名称")
# 设置y轴标签名
plt.ylabel("现价")
# 显示
plt.show()
sort_df = excel.sort_values(by="市净率",ascending=[False])
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
index=sort_df ['名称'][:7]
values=sort_df ['市净率'][:7]
plt.bar(index,values.values,color="red")
plt.title("市净率排名")
# 设置x轴标签名
plt.xlabel("股票名称")
# 设置y轴标签名
plt.ylabel("现价")
# 显示
plt.show()
sort_df = excel.sort_values(by="总市值",ascending=[False])
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
index=sort_df ['名称'][:7]
values=sort_df ['总市值'][:7]
plt.bar(index,values.values,color="pink")
plt.title("总市值排名")
# 设置x轴标签名
plt.xlabel("股票名称")
# 设置y轴标签名
plt.ylabel("现价")
# 显示
plt.show()
sort_df = excel.sort_values(by="流通市值",ascending=[False])
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
index=sort_df ['名称'][:7]
values=sort_df ['流通市值'][:7]
plt.bar(index,values.values,color="brown")
plt.title("流通市值排名")
# 设置x轴标签名
plt.xlabel("股票名称")
# 设置y轴标签名
plt.ylabel("现价")
# 显示
plt.show()
#250
n = 250
area = 20*np.arange(1, n+1)
# 5. 设置点的边界线宽度 【可选参数】
widths = np.arange(n)# 0-9的数字
x=excel["现价"]
y=excel["市净率"]
plt.scatter(x, y, s=area, linewidths=widths, alpha=0.5, marker='o')
# 7. 设置轴标签:xlabel、ylabel
#设置X轴标签
plt.xlabel('X坐标')
#设置Y轴标签
plt.ylabel('Y坐标')
# 8. 设置图标题:title
plt.title('test绘图函数')
# 9. 设置轴的上下限显示值:xlim、ylim
# 设置横轴的上下限值
plt.xlim(-100, 100)
# 设置纵轴的上下限值
plt.ylim(-100, 100)
# 10. 设置轴的刻度值:xticks、yticks
# 设置横轴精准刻度
plt.xticks(np.arange(np.min(x)-0.2, np.max(x)+0.2, step=0.3))
# 设置纵轴精准刻度
plt.yticks(np.arange(np.min(y)-0.2, np.max(y)+0.2, step=0.3))
# 也可按照xlim和ylim来设置
# 设置横轴精准刻度
plt.xticks(np.arange(-10,10 , step=0.5))
# 设置纵轴精准刻度
plt.yticks(np.arange(-10,10, step=0.5))
#
plt.scatter(x, y)
# 7. 设置轴标签:xlabel、ylabel
########计算相关系数
import numpy as np
pc = np.corrcoef(x, y)
x=excel["现价"]
y=excel["市净率"]
print(pc)
import pandas as pd
from numpy import mean
#相关系数计算公式
def R_Square(x,y):
p1=x2=y2=0.0
#计算平均值
x_=mean(x)
y_=mean(y)
#循环读取每个值,计算对应值的累和
for i in range(len(x)):
p1+=(x[i]-x_)*(y[i]-y_)
x2+=(x[i]-x_)**2
y2+=(y[i]-y_)**2
#print(p1,x2,y2)
#计算相关系数
r=p1/((x2** 0.5)*(y2** 0.5))
return r
#读取数据
df=pd.read_csv("data.csv",encoding='utf-8')
x=df['x'].tolist()
y=df['y'].tolist()
#调用并输出相关系数
print(R_Square(x,y))
######
x=np.array(x)
x=x.reshape(-1,1)
X_train,X_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)
# 创建一个线性模型对象
regr = linear_model.LinearRegression()
print('交叉检验的R^2: ',np.mean(cross_val_score(regr,x,y,cv=3)))
# 用训练集训练模型fit(x,y,sample_weight=None)sample_weight为数组形状
regr.fit(X_train, y_train)
#
# 用测试集做一个预测
y_pred = regr.predict(X_test)
# 估计系数a
print("估计系数a: ", regr.coef_)
# 模型截距b
print("模型截距b: ",regr.intercept_)
# 均方误差即E(y_test-y_pred)^2
print("均方误差: " ,mean_squared_error(y_test, y_pred))
# 决定系数r^2,越接近1越好
print("决定系数R^2: " ,r2_score(y_test, y_pred))
#对比不同的划分系数
X_train,X_test,y_train,y_test=train_test_split(x,y,test_size=0.1,random_state=0)
# 创建一个线性模型对象
regr = linear_model.LinearRegression()
print('交叉检验的R^2: ',np.mean(cross_val_score(regr,x,y,cv=3)))
# 用训练集训练模型fit(x,y,sample_weight=None)sample_weight为数组形状
regr.fit(X_train, y_train)
#
# 用测试集做一个预测
y_pred = regr.predict(X_test)
# 估计系数a
print("估计系数a: ", regr.coef_)
# 模型截距b
print("模型截距b: ",regr.intercept_)
# 均方误差即E(y_test-y_pred)^2
print("均方误差: " ,mean_squared_error(y_test, y_pred))
# 决定系数r^2,越接近1越好
print("决定系数R^2: " ,r2_score(y_test, y_pred))
X_train,X_test,y_train,y_test=train_test_split(x,y,test_size=0.2,random_state=0)
# 创建一个线性模型对象
regr = linear_model.LinearRegression()
print('交叉检验的R^2: ',np.mean(cross_val_score(regr,x,y,cv=3)))
# 用训练集训练模型fit(x,y,sample_weight=None)sample_weight为数组形状
regr.fit(X_train, y_train)
#
# 用测试集做一个预测
y_pred = regr.predict(X_test)
# 估计系数a
print("估计系数a: ", regr.coef_)
# 模型截距b
print("模型截距b: ",regr.intercept_)
# 均方误差即E(y_test-y_pred)^2
print("均方误差: " ,mean_squared_error(y_test, y_pred))
# 决定系数r^2,越接近1越好
print("决定系数R^2: " ,r2_score(y_test, y_pred))
总结
通过python的爬虫,在本文中成功的爬取了股票信息,利用了python中的urllib库,bs4,pandas等包。将股票信息进行爬取,然后存储到excel中。再用数据分析方法。
通过这次的系统的构建,对于python爬虫整体的构建有了深刻的理解,对于整个爬虫的流程也更加的熟练。首先先要确定我们所要爬取的网址,然后要模拟浏览器头部信息,向豆瓣服务器发送请求,不能暴露我们是借由python去爬虫。封装好之后获得我们请求。通过bs4里面的beautifulsoup作为我们的封装。通过正则表达式,我们从爬取的众多的信息中获取到我们需要的信息.也借此机会深刻的认识了正则表达式和正则表达式的用法。最后再用xlwt将我们的数据读取到excel中,用到了xlwt包。
标签:sort,plt,python,excel,爬虫,爬取,test,values,print From: https://www.cnblogs.com/cyywork/p/16996224.html