首页 > 编程语言 >python大数据分析——股票数据可视化

python大数据分析——股票数据可视化

时间:2023-06-07 18:36:38浏览次数:46  
标签:数据分析 plt python df 可视化 close date ax data

一、选题的背景

        股票市场一直是金融领域的焦点之一,对股票数据进行大数据分析有助于了解市场趋势、预测价格波动、优化投资策略等。随着大数据技术的快速发展和  应用,越来越多的投资者、交易员和分析师开始利用大数据技术来解读和分析股票市场数据。通过对股票数据的大数据分析可以提供有关市场走势、投资机会和风险的深入洞察,帮助投资者和交易员做出明智的决策,并提高投资和交易的效果。结合Python强大的数据分析和可视化工具,可以提供全面、准确的市场洞察和投资决策支持,为投资者和交易员带来更好的交易体验和投资回报。

二、大数据分析设计方案

        下载老师提供的数据集,导入并理解数据集,观察数据集属性,经过数据清洗得到全新的数据集用于数据分析与可视化,用数据可视化分析股票股价趋势,股价的分布和股票之间的联系与对比。

三、数据分析步骤

1.导入库

import pandas as pd
import matplotlib.pylab as plt

 2.导入数据集并显示数据

1 #读取数据
2 import pandas as pd
3 data = pd.read_csv('D:\python\股票数据集.csv')
4 #显示数据
5 data

 3.数据处理:查看是否含有缺失值,如果有删除缺失值并检查是否删除

1 #查看缺失值
2 data.isnull().sum()

其中open,high,low列含有空值

 

1 #删除缺失值
2 data.dropna(inplace=True)
3 #查看是否删除
4 data.isnull().sum()

 可以看出空值已删除

4.查看数据类型

1 #查看数据基本信息和数据类型。
2 data.info()

data为日期

Open为开盘价,

High为当天最高价,

Low为最低价,

Close为当天收盘价,

Volume指当天总共的股票交易数。

 5.重命名列并基于日期列创建两个新列“mouth”和“day”便于可视化

 1 import pandas as pd
 2 data = pd.read_csv('D:\python\股票数据集.csv')
 3 
 4 # 重命名列
 5 data.columns = ['date', 'open', 'high', 'low', 
 6                      'close', 'volume', 'stock_name']
 7 
 8 data['date']=pd.to_datetime(data['date'])
 9 data = data.assign(month=data['date'].dt.month)
10 data = data.assign(day=data['date'].dt.day)
11 data

 6.单只股票价格折线图:股价在时间轴上的对比(以2017年为例)

 1 # 设置坐标周和图表大小。
 2 fig, ax = plt.subplots(figsize = (8,6))
 3 
 4 # 股票名称列表
 5 lst_stocks = ['AAL']
 6 
 7 for s in lst_stocks:
 8     # 绘制每个股票收盘价格折线图
 9     data[(data['stock_name'] == s) & (data['date'].dt.year == 2017)] \
10         .loc[:, ['date', 'close']] \
11         .set_index('date') \
12         .plot(kind = 'line',
13               ax = ax)
14 # 更新图示为对应股票名
15 ax.legend(lst_stocks, loc = 5)
16 plt.title('2017年股票收盘价趋势图')
17 plt.yticks(fontsize=14)
18 plt.ylim(0,100)
19 plt.show()

 从图中得到信息:AAL股价在2017年趋势较为平稳,上下波动幅度不大

7.多只股票价格折线图:多只股票股价在时间轴上的对比

查看股票数据集中含有的数据种类

1 import pandas as pd
2 # 读取数据集
3 data = pd.read_csv('D:\python\股票数据集.csv')
4 # 统计某列不同数据的名称并输出
5 names = data['Name'].unique()
6 print(names)

 选取部分股票进行对比

 1 # 设置坐标周和图表大小。
 2 fig, ax = plt.subplots(figsize = (8,6))
 3 #股票名称列表
 4 lst_stocks = ['AAL','ABBV','ZION','ZTS','AAPL','AAP']
 5 for s in lst_stocks:
 6     # 绘制每个股票收盘价格折线图
 7     data[(data['stock_name'] == s) & (data['date'].dt.year == 2017)] \
 8         .loc[:, ['date', 'close']] \
 9         .set_index('date') \
