我正试图在一列上创建一个移动平均值。以下是以两种不同方式实现的循环:
方法1
for j in range (0,len(dataset_train)):
dataset_train.loc[j+1,'TR'] = max(
abs(dataset_train.loc[j+1,'High']-dataset_train.loc[j+1,'Low']),
abs(dataset_train.loc[j,'Close']-dataset_train.loc[j+1,'Low']),
abs(dataset_train.loc[j+1,'High']-dataset_train.loc[j,'Close']),
)
dataset_train.loc[j+13, 'ATR'] = dataset_train.loc[j:j+13,'TR'].sum()/14
方法2
for j in range (0,len(dataset_train)):
dataset_train.loc[j+1,'TR'] = max(
abs(dataset_train.loc[j+1,'High']-dataset_train.loc[j+1,'Low']),
abs(dataset_train.loc[j,'Close']-dataset_train.loc[j+1,'Low']),
abs(dataset_train.loc[j+1,'High']-dataset_train.loc[j,'Close']),
)
dataset_train.loc[j+13, 'ATR'] = dataset_train.loc[j:j+13,'TR'].mean()
方法1产生0.0002142857142857224,方法2产生0.003000000001137。然而,当我通过print(dataset_train.loc[0:13, 'TR'].sum()/14)
和print(dataset_train.loc[0:13,'TR'].mean()
查看数据集的前14个值时,我得到了两者相同的答案:0.0022857142857143514。
这三段代码的工作方式是否不一致?看起来,如果指数为0,它们都应该得到相同的答案。
编辑:
以下是我正在使用的数据:
print(dataset_train.loc[0:13,'TR'+i])
0 0.000
1 0.003
2 0.002
3 0.002
4 0.004
5 0.002
6 0.002
7 0.002
8 0.003
9 0.002
10 0.002
11 0.003
12 0.002
13 0.003
假设不匹配是最后一行结果:
CCD_ 3实际上计算切片中有多少元素。
.sum()/14
没有。无论[j:j+13,'TR']
实际切片多少个元素,它都将除以14
看看这个:
>>> l1 = [1, 2, 3, 4]
>>> l1[0:3]
[1, 2, 3]
>>> l1[1:4]
[2, 3, 4]
>>> l1[2:5]
[3, 4]
>>> l1[3:6]
[4]
>>> l1[4:7]
[]
我认为,您只需要将for j in range (0,len(dataset_train)):
修改为for j in range (0,len(dataset_train-13)):
,因为两种方法之间的结果差异应该位于数据的末尾,在那里休息点的数量将小于14。