def random_threshold(self): day_time = time_of_day(self.time) week_day = day_of_week(self.time) next = list(dropwhile(lambda m: m[0] <= day_time, self.rates[week_day])) if len(next) == 0: next_time = 24*60*60 else: next_time = next[0][0] return next_time - day_time
def random_threshold(self): day_time = time_of_day(self.time) week_day = day_of_week(self.time) next = list(dropwhile(lambda m: m[0] <= day_time, self.rates[week_day])) if len(next) == 0: next_time = 24 * 60 * 60 else: next_time = next[0][0] return next_time - day_time
def test(source): s = CDRStream(asterisk_like, source) s.start() hours = np.zeros(24) l = [] days = 1 prev = 0 pattern = None for st in s: cdr = csv_to_cdr(list(csv.reader(StringIO(st), delimiter=','))[0]) if time_of_day(cdr.start) < prev: days += 1 if days > 14 and pattern is None: pattern = hours/days hours = np.zeros(24) if days > 14 and days%7 == 0: print(np.linalg.norm(hours/(days-14) - pattern)) h = time_of_day(cdr.start)//60//60 hours[h] += 1 prev = time_of_day(cdr.start) #l.append(h) fingerprint = hours/days print(fingerprint)
def is_conform(self, cdr): # FIXME: pattern should no check conforming, it's another task day = day_of_week(cdr.start) freq = self.get_pattern()[day][time_of_day(cdr.start)//60//60] current = np.roll(self.current, 1) current[0] = cdr.start diffs = np.array([e[0]-e[1] for e in zip(current, current[1:])]) current_freq = (60*60)/moving_average_exponential(diffs, ALPHA_FREQ) limits = poisson_interval(freq, 1-0.997) # float if not (current_freq <= max(1.0, limits[1]*ALARM_THRESHOLD)): print(freq, current_freq, max(1, limits[1]*ALARM_THRESHOLD), ) return current_freq <= max(1.0, limits[1]*ALARM_THRESHOLD)
def maintain(self, cdr): """ Maintaining should be continuous Calls have to be sorted by cdr.start time """ time = time_of_day(cdr.start)//(TIME_DISCRETIZATION//APPROX_WINDOW) day = day_of_week(cdr.start) if self.last_day_of_week != day and day == 0: # week switched self.data = np.roll(self.data, 1, axis=0) self.data[0] = self.extract_week_history() self.week_history = np.zeros(shape=(7, (24*60*60)//(TIME_DISCRETIZATION//APPROX_WINDOW))) self.weeks += 1 self.last_day_of_week = day self.current = np.roll(self.current, 1) # for instantaneous frequency self.current[0] = cdr.start # new freq calc current = np.roll(self.current, 1) current[0] = cdr.start diffs = np.array([e[0]-e[1] for e in zip(current, current[1:])]) current_freq = (60*60)/moving_average_exponential(diffs, ALPHA_FREQ) self.week_history[day, time] = max(self.week_history[day, time], current_freq)
def rate(self): day_time = time_of_day(self.time) week_day = day_of_week(self.time) return np.interp(day_time, [x[0] for x in self.rates[week_day]], [x[1] for x in self.rates[week_day]])