10         .plot(kind = 'line',
11               ax = ax)
12 # 更新图示为对应股票名
13 ax.legend(lst_stocks, loc = 5)
14 plt.title('2017年股票收盘价趋势图')
15 plt.yticks(fontsize=14)
16 plt.ylim(0,200)
17 plt.show()

 多个股票价格趋势图画在同一张图上,我们的关注点是不同股票之间的对比。从上图我们可以得到一些简单的结论:
AAP与AAPL股价波动较为明显,AAP呈现下降趋势,AAPL呈现上升趋势。其它股票相对于AAP,AAPL较低,趋势比较平稳。

8.股价均线图:一只股票这一年的股价趋势和它的均线。(以AAPL为例)

利用pandas生成30, 60, 90天的移动平均值。再在收盘价趋势图上画出这3条移动平均线。

 1 # 计算移动平均值。
 2 df_abbv = data[data['stock_name'] == 'AAPL'].copy()
 3 df_abbv['thirty_ma'] = df_abbv.close.rolling(window = 30).mean()
 4 df_abbv['sisty_ma'] = df_abbv.close.rolling(window = 60).mean()
 5 df_abbv['ninety_ma'] = df_abbv.close.rolling(window = 90).mean()
 6 
 7 # 生成坐标轴并定义图表大小。
 8 fig, ax = plt.subplots(figsize = (8,6))
 9 
10 # 使用循环生成4条折线
11 lst_col = ['close', 'thirty_ma', 'sisty_ma', 'ninety_ma']
12 for c in lst_col:
13     df_abbv[df_abbv['date'].dt.year == 2017] \
14         .loc[:, ['date', c]] \
15         .set_index('date') \
16         .plot(kind = 'line',
17               ax = ax,
18               title = '2017 AAPL股价趋势图')
19 
20 # 更新标签
21 lst_led = ['日收盘价', '30日线', '60日线', '90日线']
22 ax.legend(lst_led)
23 plt.show()

从上图就可以非常直观看到多条均线的走势。AAPL在6月前都在上升通道中,股价稳定上涨。但是在7月到11月之间从3条均线都可以看到有下降趋势。

 9.不同股票收盘价箱线图:多只股票价格分布,对比波动性。

由于不同股票的价格区间不同,想要比较他们的价格波动性,折线图显然不是最好的选择。而使用箱线图就能很好地展现数据的分布情况。

 1 data = data.loc[data['stock_name'].isin(['AAL', 'ABBV','ZION','ZTS','AAPL','AAP'])]
 2 # 使用boxplot画出箱线图
 3 data \
 4     .loc[:, ['stock_name','close']] \
 5     .boxplot(by = 'stock_name',
 6              figsize = (8,6)) \
 7     .set(xlabel=None)
 8 plt.suptitle('')
 9 plt.title('2017年收盘价箱图')
10 plt.show()

 从箱线图中可以看到:
AAP和AAPL股价波动最为明显,
AAL和ZION的股价相对稳定。

10.AAP月箱线图:一只股票股价趋势,同时对比段时间股价波动性。

只用pandas和matplotlib不能画出专业的k线图,所以我们用箱线图仿月k线图来展示股价趋势和成交价格最大值和最小值。这里除了趋势之外,我们还能看到一段时间内数据的分布,使用箱线图就可以很好地展示这些数据特征。

 1 # 使用boxplot可以画出简单k线图
 2 df_amzn = data[data['stock_name'] == 'AAP'].copy()
 3 df_amzn \
 4     .loc[:, ['month','close']] \
 5     .boxplot(by = 'month',
 6              figsize = (8,6)) \
 7     .set(xlabel=None)
 8 plt.suptitle('')
 9 plt.title('AAP2017年月k图')
10 plt.show()

 11.AAP月平均成交量柱状图:单只股票对比其不同月份的月均交易量。

1 # 使用boxplot可以画出简单k线图
2 df_amzn \
3     .groupby('month')['volume'] \
4     .mean() \
5     .plot(kind = 'bar')
6 plt.title('AAP2017年月均交易量图')
7 plt.show()

 

