我有一个浮点数列表,我想从第一个列表中生成另一个句点返回列表。
这是一个工厂实施的运行(未经过测试 - 并且几乎没有错误检查/处理):
a = [100,105,100,95,100]
def calc_period_returns(values, period):
output = []
startpos, endpos = (period, len(values)-1)
while True:
current = values[startpos]
previous = values[startpos-period]
ret = 100*((current-previous)/(1.0*previous))
output.append(ret)
startpos += period
if startpos > endpos:
break
return output
calc_period_returns(a,1)
# Expected output:
# [5.0, -4.7619047619047619, -5.0, 5.2631578947368416]
是否有更多的pythonic方式 - 可能使用列表理解和地图?
答案 0 :(得分:17)
我不知道你的数字列表有多大,但是如果要处理大量的数字,你应该看看numpy。副作用是计算看起来更简单。
使用numpy,您可以为数据创建数组
>>> import numpy as np
>>> a = np.array([100,105,100,95,100], dtype=float)
并使用数组,就像它们是简单的数字一样
>>> np.diff(a) / a[:-1] * 100.
[ 5. -4.76190476 -5. 5.26315789]
答案 1 :(得分:11)
你走了:
>>> [100.0 * a1 / a2 - 100 for a1, a2 in zip(a[1:], a)]
[5.0, -4.7619047619047592, -5.0, 5.2631578947368354]
由于您要比较列表的邻居元素,最好创建一个您感兴趣的对列表,如下所示:
>>> a = range(5)
>>> a
[0, 1, 2, 3, 4]
>>> zip(a, a[1:])
[(0, 1), (1, 2), (2, 3), (3, 4)]
之后,从一对数字中提取百分比变化只是一个简单的数学计算。
答案 2 :(得分:1)
感谢您的回答!如果有人想复制粘贴(例如我),我会根据您的答案实现一个功能:
def pct_change(nparray):
pct=np.zeros_like(nparray)
pct[1:]=np.diff(nparray) / np.abs(nparray[:-1])
#TODO zero divisionerror
return pct
答案 3 :(得分:0)
您也可以这样做:
>>> a = [100,105,100,95,100]
>>> [(a[i]-a[i-1])/a[i-1] for i in range(1, len(a))]
[0.05, -0.047619047619047616, -0.05, 0.05263157894736842]