コード例 #1
0
ファイル: bfast.py プロジェクト: lapig-ufg/d-pat
    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
コード例 #2
0
ファイル: bfast.py プロジェクト: lapig-ufg/lapig-maps
	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
コード例 #3
0
ファイル: time_series.py プロジェクト: lapig-ufg/lapig-maps
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
	}
コード例 #4
0
ファイル: time_series.py プロジェクト: lapig-ufg/d-pat
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}