一、选题课程背景
在当今信息化时代,数据已成为驱动各行各业发展的重要力量。股市作为经济的晴雨表,其数据更是备受关注。东方财富网作为国内知名的财经网站,拥有海量的股市数据。随着大数据技术的不断发展,数据在各行各业的应用越来越广泛。股市作为经济的核心,其数据的价值不言而喻。然而,获取股市数据并非易事,尤其是对于普通投资者而言。
二、选题意义
股市数据分析对于金融领域的研究具有重要意义。东方财富网作为中国的主要财经网站,其数据具有很高的研究价值。通过爬取和分析这些数据,可以深入了解中国股市的运行规律、投资者行为和市场趋势,为金融学、经济学和其他相关学科的研究提供实证支持。对于投资者而言,股市数据的实时性和准确性至关重要。通过Python爬虫技术,投资者可以快速、准确地获取东方财富网上的股市数据,为投资决策提供实时依据。这有助于提高投资者的盈利能力,推动资本市场的健康发展。
三、数据集简介
此数据集爬取的是东方财富网中的石头科技("https://data.eastmoney.com/zjlx/688169.html")这些数据可以帮助我们对股票数据的分析,投资者可以了解市场趋势,发现潜在的投资机会,并制定相应的投资策略。这有助于提高投资决策的科学性和准确性。 通过爬取和分析股票数据,投资者可以建立有效的数据模型,预测未来的市场走势。这对于制定长期投资策略和风险管理至关重要。
日期:该支股票的某段时间数据
收盘价:某种证券在证券交易所每个交易日里的最后一笔买卖成交价格
涨跌幅:当前交易日最新成交价与前一交易日收盘价相比较所产生的数值
主力净流入 净额:主力资金流入和主力资金流出的差额
主力净流入 净占比:主力资金净流入占当日成交额的比例
超大单净流入 净额:超大单资金流入和超大单资金流出的差额
超大单净流入 净占比:超大单交易量在总交易量中的占比
大单净流入 净额:大单资金流入和流出之间的差额
大单净流入 净占比:大单净流入净额占总成交额的比重
中单净流入 净额:中单资金流入和流出之间的差额
中单净流入 净占比:中单净流入净额占总成交额的比重
小单净流入 净额:小单资金流入和流出之间的差额
小单净流入 净占比:小单净流入净额占总成交额的比重
数据截图:
四、大数据分析
第三方库:
import re
import json
import xlwt
import requests
import pandas as pd
import matplotlib.pyplot as plt
import warnings
import numpy as np
from matplotlib import ticker
获取石头科技该支股票的历史资金流向抓取
url = 'https://push2his.eastmoney.com/api/qt/stock/fflow/daykline/get?cb=jQuery112309385401632211825_1687151973274&lmt=0&klt=101&fields1=f1%2Cf2%2Cf3%2Cf7&fields2=f51%2Cf52%2Cf53%2Cf54%2Cf55%2Cf56%2Cf57%2Cf58%2Cf59%2Cf60%2Cf61%2Cf62%2Cf63%2Cf64%2Cf65&ut=b2884a393a59ad64002292a3e90d46a5&secid=1.688169&_=1687151973275'
headers = {
'Cookie': 'qgqp_b_id=2d4ae291b926e17cb89d32735d112a92; HAList=ty-1-688169-%u77F3%u5934%u79D1%u6280%2Cty-1-000001-%u4E0A%u8BC1%u6307%u6570; qquestionnairebox=1; st_si=52215254809151; st_pvi=33017602277084; st_sp=2023-06-05%2020%3A23%3A59; st_inirUrl=https%3A%2F%2Fcn.bing.com%2F; st_sn=1; st_psi=20230619131918296-113300300815-0420864737; st_asi=delete',
'Host': 'push2his.eastmoney.com',
'Referer': 'https://data.eastmoney.com/zjlx/688169.html',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.44'
}
resp = requests.get(url, headers=headers)
response = resp.text
new_res_list = re.findall(r'data":{.*?}', response)
new_res = new_res_list[0]
q = re.findall(r'{.*?}', new_res)
new_r_1 = str(new_res).replace('data":', '')
new_r = new_r_1.strip()
# print(qq)
a = json.loads(new_r)
# print(a)
count = 0
con = ['日期', '收盘价', '涨跌幅', '主力净流入 净额', '主力净流入 净占比', '超大单净流入 净额', '超大单净流入 净占比', '大单净流入 净额', '大单净流入 净占比', '中单净流入 净额', '中单净流入 净占比', '小单净流入 净额', '小单净流入 净占比']
book = xlwt.Workbook()
# 新建工作簿
table = book.add_sheet('Over', cell_overwrite_ok=True)
# 如果对同一单元格重复操作会发生overwrite Exception,cell_overwrite_ok为可覆盖
for k in range(0, len(con)):
table.write(0, k, con[k])
# 行,列,属性值 (1,1)为B2元素,从0开始计数
将抓取提取到的数据值写入表中
for data in a['klines']:
data_p_1 = str(data)
data_p = data_p_1.split(',')
print(data_p)
count += 1
# print(count)
# sleep(0.5)
for k in range(0, len(con)):
table.write(count, k, data_p[k])
style = xlwt.XFStyle() # 新建样式
font = xlwt.Font() # 新建字体
font.name = 'Times New Roman'
font.bold = True
style.font = font # 将style的字体设置为font
book.save(filename_or_stream='东方财富网.xls')
数据可视化
收盘价
提取数据库中的两列数据,一个是名为'收盘价'的股价数据,另一个是名为'日期'的时间数据函数绘制折线图,横轴为日期,纵轴为收盘价,颜色为蓝色,添加了标签'股价'。绘制出折线图
def get_data():
# 绘制折线图
df = pd.read_excel('东方财富网.xls')
i_df = df['收盘价']
spj_list = list(i_df)
r_df = df['日期']
rq_list = list(r_df)
plt.plot(rq_list, spj_list, color='b', label='股价')
# 绘制时间和收盘价的折线图
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.legend()
plt.savefig("收盘价折线图.png", dpi=660, bbox_inches='tight')
plt.show()
print(df)
半年主力净流入净额
提取和计算半年内某股票主力净流入净额的最大和最小日期,并打印相应的结果
# 计算半年涨跌幅最大和最小的日期
df['日期'] = pd.to_datetime(df['日期'])
q1 = df['日期'] >= '2023/1/18'
df_1 = df.loc[q1]
q2 = df_1['主力净流入 净额']
q2_list = list(q2)
vmax = max(q2_list)
q3 = df_1['主力净流入 净额']
q3_list = list(q3)
vmin = min(q3_list)
df_2 = df_1.loc[df_1['主力净流入 净额'] == vmax].reset_index()
df_3 = df_1.loc[df_1['主力净流入 净额'] == vmin].reset_index()
df_2 = pd.DataFrame(df_2, columns=['日期', '主力净流入 净额'])
df_2 = df_2.values.tolist()[0]
df_3 = pd.DataFrame(df_3, columns=['日期', '主力净流入 净额'])
df_3 = df_3.values.tolist()[0]
print(df_2)
print('=' * 60)
print('主力净流入 净额最高的日期是{},主力净流入 净额是{}'.format(df_2[0], df_2[1]))
print('主力净流入 净额最低的日期是{},主力净流入 净额是{}\n'.format(df_3[0], df_3[1]))
每月收盘价进行均值
提取库中的日期和收盘价两列使用resample按月对数据进行重采样,计算每月收盘价的均值,最后重新设置索引为默认值,打印出图形
# 计算每月收盘价的均值,并绘制柱状图
data = pd.DataFrame(df, columns=['日期', '收盘价'])
data['日期'] = pd.to_datetime(data['日期'])
data = data.set_index('日期')
# print(data.resample('w').sum())
# print(data.resample('m').mean())
# print(data.resample('Q').sum())
# print(data.resample('AS').sum())
data = data.resample('m').mean().reset_index()
print('=' * 60)
print('每月收盘价的均值是:')
print(data)
plt.bar(list(data['日期']), list(data['收盘价']), width=12, color=
'red', label='收盘价')
plt.legend()
plt.savefig("月均值柱状图.png", dpi=660)
plt.show()
# 绘制主力净流入 净额折线图
plt.plot(list(df['日期']), list(df['主力净流入 净额']), color='b', label='主力净流入 净额')
# 绘制时间和主力净流入 净额的折线图
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.legend()
plt.savefig("主力净流入 净额折线图.png", dpi=660, bbox_inches='tight')
plt.show()
# print(df)
主力净流入净额
绘制主力净流入净额的折线图,横轴为日期,纵轴为主力净流入净额,颜色为蓝色,添加了标签'主力净流入净额。设置横轴主刻度为每120天一个刻度。通过绘制折线图,展示主力净流入净额随时间的变化趋势
# 绘制主力净流入 净额折线图
plt.plot(list(df['日期']), list(df['主力净流入 净额']), color='b', label='主力净流入 净额')
# 绘制时间和主力净流入 净额的折线图
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.legend()
plt.savefig("主力净流入 净额折线图.png", dpi=660, bbox_inches='tight')
plt.show()
# print(df)
涨跌幅
读取数据表中的涨跌幅,对涨跌幅的数据绘制出折线图
# 绘制折线图
df = pd.read_excel('东方财富网.xls')
i_df = df['涨跌幅']
spj_list = list(i_df)
r_df = df['日期']
rq_list = list(r_df)
plt.plot(rq_list, spj_list, color='r', label='涨跌幅')
# 绘制时间和涨跌幅的折线图
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.legend()
plt.savefig("涨跌幅折线图.png", dpi=660, bbox_inches='tight')
plt.show()
print(df)
超大单净流入净额和净占比
将数据表中获取的日期和超大单净流入净额和经进行绘制折线图
# 绘制折线图
df = pd.read_excel('东方财富网.xls')
i_df = df['超大单净流入 净额']
spj_list = list(i_df)
r_df = df['日期']
rq_list = list(r_df)
plt.plot(rq_list, spj_list, color='b', label='超大单净流入 净额')
# 绘制时间和超大单净流入 净额的折线图
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.legend()
plt.savefig("超大单净流入 净额折线图.png", dpi=660, bbox_inches='tight')
plt.show()
print(df)
# 绘制折线图
df = pd.read_excel('东方财富网.xls')
i_df = df['超大单净流入 净占比']
spj_list = list(i_df)
r_df = df['日期']
rq_list = list(r_df)
plt.plot(rq_list, spj_list, color='b', label='超大单净流入 净占比')
# 绘制时间和超大单净流入 净占比的折线图
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.legend()
plt.savefig("超大单净流入 净占比折线图.png", dpi=660, bbox_inches='tight')
plt.show()
print(df)
总结
在实际项目中,我成功地编写了爬虫代码,从东方财富网等数据源中爬取了所需的股票信息。我深刻理解了反爬虫策略的重要性,并学会了如何处理异常情况和绕过限制。 爬取到的原始数据常常存在一些问题,如缺失值、异常值等。通过之前第一次上课实践学习使的用pandas进行数据清洗和整理,我成功地将原始数据转化为可用于分析的格式,提高了数据的质量。
虽然这次做的很烂,有少许部分借鉴,但是受益匪浅,通过自己的实践一步步进步,一步步的运行出自己想要的代码后非常兴奋。一分耕耘一分收获,喜欢自己能保持初心保持对这个行业充满热情的状态!!!
完整代码如下
import re
import json
import xlwt
import requests
import pandas as pd
import matplotlib.pyplot as plt
import warnings
import numpy as np
from matplotlib import ticker
warnings.filterwarnings('ignore')
plt.rcParams['figure.figsize'] = (14, 7.5)
# 全局设置输出图片大小 1400 x 750 像素
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
con = ['日期', '收盘价', '涨跌幅', '主力净流入 净额', '主力净流入 净占比', '超大单净流入 净额', '超大单净流入 净占比', '大单净流入 净额', '大单净流入 净占比', '中单净流入 净额', '中单净流入 净占比', '小单净流入 净额', '小单净流入 净占比']
book = xlwt.Workbook()
# 新建工作簿
table = book.add_sheet('Over', cell_overwrite_ok=True)
# 如果对同一单元格重复操作会发生overwrite Exception,cell_overwrite_ok为可覆盖
for k in range(0, len(con)):
table.write(0, k, con[k])
# 行,列,属性值 (1,1)为B2元素,从0开始计数
style = xlwt.XFStyle()
# 新建样式
font = xlwt.Font()
# 新建字体
font.name = 'Times New Roman'
font.bold = True
style.font = font
# 将style的字体设置为font
# table.write(0, 0, 'Test', style)
book.save(filename_or_stream='东方财富网.xls')
# 一定要保存
url = 'https://push2his.eastmoney.com/api/qt/stock/fflow/daykline/get?cb=jQuery112309385401632211825_1687151973274&lmt=0&klt=101&fields1=f1%2Cf2%2Cf3%2Cf7&fields2=f51%2Cf52%2Cf53%2Cf54%2Cf55%2Cf56%2Cf57%2Cf58%2Cf59%2Cf60%2Cf61%2Cf62%2Cf63%2Cf64%2Cf65&ut=b2884a393a59ad64002292a3e90d46a5&secid=1.688169&_=1687151973275'
headers = {
'Cookie': 'qgqp_b_id=2d4ae291b926e17cb89d32735d112a92; HAList=ty-1-688169-%u77F3%u5934%u79D1%u6280%2Cty-1-000001-%u4E0A%u8BC1%u6307%u6570; qquestionnairebox=1; st_si=52215254809151; st_pvi=33017602277084; st_sp=2023-06-05%2020%3A23%3A59; st_inirUrl=https%3A%2F%2Fcn.bing.com%2F; st_sn=1; st_psi=20230619131918296-113300300815-0420864737; st_asi=delete',
'Host': 'push2his.eastmoney.com',
'Referer': 'https://data.eastmoney.com/zjlx/688169.html',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.44'
}
resp = requests.get(url, headers=headers)
response = resp.text
new_res_list = re.findall(r'data":{.*?}', response)
new_res = new_res_list[0]
q = re.findall(r'{.*?}', new_res)
new_r_1 = str(new_res).replace('data":', '')
new_r = new_r_1.strip()
# print(qq)
a = json.loads(new_r)
# print(a)
count = 0
for data in a['klines']:
data_p_1 = str(data)
data_p = data_p_1.split(',')
print(data_p)
count += 1
# print(count)
# sleep(0.5)
for k in range(0, len(con)):
table.write(count, k, data_p[k])
style = xlwt.XFStyle()
# 新建样式
font = xlwt.Font()
# 新建字体
font.name = 'Times New Roman'
font.bold = True
style.font = font
# 将style的字体设置为font
book.save(filename_or_stream='东方财富网.xls')
# 一定要保存
# matplotlib
def get_data():
# 绘制折线图
df = pd.read_excel('东方财富网.xls')
i_df = df['收盘价']
spj_list = list(i_df)
r_df = df['日期']
rq_list = list(r_df)
plt.plot(rq_list, spj_list, color='b', label='股价')
# 绘制时间和收盘价的折线图
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.legend()
plt.savefig("收盘价折线图.png", dpi=660, bbox_inches='tight')
plt.show()
print(df)
# 计算半年涨跌幅最大和最小的日期
df['日期'] = pd.to_datetime(df['日期'])
q1 = df['日期'] >= '2023/1/18'
df_1 = df.loc[q1]
q2 = df_1['主力净流入 净额']
q2_list = list(q2)
vmax = max(q2_list)
q3 = df_1['主力净流入 净额']
q3_list = list(q3)
vmin = min(q3_list)
df_2 = df_1.loc[df_1['主力净流入 净额'] == vmax].reset_index()
df_3 = df_1.loc[df_1['主力净流入 净额'] == vmin].reset_index()
df_2 = pd.DataFrame(df_2, columns=['日期', '主力净流入 净额'])
df_2 = df_2.values.tolist()[0]
df_3 = pd.DataFrame(df_3, columns=['日期', '主力净流入 净额'])
df_3 = df_3.values.tolist()[0]
print(df_2)
print('=' * 60)
print('主力净流入 净额最高的日期是{},主力净流入 净额是{}'.format(df_2[0], df_2[1]))
print('主力净流入 净额最低的日期是{},主力净流入 净额是{}\n'.format(df_3[0], df_3[1]))
# 计算每月收盘价的均值,并绘制柱状图
data = pd.DataFrame(df, columns=['日期', '收盘价'])
data['日期'] = pd.to_datetime(data['日期'])
data = data.set_index('日期')
# print(data.resample('w').sum())
# print(data.resample('m').mean())
# print(data.resample('Q').sum())
# print(data.resample('AS').sum())
data = data.resample('m').mean().reset_index()
print('=' * 60)
print('每月收盘价的均值是:')
print(data)
plt.bar(list(data['日期']), list(data['收盘价']), width=12, color=
'red', label='收盘价')
plt.legend()
plt.savefig("月均值柱状图.png", dpi=660)
plt.show()
# 绘制主力净流入 净额折线图
plt.plot(list(df['日期']), list(df['主力净流入 净额']), color='b', label='主力净流入 净额')
# 绘制时间和主力净流入 净额的折线图
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.legend()
plt.savefig("主力净流入 净额折线图.png", dpi=660, bbox_inches='tight')
plt.show()
# print(df)
# 绘制折线图
df = pd.read_excel('东方财富网.xls')
i_df = df['涨跌幅']
spj_list = list(i_df)
r_df = df['日期']
rq_list = list(r_df)
plt.plot(rq_list, spj_list, color='r', label='涨跌幅')
# 绘制时间和涨跌幅的折线图
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.legend()
plt.savefig("涨跌幅折线图.png", dpi=660, bbox_inches='tight')
plt.show()
print(df)
# 绘制折线图
df = pd.read_excel('东方财富网.xls')
i_df = df['主力净流入 净额']
spj_list = list(i_df)
r_df = df['日期']
rq_list = list(r_df)
plt.plot(rq_list, spj_list, color='b', label='主力净流入 净额')
# 绘制时间和主力净流入 净额的折线图
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.legend()
plt.savefig("主力净流入 净额折线图.png", dpi=660, bbox_inches='tight')
plt.show()
print(df)
# 绘制折线图
df = pd.read_excel('东方财富网.xls')
i_df = df['超大单净流入 净额']
spj_list = list(i_df)
r_df = df['日期']
rq_list = list(r_df)
plt.plot(rq_list, spj_list, color='b', label='超大单净流入 净额')
# 绘制时间和超大单净流入 净额的折线图
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.legend()
plt.savefig("超大单净流入 净额折线图.png", dpi=660, bbox_inches='tight')
plt.show()
print(df)
# 绘制折线图
df = pd.read_excel('东方财富网.xls')
i_df = df['超大单净流入 净占比']
spj_list = list(i_df)
r_df = df['日期']
rq_list = list(r_df)
plt.plot(rq_list, spj_list, color='b', label='超大单净流入 净占比')
# 绘制时间和超大单净流入 净占比的折线图
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.legend()
plt.savefig("超大单净流入 净占比折线图.png", dpi=660, bbox_inches='tight')
plt.show()
print(df)
# 绘制折线图
df = pd.read_excel('东方财富网.xls')
i_df = df['大单净流入 净额']
spj_list = list(i_df)
r_df = df['日期']
rq_list = list(r_df)
plt.plot(rq_list, spj_list, color='b', label='大单净流入 净额')
# 绘制时间和大单净流入 净额的折线图
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.legend()
plt.savefig("大单净流入 净额折线图.png", dpi=660, bbox_inches='tight')
plt.show()
print(df)
#柱状图
plt.bar(list(df['日期']), list(df['涨跌幅']), width=12, color=
'red', label='涨跌幅')
plt.legend()
plt.savefig("涨跌幅-时间柱状图.png", dpi=660)
plt.show()
# 绘制折线图
df = pd.read_excel('东方财富网.xls')
i_df = df['收盘价']
spj_list = list(i_df)
r_df = df['涨跌幅']
rq_list = list(r_df)
plt.plot(rq_list, spj_list, color='r', label='涨跌幅')
# 绘制时间和大单净流入 净额的折线图
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.legend()
plt.savefig("收盘价-涨跌幅折线图.png", dpi=660, bbox_inches='tight')
plt.show()
print(df)
# 绘制折线图
df = pd.read_excel('东方财富网.xls')
i_df = df['收盘价']
spj_list = list(i_df)
r_df = df['涨跌幅']
rq_list = list(r_df)
plt.plot(rq_list, spj_list, color='b', label='涨跌幅')
# 绘制时间和大单净流入 净额的折线图
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.legend()
plt.savefig("收盘价-涨跌幅折线图.png", dpi=660, bbox_inches='tight')
plt.show()
print(df)
# 绘制折线图
df = pd.read_excel('东方财富网.xls')
i_df = df['收盘价']
spj_list = list(i_df)
r_df = df['超大单净流入 净占比']
rq_list = list(r_df)
plt.plot(rq_list, spj_list, color='b', label='超大单净流入 净占比')
# 绘制收盘价和超大单净流入 净占比的折线图
plt.gca().xaxis.set_major_locator(ticker.MultipleLocator(120))
plt.legend()
plt.savefig("收盘价-超大单净流入 净占比折线图.png", dpi=660, bbox_inches='tight')
plt.show()
print(df)
if __name__ == '__main__':
get_data()
# 数据分析和数据可视化
标签:数据分析,课程设计,plt,净流入,Python,list,df,折线图,净额 From: https://www.cnblogs.com/gww00925/p/17937952