相对强弱指数函数 Python
我正在创建一个函数,模仿股票交易者使用的相对强弱指数(RSI),用来找出偏离正常趋势的数据。RSI的计算公式是:100 - (100/1+RS),其中RS是指在某段时间内,成本中心平均值之上和之下的天数比。这里是我的代码:
def RIS(A):
X = cost_center_average(A)
a = 0
b = 0
for i in range(len(X)):
for j in range(len(A)):
for k in range(len(A[i])):
if A[j][0] in X[i]:
if A[j][k] > X[i][1]:
a = a + 1
else:
b = b + 1
RS = a/b
result = 100 - (100/(1+RS))
print A[j], result
break
这里是一些辅助函数(cost_center_average
)('cost_center_sum')('mean'):
def cost_center_average(A):
X = cost_center_sum(A)
Y = []
for i in range(len(X)):
Y += [[X[i][0]]+ [mean(X[i][1:])]]
return Y
NUMBER_OF_MONTHS = 12
def cost_center_sum(A):
dep = dict()
for row in A:
if row[0] not in dep:
dep[row[0]] = [0.0 for x in xrange(NUMBER_OF_MONTHS)]
for i in xrange(NUMBER_OF_MONTHS):
dep[row[0]][i] += row[i+2]
ret = list()
for department in sorted(dep.iterkeys()):
x = [department]
x.extend(dep[department])
ret.append(x)
return ret
def mean(values):
"""Returns the mean.
"""
return sum(values)*1.0/len(values)
我的输入A
是一个列表的列表,每个内层列表包含一个成本中心ID、员工ID和每月数据。我基本上想让这个函数匹配成本中心ID,统计超出(a
)和低于(b
)的数量,然后运行RSI公式。然而,我的代码似乎有问题,因为我的输出总是返回列表A[j]
,结果都是80。结果应该是不同的值,但不知为何,我的代码总是返回“结果”为80。有没有人知道我在逻辑或代码上哪里出错了?
示例输入:
[[136676.0, 12097.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334],[136710.0, 10273.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334],[136711.0, 10139.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334],[136712.0, 10271.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334],[136761.0, 10564.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.327274, 0.0, 0.0, 0.0, 0.545457],[136797.0, 10273.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334]]]
示例输出:
[136676.0, 12097.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334] 80
[136710.0, 10273.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334] 80
[136711.0, 10139.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334] 80
[136712.0, 10271.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334] 80
[136761.0, 10564.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.327274, 0.0, 0.0, 0.0, 0.545457] 80
[136797.0, 10273.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.333334] 80
附言:我测试过我的cost_center_average
辅助函数,它工作正常。
1 个回答
0
在Python中,代码的缩进很重要,它会影响代码的执行方式。例如:
if A[j][k] > X[i][1]:
a = a + 1
else:
b = b + 1
RS = a/b
result = 100 - (100/(1+RS))
print A[j], result
break
一旦你的代码找到第一个低于平均值的A[j][k],它就会进行RS计算,然后显示结果并结束。我可能没有完全理解你的问题,但我相信这不是你想要的结果。