def run(self, timeserieData, longitude=None, latitude=None, h=None, freq=None, startdate=None, enddate=None): freq = str(freq) if freq else self.frequency if (h is None): if self.time_change is not None and self.units is not None: h = bfast_utils.calculateMinimalSegmentSize( len(timeserieData), self.time_change, self.units, float(freq)) h = str(h) elif (h > 0.5): raise ValueError("minimum segment size error") startdate = str(startdate) if startdate else self.start_date enddate = str(enddate) if enddate else utils.isNow(self.end_date) # Must be in the following order: h, season, start_date, end_date, timeseriesData, freq bfast_result = check_output([ "integration/py/time-series/lib/bfast.r", str(h), self.season, startdate, enddate, str(timeserieData), freq ]) bfast_res_list = bfast_result.encode('utf-8').split(' ') bfast_res_float = map(float, bfast_res_list) return bfast_res_float
def run(self, timeserieData, longitude = None, latitude = None, h = None, freq = None, startdate = None, enddate = None): freq = str(freq) if freq else self.frequency if(h is None): if self.time_change is not None and self.units is not None: h = bfast_utils.calculateMinimalSegmentSize(len(timeserieData), self.time_change, self.units, float(freq)) h = str(h) elif(h>0.5): raise ValueError("minimum segment size error") startdate = str(startdate) if startdate else self.start_date enddate = str(enddate) if enddate else utils.isNow(self.end_date) # Must be in the following order: h, season, start_date, end_date, timeseriesData, freq bfast_result = check_output(["integration/py/time-series/lib/bfast.r", str(h), self.season, startdate, enddate, str(timeserieData), freq]) bfast_res_list = bfast_result.encode('utf-8').split(' ') bfast_res_float = map(float, bfast_res_list) return bfast_res_float
def trend(layerId, startYear, endYear, interpolation, groupData, timeChange, timeChangeUnits, geoJsonGeometry): #Obtem a série datasourceInstance = loader.getDatasource(layerId) timeserieData = datasourceInstance.lookup(geoJsonGeometry, mode="series") #Obtem as datas datesStr = utils.oneArray(timeserieData["values"], 0) #Obtem os valores entre os anos startYear e endYear clippedValues = bfast_utils.clipValuesByYear(startYear, endYear, timeserieData["values"], datesStr) values = clippedValues['values'] dates = clippedValues['dates'] startDate = dates[0] endDate = dates[-1] #Encontra o indice do filtro(se houver) e do bfast filters = loader.getFilters(layerId) bfastIndex = utils.findIndexByAttribute(filters, 'id', 'Bfast') # O filtro já foi calculado na datasource interpolation = interpolation if interpolation != "original" else 'STRING_NOT_FOUND'; interpolationIndex, interpolationPos = next(((i, item['position']) for i, item in enumerate(timeserieData["series"]) if item['id'] == interpolation), (-1, -1)) #Inicializa preparação do objeto de resposta series = [{'id':'Bfast', 'label':'BFAST', 'position':1, 'type':'trend'}] #Se há filtro selecionado, executa e adiciona ao objeto de resposta if interpolationPos != -1: values = utils.oneArray(timeserieData["values"], interpolationPos) series.append({'id':timeserieData["series"][interpolationIndex]["id"], 'label': timeserieData["series"][interpolationIndex]["label"], 'position': 2, 'type': 'filter'}) else: series.append({'id':'original', 'label':'Valores Originais', 'position':2, 'type':'original'}) #Agrupa os valores groupedData = bfast_utils.groupData(dates, values, groupData) values = groupedData['values'] frequency = groupedData['frequency'] dates = groupedData['dates'] #Calcula o valor do parâmetro h(minimal segment size) para o bfast minimalSegmentSize = bfast_utils.calculateMinimalSegmentSize(len(values), timeChange, timeChangeUnits, frequency) #Executa o BFAST result = [] if bfastIndex != -1: result = filters[bfastIndex].run(values, None, None, minimalSegmentSize, frequency, startDate, endDate) else: raise IndexError("Bfast filter could not be found.") #Acrescenta ao resultado as datas, os valores da tendência e os valores originais (agrupados ou não) datesList = [[i] for i in dates] utils.joinArray(datesList, result) result = datesList utils.joinArray(result, values) return { 'series': series, 'values': result }
def trend(layerId, startYear, endYear, interpolation, groupData, timeChange, timeChangeUnits, geoJsonGeometry): # Obtem a série datasourceInstance = loader.getDatasource(layerId) timeserieData = datasourceInstance.lookup(geoJsonGeometry, mode="series") # Obtem as datas datesStr = utils.oneArray(timeserieData["values"], 0) # Obtem os valores entre os anos startYear e endYear clippedValues = bfast_utils.clipValuesByYear(startYear, endYear, timeserieData["values"], datesStr) values = clippedValues['values'] dates = clippedValues['dates'] startDate = dates[0] endDate = dates[-1] # Encontra o indice do filtro(se houver) e do bfast filters = loader.getFilters(layerId) bfastIndex = utils.findIndexByAttribute(filters, 'id', 'Bfast') # O filtro já foi calculado na datasource interpolation = interpolation if interpolation != "original" else 'STRING_NOT_FOUND' interpolationIndex, interpolationPos = next( ((i, item['position']) for i, item in enumerate(timeserieData["series"]) if item['id'] == interpolation), (-1, -1)) # Inicializa preparação do objeto de resposta series = [{ 'id': 'Bfast', 'label': 'BFAST', 'position': 1, 'type': 'trend' }] # Se há filtro selecionado, executa e adiciona ao objeto de resposta if interpolationPos != -1: values = utils.oneArray(timeserieData["values"], interpolationPos) series.append({ 'id': timeserieData["series"][interpolationIndex]["id"], 'label': timeserieData["series"][interpolationIndex]["label"], 'position': 2, 'type': 'filter' }) else: series.append({ 'id': 'original', 'label': 'Valores Originais', 'position': 2, 'type': 'original' }) # Agrupa os valores groupedData = bfast_utils.groupData(dates, values, groupData) values = groupedData['values'] frequency = groupedData['frequency'] dates = groupedData['dates'] # Calcula o valor do parâmetro h(minimal segment size) para o bfast minimalSegmentSize = bfast_utils.calculateMinimalSegmentSize( len(values), timeChange, timeChangeUnits, frequency) # Executa o BFAST result = [] if bfastIndex != -1: result = filters[bfastIndex].run(values, None, None, minimalSegmentSize, frequency, startDate, endDate) else: raise IndexError("Bfast filter could not be found.") # Acrescenta ao resultado as datas, os valores da tendência e os valores originais (agrupados ou não) datesList = [[i] for i in dates] utils.joinArray(datesList, result) result = datesList utils.joinArray(result, values) return {'series': series, 'values': result}