我有一些基于每日收盘价的股票数据。我需要能够将这些值插入 python 列表并获得最后 30 次关闭的中值。有没有这样做的python库?
5 回答
在纯 Python 中,将数据放在 Python 列表中a
,您可以这样做
median = sum(sorted(a[-30:])[14:16]) / 2.0
(这假设a
至少有 30 个项目。)
使用 NumPy 包,您可以使用
median = numpy.median(a[-30:])
你考虑过熊猫吗?它基于numpy
并且可以自动将时间戳与您的数据相关联,并丢弃任何未知日期,只要您使用numpy.nan
. 它还通过 matplotlib 提供了一些相当强大的绘图功能。
基本上它是为python中的财务分析而设计的。
中位数不只是排序范围内的中间值吗?
所以,假设你的清单是stock_data
:
last_thirty = stock_data[-30:]
median = sorted(last_thirty)[15]
现在您只需要找到并修复一个错误并处理stock_data
少于 30 个元素的情况......
让我们在这里尝试一下:
def rolling_median(data, window):
if len(data) < window:
subject = data[:]
else:
subject = data[-30:]
return sorted(subject)[len(subject)/2]
#发现这很有帮助:
list=[10,20,30,40,50]
med=[]
j=0
for x in list:
sub_set=list[0:j+1]
median = np.median(sub_set)
med.append(median)
j+=1
print(med)
这是一个更快的方法 w*|x| 空间复杂度。
def moving_median(x, w):
shifted = np.zeros((len(x)+w-1, w))
shifted[:,:] = np.nan
for idx in range(w-1):
shifted[idx:-w+idx+1, idx] = x
shifted[idx+1:, idx+1] = x
# print(shifted)
medians = np.median(shifted, axis=1)
for idx in range(w-1):
medians[idx] = np.median(shifted[idx, :idx+1])
medians[-idx-1] = np.median(shifted[-idx-1, -idx-1:])
return medians[(w-1)//2:-(w-1)//2]
moving_median(np.arange(10), 4)
# Output
array([0.5, 1. , 1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8. ])
输出与输入向量的长度相同。少于一个条目的行将被忽略,其中一半为 nans(仅适用于偶数窗口宽度),仅返回第一个选项。这是上面的 shift_matrix 和各自的中值:
[[ 0. nan nan nan] -> -
[ 1. 0. nan nan] -> 0.5
[ 2. 1. 0. nan] -> 1.0
[ 3. 2. 1. 0.] -> 1.5
[ 4. 3. 2. 1.] -> 2.5
[ 5. 4. 3. 2.] -> 3.5
[ 6. 5. 4. 3.] -> 4.5
[ 7. 6. 5. 4.] -> 5.5
[ 8. 7. 6. 5.] -> 6.5
[ 9. 8. 7. 6.] -> 7.5
[nan 9. 8. 7.] -> 8.0
[nan nan 9. 8.] -> -
[nan nan nan 9.]]-> -
可以通过调整最终切片来更改行为medians[(w-1)//2:-(w-1)//2]
。
基准:
%%timeit
moving_median(np.arange(1000), 4)
# 267 µs ± 759 ns per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
替代方法:(结果将被转移)
def moving_median_list(x, w):
medians = np.zeros(len(x))
for j in range(len(x)):
medians[j] = np.median(x[j:j+w])
return medians
%%timeit
moving_median_list(np.arange(1000), 4)
# 15.7 ms ± 115 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
Both algorithms have a linear time complexity.
Therefore, the function moving_median
will be the faster option.