def segment_by_std_dev(series, increment=2, maximum=20):
"""
Divides a series into segments, minimizing standard deviation over window size. Windows are of varying size from
`increment` to `maximum * increment` at each offset `increment` within the series.
:param series:
:param increment:
:param maximum:
:return:
"""
duration = int(series.index[-2])
windows = []
for i in range(0, duration, increment):
for size in range(1, maximum + 1):
window = detrend(series[i:i + size*increment])
heappush(windows, (window.std() / (size*increment), i, i + size*increment))
segments = []
spots = set()
try:
while True:
window_agv_std, start, end = heappop(windows)
if any(i in spots for i in range(start, int(end))):
continue
for i in range(start, int(end)):
spots.add(int(i))
heappush(segments, (start, min(duration, end)))
except IndexError:
pass
return [heappop(segments) for _ in range(len(segments))]
评论列表
文章目录