箱图和柱状图在同一画布:使得报告更紧凑,或者方便从不同维度解释数据

 1 # 设置画布
 2 fig, ax = plt.subplots(1,2, figsize = (9,4))
 3 
 4 df_amzn \
 5     .loc[:, ['month','close']] \
 6     .boxplot(by = 'month',
 7              figsize = (8,6),
 8              ax = ax[0]) \
 9     .set(xlabel=None, title = 'AAP2017年月k图')
10 plt.suptitle('')
11 df_amzn \
12     .groupby('month')['volume'] \
13     .mean() \
14     .plot(kind = 'bar',
15           ax = ax[1],
16           title = 'AAP2017年月均交易量图')
17 plt.show()

 12.AAP收盘价与成交量散点图:单只股票收盘价和成交量的关系。

 1 # 散点图
 2 df_amzn \
 3     .loc[:, ['close', 'volume']] \
 4     .plot(x = 'close', y = 'volume',
 5           kind = 'scatter',
 6           figsize = (8,6),
 7           color = 'green',
 8           title = 'AAP收盘价与成交量散点图')
 9 plt.show()
10 print('AAP收盘价与成交量相关矩阵')
11 df_amzn.loc[:, ['close', 'volume']].corr()

 从相关矩阵上看,收盘价与成交量相关性为0.06,两个变量之间存在一定的线性关系,但这种关系比较弱。

从散点图上看,成交量在不同价格区间内较为集中。

附完整程序源代码

  1 import pandas as pd
  2 import matplotlib.pylab as plt
  3 #读取数据
  4 import pandas as pd
  5 data = pd.read_csv('D:\python\股票数据集.csv')
  6 #显示数据
  7 data
  8 #查看缺失值
  9 data.isnull().sum()
 10 #删除缺失值
 11 data.dropna(inplace=True)
 12 #查看是否删除
 13 data.isnull().sum()
 14 
 15 import pandas as pd
 16 data = pd.read_csv('D:\python\股票数据集.csv')
 17 
 18 # 重命名列
 19 data.columns = ['date', 'open', 'high', 'low', 
 20                      'close', 'volume', 'stock_name']
 21 
 22 data['date']=pd.to_datetime(data['date'])
 23 data = data.assign(month=data['date'].dt.month)
 24 data = data.assign(day=data['date'].dt.day)
 25 data
 26 
 27 import matplotlib.pylab as plt
 28 # 设置坐标周和图表大小。
 29 fig, ax = plt.subplots(figsize = (8,6))
 30 
 31 # 将以下列表替换为您想要绘制的股票名称列表
 32 lst_stocks = ['AAL']
 33 
 34 for s in lst_stocks:
 35     # 绘制每个股票收盘价格折线图
 36     data[data['stock_name'] == s] \
 37         .loc[:, ['date', 'close']] \
 38         .set_index('date') \
 39         .plot(kind = 'line',
 40               ax = ax)
 41 # 更新图示为对应股票名
 42 ax.legend(lst_stocks, loc = 5)
 43 plt.title('股票收盘价趋势图')
 44 plt.yticks(fontsize=20)
 45 plt.show()
 46 
 47 import matplotlib.pyplot as plt
 48 import pandas as pd
 49 
 50 # 读取股票数据
 51 data = pd.read_csv('D:\python\股票数据集.csv')
 52 
 53 # 选择某一只股票的数据
 54 #data = data[data['stock_name'] == 'ZTS']
 55 
 56 # 绘制折线图
 57 plt.plot(data['date'], data['close'])
 58 
 59 # 选择2018年的数据
 60 data = data[(data['date'] >= '2018-01-01') & (data['date'] <= '2018-12-31')]
 61 
 62 
 63 # 设置标题和轴标签
 64 plt.title('Stock Price')
 65 plt.xlabel('Date')
 66 plt.ylabel('close')
 67 
 68 # 显示图表
 69 plt.show()
 70 
 71 # 设置坐标周和图表大小。
 72 fig, ax = plt.subplots(figsize = (8,6))
 73 
 74 # 股票名称列表
 75 lst_stocks = ['AAL']
 76 
 77 for s in lst_stocks:
 78     # 绘制每个股票收盘价格折线图
 79     data[(data['stock_name'] == s) & (data['date'].dt.year == 2017)] \
 80         .loc[:, ['date', 'close']] \
 81         .set_index('date') \
 82         .plot(kind = 'line',
 83               ax = ax)
 84 # 更新图示为对应股票名
 85 ax.legend(lst_stocks, loc = 5)
 86 plt.title('2017年股票收盘价趋势图')
 87 plt.yticks(fontsize=14)
 88 plt.ylim(0,100)
 89 plt.show()
 90 
 91 import matplotlib.pyplot as plt
 92 import pandas as pd
 93 
 94 # 读取股票数据
 95 data = pd.read_csv('D:\python\股票数据集.csv')
 96 
 97 # 合并多个数据到一个数据集中
 98 data = data[['date', 'close']]
 99 data = data.groupby('date').sum()
