python+matplotlib+pandas股票爬虫可视化
最后更新时间:2020/8/6
更新说明:修复pandas read_excel方法,去掉官方已删除参数,给出源码
1. 功能点
股票数据爬虫数据源股城网,重心放在多支股票的概览信息上【未放在单只股票历史数据的分析与可视化,这一点也值得去做】;
绘图用matplotlib,涉及饼图、柱状图、雷达图的设计、实现和优化,值得参考;
源码仓库
stock_spider
-
- 可以获取股票数据保存至excel文件
-
- 股票的爬取与展示
-
- 股票信息的可视化
-
- 股票信息文件的删除
2. 业务分析
首先是数据源的获取,从股城网股票代码一览表获取,我们打开网页,源码模式观察,股票代码从href中获取
然后进入每支股票的详情页面爬取当日信息:
待爬取的位置:
3. 代码设计说明
采用console中提示菜单的方式贯通整个操作过程,简约高效;
表格处理使用pandas库;
作图matplotlib,涉及饼图、柱状图、雷达图及各种图的优化;
计时器是封装好的常用的装饰器;
4. 绘图代码说明
4.1. 饼图
def draw_pie():
'''多支股票进行对比——饼图 '''
df = read_excel() # 读取数据
# 根据 振幅 列排序 ascending:默认True升序排列;False降序排列
df = df.sort_values(by="振幅", axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')
print(df)
print("股票根据【振幅】做过排序!")
stock_names = df["股票名称"].tolist()
stock_sum_values = [float(x.split("亿")[0]) for x in df["总市值"].tolist()]
# 计算各数据占比
data = [x / sum(stock_sum_values) for x in stock_sum_values]
# 设置绘图的主题风格(不妨使用R中的ggplot分隔)
plt.style.use('ggplot')
explode = []
for i in range(len(stock_names)):
if i == 0:
explode.append(0.1) # 用于突出显示某一扇形,此时将前三位位凸显
elif i == 1:
explode.append(0.1)
elif i == 2:
explode.append(0.1)
else:
explode.append(0)
# 颜色映射
cmap = plt.cm.prism
colors = cmap(np.linspace(0., 1., len(stock_names)))
# 横纵坐标轴标准化处理,使饼图是正圆
plt.axes(aspect='equal')
# 控制x轴和y轴的范围
plt.xlim(0, 6)
plt.ylim(0, 6)
# 自定义半径
radius = 1 # 不小于1
pctdistance = radius - 0.4
labeldistance = radius + 0.1
# 绘制饼图
plt.pie(x=data, # 绘图数据
explode=explode, # 突出显示设置
labels=stock_names, # 添加各扇形区域标签
colors=colors, # 设置饼图的自定义填充色
autopct='%.1f%%', # 设置百分比的格式,这里保留一位小数
pctdistance=pctdistance, # 设置百分比标签与圆心的距离
labeldistance=labeldistance, # 设置各扇形标签与圆心的距离
startangle=180, # 设置饼图的初始角度
radius=radius, # 设置饼图的半径
counterclock=False, # 是否逆时针,这里设置为顺时针方向
wedgeprops={
'linewidth': 1, 'edgecolor': 'w'}, # 设置饼图内外边界的属性值
textprops={
'fontsize': 10, 'color': 'k'}, # 设置文本标签的属性值
center=(1.8, 1.8), # 设置饼图的原点
# frame=2 # 是否显示饼图的图框,此处设置不显示
)
# 删除x轴和y轴的刻度
plt.xticks(())
plt.yticks(())
# 添加图标题
plt.title("多支股票总市值对比分布饼图")
# 图例
plt.legend(loc="lower left", fontsize=10, bbox_to_anchor=(-.3, .05))
# 显示图形
plt.show()
4.2. 柱状图
def draw_histogram():
'''根据多支股票绘制【股票名称】——【最高】柱状图 '''
df = read_excel() # 读取数据
x = df["股票名称"]
y = df["最高"]
# 绘制折线图
plt.bar(x, y, color='darkcyan', align='center')
# 设置横坐标显示角度,角度是逆时针
plt.xticks(rotation=-55)
# 添加标题
plt.title("股票可视化——柱状图")
plt.ylabel("最高")
plt.xlabel("股票名称")
# 自动调整子图参数适应大小
plt.tight_layout()
# 图例
plt.legend(["最高"], loc="upper right", fontsize=10)
# 添加数值标签
for x, y in enumerate(y):
plt.text(x, y, '%s' % round(y, 1), ha='center')
plt.show()
4.3. 雷达图
def draw_radar():
'''根据多支股票绘制 最高、最低、今开、昨收、涨停、跌停 雷达图 有实际意义,可对两支股票作对比 '''
df = read_excel() # 读取数据
print(df)
print("请根据以上展示信息,输入两支股票索引进行对比!")
print("例如:输入1,然后回车; 再输入2,然后回车; 即可对第2、3支股票进行对比。")
num1 = int(input(">>>>>>>>>>【输入待展示的股票序号1】<<<<<<<<<\n"))
num2 = int(input(">>>>>>>>>>【输入待展示的股票序号2】<<<<<<<<<\n"))
# 选取 最高、最低、今开、昨收、涨停、跌停 这五列标题
titles = df.columns.tolist()[2:8]
# 股票一
stock_name1 = df["股票名称"][num1]
stock_code1 = df["股票代码"][num1]
data1 = df.loc[num1].tolist()[2:8] # 选取 最高、最低、今开、昨收、涨停、跌停 这六列数据
# 股票二
stock_name2 = df["股票名称"][num2]
stock_code2 = df["股票代码"][num2]
data2 = df.loc[num2].tolist()[2:8] # 选取 最高、最低、今开、昨收、涨停、跌停 这六列数据
data = [data1, data2]
N = len(titles) # 雷达图等分数目
titles.append(titles[0]) # 标题数目和数据一致
# 样式 大于当前的5
sam = ['r-', 'm-', 'g-', 'b-', 'y-', 'k-', 'w-', 'c-']
for i in range(len(data)):
values = data[i]
# 设置雷达图的角度,平分圆面
angles = np.linspace(0, 2 * np.pi, N, endpoint=False)
# 雷达图封闭 两种方法
# values.append(values[0])
values = np.concatenate((values, [values[0]]))
# 角度
angles = np.append(angles, angles[0])
# 绘制折线图
plt.polar(angles, values, sam[num1 % 5], lw=2)
# 添加特征标签
plt.thetagrids(angles * 180 / np.pi, titles)
# 填充颜色
plt.fill(angles, values, facecolor='c', alpha=0.4)
# 标题
plt.title('【' + stock_name1 + stock_code1 + '】 VS 【' + stock_name2 + stock_code2 + '】')
plt.show()
5. 效果展示
5.1 爬取股票信息
输入1
,回车
提示需要爬取的最大数目【建议15-20,因为后面绘图都是全量的,太多股票显示效果不好,没有随机采样有限个数个】此处列为TODO考虑作优化~
输入18个,因为网络和网页问题,可能会缺失几条股票信息!
例如我输入爬取40条,结果少了四条:
两个显示效果不好的例子
:
36支股票的效果已经很不好看了:
数目过多情况下,饼图已经重叠到爆炸:
5.2 展示股票信息
输入2
,回车
即可看到当前表格文件中存储的所有股票的信息,以pandas的dataframe格式展示,中间过多数据以…省略号缩写;
5.3 饼图
输入3
,回车
,即可对当前文件中所有股票进行对比;
颜色和图例做过优化,但是仍有叠加情况【考虑过占比少和多的扇形交叉展示,但是此处数据根据涨跌幅做过排序】
点击关闭图形窗口即可继续运行系统!~
5.4 柱状图
输入4
,回车
,即可生成当前所有股票【最高】柱状图;
5.5 雷达图 对比两支股票差距
输入5
,回车
,先展示当前股票信息,最前面一列为股票的索引,从0开始;
然后根据提供的股票索引,输入两个存在的整数,即可生成雷达对比图;
5.6 删除旧股票信息文件&退出系统
输入6
,回车
;
即可将保存的股票表格文件删除,以方便下次爬取和生成新的股票表格文件;
输入0
,回车
;
即可退出并关闭程序;
6. 总结
通过此系统的设计与开发并优化过程,熟悉了matplotlib与pandas两个重要库的基本操作和使用;
另外对爬虫的网页分析和爬取也有了一定程度的学习;
需要优化的地方更在于系统项目更具有业务上的意义的设计;
今天的文章python+matplotlib+pandas股票爬虫可视化分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/87461.html