赵走x博客
首页
书籍
软件
工具
古诗词
搜索
登录
29、布林带
28、指数移动平均线
27、简单移动平均线
26、真实波动幅度均值(ATR)
25、周汇总
24、日期分析
23、股票收益率
22、统计分析
21、取值范围:找到最大值和最小值
20、成交量加权平均价格(VWAP)
19、CSV 文件
18、文件读写
17、动手实践:数组的转换
16、数组的属性
15、数组的分割
14、数组的组合
13、动手实践:改变数组的维度
12、动手实践:多维数组的切片和索引
11、一维数组的索引和切片
10、动手实践:创建自定义数据类型
9、dtype 类的属性
8、自定义数据类型
7、字符编码
6、数据类型对象
5、NumPy 数据类型
4、选取数组元素
3、动手实践:创建多维数组
2、NumPy 数组对象
1、动手实践:向量加法
25、周汇总
资源编号:76377
人工智能
Numpy学习指南
热度:36
在之前的“动手实践”教程中,我们用的是盘后数据。也就是说,这些数据是将一整天的交 易数据汇总得到的。如果你对棉花市场感兴趣,并且有数十年的数据,你可能希望对数据做进一 步的汇总和压缩。开始动手吧。我们来把苹果股票数据按周进行汇总。
在之前的“动手实践”教程中,我们用的是盘后数据。也就是说,这些数据是将一整天的交 易数据汇总得到的。如果你对棉花市场感兴趣,并且有数十年的数据,你可能希望对数据做进一 步的汇总和压缩。开始动手吧。我们来把苹果股票数据按周进行汇总。 # 动手实践:汇总数据 我们将要汇总整个交易周中从周一到周五的所有数据。数据覆盖的时间段内有一个节假日: 2月21日是总统纪念日。这天是星期一,美国股市休市,因此在我们的示例数据中没有这一天的 数据记录。数据中的第一天为星期五,处理起来不太方便。按照如下步骤来汇总数据。 ### (1) 为了简单起见,我们只考虑前三周的数据,这样就避免了节假日造成的数据缺失。你可 以稍后尝试对其进行拓展。 ``` # 星期一 0 # 星期二 1 # 星期三 2 # 星期四 3 # 星期五 4 # 星期六 5 # 星期日 6 def datestr2num(s): s = s.decode('utf-8') return datetime.datetime.strptime(s, "%d-%m-%Y").date().weekday() dates, open, high, low, close = np.loadtxt('data.csv', delimiter=',', usecols=(1, 3, 4, 5, 6), unpack=True, converters={1: datestr2num}) close = close[:16] dates = dates[:16] ``` ### (2) 首先我们来找到示例数据中的第一个星期一。 回忆一下,在Python中星期一对应的编码 是0,这可以作为where函数的条件。接着,我们要取出数组中的首个元素,其索引值为0。但where函数返回的结果是一个多维数组,因此要用ravel函数将其展平。 ``` # 找到第一个星期一 first_monday = np.ravel(np.where(dates == 0))[0] print("The first Monday index is:", first_monday) ``` 输出结果如下: ``` The first Monday index is: 1 ``` ### (3) 下面要做的是找到示例数据的最后一个星期五,方法和找第一个星期一类似。星期五相 对应的编码是4。此外,我们用-1作为索引值来定位数组的最后一个元素。 ``` # 找到最后一个星期五 last_friday = np.ravel(np.where(dates == 4))[-1] print("The last Friday index is:", last_friday) ``` 输出结果如下: ``` The last Friday index is: 15 ``` 接下来创建一个数组,用于存储三周内每一天的索引值。 ``` weeks_indices = np.arange(first_monday, last_friday + 1) print("Weeks indices initial:", weeks_indices) ``` 输出: ``` Weeks indices initial: [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15] ``` ### (4) 按照每个子数组5个元素,用split函数切分数组: ``` weeks_indices = np.split(weeks_indices, 5) print("Weeks indices after split:", weeks_indices) ``` 输出结果如下: ``` Weeks indices after split: [array([1, 2, 3]), array([4, 5, 6]), array([7, 8, 9]), array([10, 11, 12]), array([13, 14, 15])] ``` ### (5) 在NumPy中,数组的维度也被称作轴。现在我们来熟悉一下apply_along_axis函数。 这个函数会调用另外一个由我们给出的函数,作用于每一个数组元素上。目前我们的数组中有3 个元素,分别对应于示例数据中的3个星期,元素中的索引值对应于示例数据中的1天。在调用 apply_along_axis时提供我们自定义的函数名summarize,并指定要作用的轴或维度的编号 (如取1)、目标数组以及可变数量的summarize函数的参数。 ``` week_summary = np.apply_along_axis(summarize, 1, weeks_indices, open, high, low, close) print("Week summary:", week_summary) ``` Out: ``` Week summary: [['APPL' '335.8' '345.65' '334.3' '344.32'] ['APPL' '343.8' '353.25' '338.55' '351.88'] ['APPL' '353.68' '360.0' '348.0' '354.54'] ['APPL' '354.75' '359.97' '353.54' '359.9'] ['APPL' '360.8' '364.9' '349.52' '350.56']] ``` ### (6) 编写summarize函数。 该函数将为每一周的数据返回一个元组,包含这一周的开盘价、 最高价、最低价和收盘价,类似于每天的盘后数据。 ``` def summarize(a, o, h, l, c): monday_open = o[a[0]] week_high = np.max(np.take(h, a)) week_low = np.min(np.take(l, a)) friday_close = c[a[-1]] return "APPL", monday_open, week_high, week_low, friday_close ``` 注意,我们用take函数来根据索引值获取数组元素的值,并用max和min函数轻松计算出一 周的最高股价和最低股价。一周的开盘价即为周一的开盘价,而一周的收盘价即为周五的收盘价。 ### (7) 使用NumPy中的savetxt函数,将数据保存至文件。 ``` np.savetxt("week_summary.csv", week_summary, delimiter=',', fmt="%s") ``` 如代码中所示,我们指定了文件名、需要保存的数组名、分隔符(在这个例子中为英文标点 逗号)以及存储浮点数的格式。 格式字符串以一个百分号开始。接下来是一个可选的标志字符:-表示结果左对齐,0表示 左端补0,+表示输出符号(正号+或负号-)。第三部分为可选的输出宽度参数,表示输出的最小 位数。第四部分是精度格式符,以"."开头,后面跟一个表示精度的整数。最后是一个类型指定字 符,在我们的例子中指定为字符串类型。 ![bs64](https://img.handsomemark.com/2020/03/02/543db2a8-5c98-11ea-a190-0242ac120003.png) # 刚才做了些什么 我们刚刚完成的事情在其他编程语言中几乎是无法完成的。 我们定义了一个函数 summarize , 把它作为参数传给了 apply_along_axis 函数, 而 summarize 的参数也通过apply_along_axis的参数列表便捷地传递了过去。