100 
101 # 绘制折线图
102 plt.plot(data.index, data['close'])
103 
104 # 设置标题和轴标签
105 plt.title('Stock Price')
106 plt.xlabel('Date')
107 plt.ylabel('Close')
108 
109 # 显示图表
110 plt.show()
111 
112 import pandas as pd
113 # 读取数据集
114 data = pd.read_csv('D:\python\股票数据集.csv')
115 # 统计某列不同数据的名称并输出
116 names = data['Name'].unique()
117 print(names)
118 
119 
120 # 设置坐标周和图表大小。
121 fig, ax = plt.subplots(figsize = (8,6))
122 # 将以下列表替换为您想要绘制的股票名称列表
123 lst_stocks = ['AAL','ABBV','ZION','ZTS','AAPL','AAP']
124 for s in lst_stocks:
125     # 绘制每个股票收盘价格折线图
126     data[(data['stock_name'] == s) & (data['date'].dt.year == 2017)] \
127         .loc[:, ['date', 'close']] \
128         .set_index('date') \
129         .plot(kind = 'line',
130               ax = ax)
131 # 更新图示为对应股票名
132 ax.legend(lst_stocks, loc = 5)
133 plt.title('2017年股票收盘价趋势图')
134 plt.yticks(fontsize=14)
135 plt.ylim(0,200)
136 plt.show()
137 
138 # 计算移动平均值。
139 df_amzn = data[data['stock_name'] == 'AAP'].copy()
140 df_amzn['thirty_ma'] = df_amzn.close.rolling(window = 30).mean()
141 df_amzn['sisty_ma'] = df_amzn.close.rolling(window = 60).mean()
142 df_amzn['ninety_ma'] = df_amzn.close.rolling(window = 90).mean()
143 
144 # 生成坐标轴并定义图表大小。
145 fig, ax = plt.subplots(figsize = (8,6))
146 # 使用循环生成4条折线
147 lst_col = ['close', 'thirty_ma', 'sisty_ma', 'ninety_ma']
148 for c in lst_col:
149     df_amzn[df_amzn['date'].dt.year == 2017]  \
150         .loc[:, ['date', c]] \
151         .set_index('date') \
152         .plot(kind = 'line',
153               ax = ax,
154               title = '2017 AAP股价趋势图')
155 # 更新标签
156 lst_led = ['日收盘价', '30日线', '60日线', '90日线']
157 ax.legend(lst_led)
158 plt.show()
159 
160 # 计算移动平均值。
161 df_abbv = data[data['stock_name'] == 'AAPL'].copy()
162 df_abbv['thirty_ma'] = df_abbv.close.rolling(window = 30).mean()
163 df_abbv['sisty_ma'] = df_abbv.close.rolling(window = 60).mean()
164 df_abbv['ninety_ma'] = df_abbv.close.rolling(window = 90).mean()
165 
166 # 生成坐标轴并定义图表大小。
167 fig, ax = plt.subplots(figsize = (8,6))
168 
169 # 使用循环生成4条折线
170 lst_col = ['close', 'thirty_ma', 'sisty_ma', 'ninety_ma']
171 for c in lst_col:
172     df_abbv[df_abbv['date'].dt.year == 2017] \
173         .loc[:, ['date', c]] \
174         .set_index('date') \
175         .plot(kind = 'line',
176               ax = ax,
177               title = '2017 AAPL股价趋势图')
178 
179 # 更新标签
180 lst_led = ['日收盘价', '30日线', '60日线', '90日线']
181 ax.legend(lst_led)
182 plt.show()
183 
184 data = data.loc[data['stock_name'].isin(['AAL', 'ABBV','ZION','ZTS','AAPL','AAP'])]
185 # 使用boxplot画出箱线图
186 data \
187     .loc[:, ['stock_name','close']] \
188     .boxplot(by = 'stock_name',
189              figsize = (8,6)) \
190     .set(xlabel=None)
191 plt.suptitle('')
192 plt.title('2017年收盘价箱图')
193 plt.show()
194 
195 # 使用boxplot可以画出简单k线图
196 df_amzn = data[data['stock_name'] == 'AAP'].copy()
197 df_amzn \
198     .loc[:, ['month','close']] \
199     .boxplot(by = 'month',
200              figsize = (8,6)) \
201     .set(xlabel=None)
202 plt.suptitle('')
203 plt.title('AAP2017年月k图')
204 plt.show()
205 
206 # 使用boxplot可以画出简单k线图
207 df_AAPL = data[data['stock_name'] == 'AAPL'].copy()
208 df_AAPL \
209     .loc[:, ['month','close']] \
210     .boxplot(by = 'month',
211              figsize = (8,6)) \
212     .set(xlabel=None)
213 plt.suptitle('')
214 plt.title('AAPL2017年月k图')
215 plt.show()
216 
217 # 使用boxplot可以画出简单k线图
218 df_amzn \
219     .groupby('month')['volume'] \
220     .mean() \
221     .plot(kind = 'bar')
222 plt.title('AAP2017年月均交易量图')
223 plt.show()
224 
225 # 使用boxplot可以画出简单k线图
226 df_AAPL \
227     .groupby('month')['volume'] \
228     .mean() \
229     .plot(kind = 'bar')
230 plt.title('AAPL2017年月均交易量图')
231 plt.show()
232 
233 # 设置画布
234 fig, ax = plt.subplots(1,2, figsize = (9,4))
235 
236 df_amzn \
237     .loc[:, ['month','close']] \
238     .boxplot(by = 'month',
239              figsize = (8,6),
240              ax = ax[0]) \
241     .set(xlabel=None, title = 'AAP2017年月k图')
242 plt.suptitle('')
243 df_amzn \
244     .groupby('month')['volume'] \
245     .mean() \
246     .plot(kind = 'bar',
247           ax = ax[1],
248           title = 'AAP2017年月均交易量图')
249 plt.show()
250 
251 
252 # 设置画布
253 fig, ax = plt.subplots(1,2, figsize = (9,4))
254 
255 df_AAPL \
256     .loc[:, ['month','close']] \
257     .boxplot(by = 'month',
258              figsize = (8,6),
259              ax = ax[0]) \
260     .set(xlabel=None, title = 'AAPL2017年月k图')
261 plt.suptitle('')
262 df_AAPL \
263     .groupby('month')['volume'] \
264     .mean() \
265     .plot(kind = 'bar',
266           ax = ax[1],
267           title = 'AAPL2017年月均交易量图')
268 plt.show()
269 
270 # 散点图
271 df_amzn \
272     .loc[:, ['close', 'volume']] \
273     .plot(x = 'close', y = 'volume',
274           kind = 'scatter',
275           figsize = (8,6),
276           color = 'green',
277           title = 'AAP收盘价与成交量散点图')
278 plt.show()
279 print('AAP收盘价与成交量相关矩阵')
280 df_amzn.loc[:, ['close', 'volume']].corr()
281 
282 # 散点图
283 df_AAPL \
284     .loc[:, ['close', 'volume']] \
285     .plot(x = 'close', y = 'volume',
286           kind = 'scatter',
287           figsize = (8,6),
288           color = 'green',
289           title = 'AAPL收盘价与成交量散点图')
290 plt.show()
291 print('AAPL收盘价与成交量相关矩阵')
292 df_amzn.loc[:, ['close', 'volume']].corr()

 

