一、选题的背景
股票市场一直是金融领域的焦点之一,对股票数据进行大数据分析有助于了解市场趋势、预测价格波动、优化投资策略等。随着大数据技术的快速发展和 应用,越来越多的投资者、交易员和分析师开始利用大数据技术来解读和分析股票市场数据。通过对股票数据的大数据分析可以提供有关市场走势、投资机会和风险的深入洞察,帮助投资者和交易员做出明智的决策,并提高投资和交易的效果。结合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