From f6dd348eb6c0f705338db2d422de04e6e1f2e47d Mon Sep 17 00:00:00 2001
From: Chad Hanna <chad.hanna@ligo.org>
Date: Fri, 22 Mar 2019 20:25:51 -0700
Subject: [PATCH] cbc_template_fir: moving_median speed improvement

---
 gstlal-inspiral/python/cbc_template_fir.py | 31 ++++++++++++++--------
 1 file changed, 20 insertions(+), 11 deletions(-)

diff --git a/gstlal-inspiral/python/cbc_template_fir.py b/gstlal-inspiral/python/cbc_template_fir.py
index 892dccec9e..f56b1a7566 100644
--- a/gstlal-inspiral/python/cbc_template_fir.py
+++ b/gstlal-inspiral/python/cbc_template_fir.py
@@ -51,6 +51,7 @@ STATUS: reviewed with actions
 #
 
 
+import bisect
 import cmath
 import math
 import numpy
@@ -253,18 +254,26 @@ def compute_autocorrelation_mask( autocorrelation ):
 
 
 def movingmedian(interval, window_size):
+	interval = list(interval)
 	tmp = numpy.copy(interval)
-	try:
-		import pandas
-		try:
-			# pandas version >= 0.18.1 is required
-			tmp[window_size : len(interval) - window_size] = numpy.array(pandas.Series(tmp).rolling(2 * window_size).median()[2 * window_size - 1 : -1])
-		except AttributeError:
-			# pandas version < 0.18.1
-			tmp[window_size : len(interval) - window_size] = pandas.rolling_median(tmp, 2 * window_size)[2 * window_size - 1 : -1]
-	except ImportError:
-		for i in range(window_size, len(interval) - window_size):
-			tmp[i] = numpy.median(interval[i - window_size : i + window_size])
+	A = None
+	As = None
+	prev = None
+	for i in range(window_size, len(interval)-window_size):
+		if A is None:
+			A = interval[i-window_size:i+window_size]
+			ix = numpy.argsort(A)
+			As = list(numpy.array(A)[ix])
+		else:
+			newdata = interval[i+window_size-1]
+			A = A + [newdata]
+			bisect.insort(As, newdata)
+		if len(As) % 2:
+			tmp[i] = As[len(As)/2]
+		else:
+			tmp[i] = (As[len(As)/2-1] + As[len(As)/2]) / 2.
+		prev = A.pop(0)
+		del As[bisect.bisect_left(As, prev)]
 	return tmp
 
 
-- 
GitLab