赵走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、动手实践:向量加法
24、日期分析
资源编号:76376
人工智能
Numpy学习指南
热度:48
你是否有时候会有星期一焦虑症和星期五狂躁症?想知道股票市场是否受上述现象的影 响?我认为这值得深入研究。
你是否有时候会有星期一焦虑症和星期五狂躁症?想知道股票市场是否受上述现象的影 响?我认为这值得深入研究。 # 动手实践:分析日期数据 首先,我们要读入收盘价数据。随后,根据星期几来切分收盘价数据,并分别计算平均价格。 最后,我们将找出一周中哪一天的平均收盘价最高,哪一天的最低。在我们动手之前,有一个善 意的提醒:你可能希望利用分析结果在某一天买股票或卖股票,然而我们这里的数据量不足以做 出可靠的决策,请先咨询专业的统计分析师再做决定! 程序员不喜欢日期,因为处理日期总是很烦琐。NumPy是面向浮点数运算的,因此需要对日 期做一些专门的处理。请自行尝试如下代码,单独编写脚本文件或使用本书附带的代码文件: ``` dates, close=np.loadtxt('data.csv', delimiter=',', usecols=(1,6), unpack=True) ``` 执行以上代码后会得到一个错误提示: ``` ValueError: invalid literal for float(): 28-01-2011 ``` 按如下步骤处理日期。 ### (1) 显然,NumPy尝试把日期转换成浮点数。 我们需要做的是显式地告诉NumPy怎样来转换 日期,而这需要用到loadtxt函数中的一个特定的参数。这个参数就是converters,它是一本 数据列和转换函数之间进行映射的字典。 为此,我们必须写出转换函数: ``` # 星期一 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() ``` 我们将日期作为字符串传给datestr2num函数,如“28-01-2011”。这个字符串首先会按照 指定的形式"%d-%m-%Y"转换成一个datetime对象。补充一点,这是由Python标准库提供的功能, 与NumPy无关。随后,datetime对象被转换为date对象。最后,调用weekday方法返回一个数 字。如同你在注释中看到的,这个数字可以是0到6的整数,0代表星期一,6代表星期天。当然, 具体的数字并不重要,只是用作标识。 ### (2) 接下来,我们将日期转换函数挂接上去,这样就可以读入数据了。 ``` dates, close = np.loadtxt('data.csv', delimiter=',', usecols=(1, 6), unpack=True, converters={1: datestr2num}) print('dates:', dates) ``` 输出结果如下: ``` dates: [4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4. 1. 2. 3. 4. 0. 1. 2. 3. 4. 0. 1. 2. 3. 4.] ``` 如你所见,没有出现星期六和星期天。股票交易在周末是休市的。 ### (3) 我们来创建一个包含5个元素的数组,分别代表一周的5个工作日。数组元素将初始化为0。 ``` averages = np.zeros(5) ``` 这个数组将用于保存各工作日的平均收盘价。 ### (4) 我们已经知道,where函数会根据指定的条件返回所有满足条件的数组元素的索引值。 take函数可以按照这些索引值从数组中取出相应的元素。 我们将用take函数来获取各个工作日 的收盘价。在下面的循环体中,我们将遍历0到4的日期标识,或者说是遍历星期一到星期五,然 后用where函数得到各工作日的索引值并存储在indices数组中。在用take函数获取这些索引值 相应的元素值。最后,我们对每个工作日计算出平均值存放在averages数组中。代码如下: ``` for i in range(5): indices = np.where(dates == i) prices = np.take(close, indices) avg = np.mean(prices) print('Day:', i) print('prices:', prices) print('avg:', avg) print('*' * 30) averages[i] = avg ``` 输出结果如下: ``` Day: 0 prices: [[339.32 351.88 359.18 353.21 355.36]] avg: 351.7900000000001 ****************************** Day: 1 prices: [[345.03 355.2 359.9 338.61 349.31 355.76]] avg: 350.63500000000005 ****************************** Day: 2 prices: [[344.32 358.16 363.13 342.62 352.12 352.47]] avg: 352.1366666666666 ****************************** Day: 3 prices: [[343.44 354.54 358.3 342.88 359.56 346.67]] avg: 350.8983333333333 ****************************** Day: 4 prices: [[336.1 346.5 356.85 350.56 348.16 360. 351.99]] avg: 350.0228571428571 ****************************** ``` ### (5) 如果你愿意,还可以找出哪个工作日的平均收盘价是最高的,哪个是最低的。这很容易 做到,用max和min函数即可,代码如下: ``` print('averages=', averages) top = np.max(averages) print("Highest average:", top) print("Top day of the week:", np.argmax(averages)) bottom = np.min(averages) print("Lowest average:", bottom) print("Lowest average:", np.argmin(averages)) ``` 输出结果如下: ``` averages= [351.79 350.635 352.13666667 350.89833333 350.02285714] Highest average: 352.1366666666666 Top day of the week: 2 Lowest average: 350.0228571428571 Lowest average: 4 ``` # 刚才做了些什么 argmin 函数返回的是 averages 数组中最小元素的索引值, 这里是4, 也就是星期五。 而 argmax函数返回的是averages数组中最大元素的索引值,这里是2,也就是星期三。