总结
至此,我们学习了:

按需求选择图表
利用dataframe的函数功能结合\进行换行,使得整体代码整洁。
如何解释图表,发现图表传递的信息。


标签:数据分析,plt,python,df,可视化,close,date,ax,data
From: https://www.cnblogs.com/yangcong2002/p/17461638.html

相关文章

  • python爬虫:爬取b站热门视频的视频、音频、部分评论和弹幕,并将弹幕进行可视化。
    一.选题背景1.背景:爬虫是从互联网上抓取对于我们有价值的信息。选择此题正是因为随着信息化的发展,大数据时代对信息的采需求和集量越来越大,相应的处理量也越来越大,正是因为如此,爬虫相应的岗位也开始增多,因此,学好这门课也是为将来就业打下扎实的基础。bilibili在当今众多视频网站......
  • python----爬取猪肉价格
    一.选题背景猪肉是餐桌上重要的动物性食品之一,因其纤维较为细软,结缔组织较少,肌肉组织中含有较多的肌间脂肪,成为中国餐桌上不可缺少的一种食材。受餐饮业恢复、消费回暖的带动,猪肉消费逐步增加,生猪价格持续回升,猪肉及相关行业正处于逐步回暖状态。市场猪肉供应和合理价格运行,是涉......
  • python @property、@setter、@deleter的介绍与使用
    @property是一个装饰器,使一个方法可以像属性一样被使用,而不需要在调用的时候带上()0x01@property使用我们通过一个简单的研发需求为背景,逐步解释各个装饰器的使用这里领导给了个需求,开发一个类,可以返回一个人的姓,名字以及全名,十分简单嘛classPerson():def__init__(se......
  • Python大数据分析—BMI有关因素及健康分析
    一、数据说明1、背景介绍21世纪是人类追求健康的世纪;21世纪是人人享有保健的新时代。健康是人生最宝贵的财富!没有健康的身心一切无从谈起。随着经济发展和人们生活水平的迅速提高,人们在尽情享受现代文明成果的同时,生活条件提高了,可食品安全和环境卫生问题却层出不穷,生活质量......
  • 【20230607】【用Python让Excel飞起来】 第一章 python 快速上手 I
    001安装Anacondaanaconda.com直接下载,然后安装记得安装的时候将path和link.py点上,不然回头去配置环境变量有一些麻烦如何判断成功安装在CMD中输入conda-V即可查看002安装配置pycharm直接安装即可,官网下载,然后安装注意pycharm的pro版本是收费的,edu邮箱可以免费1年......
  • Python在循环中修改遍历的字符串
    举例展示Python在循环中修改遍历的字符串,将不会影响循环的遍历顺序和执行轮数astr="abcaef"bstr="bcef"foriinastr:ifinotinbstr:astr=astr.replace(i,'')print(i)如上示例代码中,当i='a'时,bstr中没有'a',输出'a'......
  • python线性脚本生成基本eml邮件,压缩文件,接口灌数据
    1importdatetime,zipfile,tarfile,logging,os,string,random,ipaddress,uuid,pytz,py7zr2importio,socket3fromemail.mime.textimportMIMEText4fromemail.mime.multipartimportMIMEMultipart5fromemail.mime.applicationimportMIMEA......
  • 实验六 turtle绘图与Python库应用编程体验
    试验任务一实验源码 task1fromturtleimport*defmove(x,y):'''画笔移动到坐标(x,y)处'''penup()goto(x,y)pendown()defdraw(n,size=100):'''绘制边长为size的正n变形'''foriinrange(n):......
  • Python: jwt
     importjwtfromdatetimeimportdatetimepayload_data={'sub':'4242','iss':'issuer',#issuerofthetoken'name':'JessicaTemporal','nickname':'Jess&#......
  • Python&Excel办公自动化
    操作工作簿01新建一个excel工作簿#2023-4-17importxlwingsasxw#启动excel,但不新建工作簿app是什么,app是excel程序本身app=xw.App(visible=True,add_book=True)#新建一个工作簿workbook=app.books.add()#保存新建的工作簿workbook.save('D:\python_data/tes......