这次我们来学画另一张散点图。
建筑兔零基础自学python记录8|学画散点图/Scatter plot-CSDN博客我们学过了散点图的画法,上一次我们基本是用随机数来生成的。这一次我们学从csv数据中(类似excel)获取对应值,对股票价格进行可视化。
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.cbook as cbook
price_data = cbook.get_sample_data('goog.npz')['price_data']
price_data = price_data[-250:] # get the most recent 250 trading days
delta1 = np.diff(price_data["adj_close"]) / price_data["adj_close"][:-1]
volume = (15 * price_data["volume"][:-2] / price_data["volume"][0])**2
close = 0.003 * price_data["close"][:-2] / 0.003 * price_data["open"][:-2]
fig, ax = plt.subplots()
ax.scatter(delta1[:-1], delta1[1:], c=close, s=volume, alpha=0.5)
ax.set_xlabel(r'$\Delta_i$', fontsize=15)
ax.set_ylabel(r'$\Delta_{i+1}$', fontsize=15)
ax.set_title('Volume and percent change')
ax.grid(True)
fig.tight_layout()
plt.show()
看了源代码,还是先把不会的代码找出来:
(1)matplotlib.cbook是
一个工具模块,主要完成数据处理、文件操作、兼容性处理的事情。本次主要是获取实例文件。其中cbook.get_sample_data
函数是 matplotlib.cbook
模块提供的一个工具,它可以获取 matplotlib
自带的示例数据文件。
(2)price_data
是一个 NumPy
记录数组。每一列可以有不同的数据类型,并且每列都有一个对应的字段名。(类似excel的表中的列)
date
:存储交易日期,一般以 np.datetime64
类型且以天为单位('D'
)记录。open
:开盘价,即每个交易日开始时的股票价格。high
:最高价,该交易日内股票达到的最高价格。low
:最低价,该交易日内股票达到的最低价格。close
:收盘价,每个交易日结束时的股票价格。volume
:成交量,该交易日内交易的股票数量。adj_close
:调整收盘价,考虑了股票分红、拆股等因素后调整过的收盘价。(3)'goog.npz'
文件:这是一个以 .npz
为扩展名的文件,它是 NumPy
专用的压缩存档文件,通常用于存储多个 NumPy
数组。在这个文件里,包含了谷歌公司股票的相关数据。
(4)price_data = price_data[-250:]
[-250:]
表示从数组的倒数第 250 个元素开始,一直取到数组的末尾。即筛选出最近的 250 个交易日的股票价格数据。综合解释如下:
#导入获取文件的cbook模块
import matplotlib.cbook as cbook
#通过cbook获取样本数据,样本数据名为'goog.npz'
price_data = cbook.get_sample_data('goog.npz')['price_data']
#筛选出最近的 250 个交易日的股票价格数据
price_data = price_data[-250:] # get the most recent 250 trading days
(5)np.diff()
np.diff
函数用于计算数组中相邻元素之间的差值。
numpy.diff(a, n=1, axis=-1)
a
:必需的参数,一个输入的 NumPy
数组,函数会对这个数组的元素进行差分计算。n
:可选参数,代表差分的阶数,默认值为 1。如果 n
设为 2,就会对一阶差分的结果再进行一次差分运算,以此类推。axis
:可选参数,用于指定在哪个轴上进行差分计算,默认是最后一个轴。 当对 price_data["adj_close"]
调用 np.diff
时,它会计算相邻交易日调整收盘价的差值。例如,若调整收盘价数组为 [p1, p2, p3, p4]
,那么 np.diff([p1, p2, p3, p4])
的结果就是 [p2 - p1, p3 - p2, p4 - p3]
。注意,经过 np.diff
处理后得到的数组长度会比原数组少 1。
补充:delta在这里出现主要是用到股票里的定义——delta代表股价每变动$1,期权对应权价格的变动值
(6)price_data["adj_close"] 提取出所有交易日的调整收盘价,得到一个一维的 NumPy
数组。(即把'goog.npz'文件里的"adj_close"调整收盘价这一列提取出来)
"adj_close"
是 price_data
中的一个字段,代表调整收盘价。(7)代码中的[-250:]
还有[:-1]是切片操作。切片操作是指从序列(如列表、元组、字符串、NumPy
数组等)中选取部分元素的操作。可以理解为excel提取一列数据。切片操作表示为:
sequence[start:stop:step]
start
:可选参数,表示切片的起始位置,默认为 0。stop
:可选参数,表示切片的结束位置(不包含该位置的元素),默认为序列的长度。step
:可选参数,表示切片的步长,默认为 1。delta1 = np.diff(price_data["adj_close"]) / price_data["adj_close"][:-1]
这个代码 price_data["adj_close"][:-1]运用了切片函数,表示为选取 price_data["adj_close"]
数组中除最后一个元素之外的所有元素。这样做的目的是让这个数组和np.diff(price_data["adj_close"])
的结果长度一致,因为 np.diff
计算相邻元素差值后得到的数组长度比原数组少 1,通过切片操作可以确保两个数组能进行逐元素的除法运算,从而正确计算出相邻交易日调整收盘价的变化率。
:
:这里省略了起始位置,意味着从数组的开头开始选取元素。-1
:表示结束位置为数组的倒数第一个元素(不包含该元素)。相邻两个交易日之间调整收盘价的变化率
volume = (15 * price_data["volume"][:-2] / price_data["volume"][0])**2
volume
=成交量,是price_data
()函数的参数。
使用切片操作 [:-2]
选取成交量数组中除最后两个元素之外的所有元素。
close = 0.003 * price_data["close"][:-2] / 0.003 * price_data["open"][:-2]
close
=收盘价,是price_data
()函数的参数。其中["open"]代表开盘价
=收盘价与开盘价的比值
ax.scatter(delta1[:-1], delta1[1:], c=close, s=volume, alpha=0.5)
delta1
是之前计算得到的数组,存储着相邻两个交易日调整收盘价的变化率。x=表示第 i
个交易日的价格变化率,即delta1
数组中除最后一个元素之外的所有元素
y=表示第 i + 1
个交易日的价格变化率,即delta1
数组中除第一个元素之外的所有元素
c=颜色=根据 close
数组中对应位置的值进行映射
s=散点大小=根据 volume
数组中的值(成交量较大的交易日对应的散点会更大,从而直观地展示成交量的相对大小)
alpha=0.5,即半透明
(8)
ax.set_xlabel(r'$\Delta_i$', fontsize=15)
ax.set_ylabel(r'$\Delta_{i+1}$', fontsize=15)
r'$\Delta_i$'
\
被 Python 解释为转义字符。r'...'
当r与引号结合使用会改变字符串中反斜杠 \
的处理方式。$
是 LaTeX 数学模式的标识符。\Delta
表示希腊字母 ,_i
表示下标 i
。 r'$\Delta_i$'
显示为
同理解读r'$\Delta_{i+1}$'显示为
(9)fig.tight_layout()
是自动调整图形布局的一个方法。自动调整图形(Figure
对象)中各个子图(Axes
对象)、坐标轴标签、标题等元素的位置和间距,使得它们能够合理地填充整个图形区域,避免元素之间出现重叠,并且让图形的布局更加紧凑和美观。
以下就是整段代码解读:
import matplotlib.pyplot as plt
import numpy as np
#导入获取文件的cbook模块
import matplotlib.cbook as cbook
#通过cbook获取样本数据,样本数据名为'goog.npz'
price_data = cbook.get_sample_data('goog.npz')['price_data']
#筛选出最近的 250 个交易日的股票价格数据
price_data = price_data[-250:]
#相邻两个交易日之间调整收盘价的变化率
delta1 = np.diff(price_data["adj_close"]) / price_data["adj_close"][:-1]
#volume=成交量,每个交易日成交量相对于第一个交易日成交量的比例
volume = (15 * price_data["volume"][:-2] / price_data["volume"][0])**2
#close=收盘价,收盘价与开盘价的比值
close = 0.003 * price_data["close"][:-2] / 0.003 * price_data["open"][:-2]
fig, ax = plt.subplots()
#x=表示第 i 个交易日的价格变化率,即delta1 数组中除最后一个元素之外的所有元素
#y=表示第 i + 1 个交易日的价格变化率,即delta1 数组中除第一个元素之外的所有元素
#颜色为收盘价与开盘价的比值的映射,散点大小为每个交易日成交量相对于第一个交易日成交量的比例的映射
ax.scatter(delta1[:-1], delta1[1:], c=close, s=volume, alpha=0.5)
#x轴y轴标签,字体大小15
ax.set_xlabel(r'$\Delta_i$', fontsize=15)
ax.set_ylabel(r'$\Delta_{i+1}$', fontsize=15)
ax.set_title('Volume and percent change')
ax.grid(True)
#自动调整布局
fig.tight_layout()
plt.show()
总结:
本次主要是结合外部数据进行数据处理,用到差值、切片提取等方式绘制散点图。
price_data()记录股票数组(类似记录股票的excel)
np.diff()
函数用于计算数组中相邻元素之间的差值。$
是 LaTeX 数学模式的标识符。\Delta
表示希腊字母 ,_i
表示下标 i
。fig.tight_layout()
是自动调整图形布局