Search code examples
google-cloud-datalabgoogle-earth-engine

NameError using LinearRegression() with python API


I'm trying to run some regressions in Earth Engine using Cloud Datalab. When I replicate the code in this regression tutorial (modifying it for python), I get this error:

NameErrorTraceback (most recent call last)
<ipython-input-45-21c9bd377408> in <module>()
     14 linearRegression = collection.reduce(
     15   ee.Reducer.linearRegression({
---> 16     numX: 2,
     17     numY: 2
     18 }))

NameError: name 'numX' is not defined

This does not seem to be an issue for other functions, and the same code works in the Javascript API. Is LinearRegression used differently in the python API?


Solution

  • You can pass arguments as python keyword arguments, like this:

    import ee
    ee.Initialize()
    
    # This function adds a time band to the image.
    def createTimeBand(image):
      # Scale milliseconds by a large constant.
      return image.addBands(image.metadata('system:time_start').divide(1e18))
    
    # This function adds a constant band to the image.
    def createConstantBand(image):
      return ee.Image(1).addBands(image)
    
    # Load the input image collection: projected climate data.
    collection = (ee.ImageCollection('NASA/NEX-DCP30_ENSEMBLE_STATS')
      .filterDate(ee.Date('2006-01-01'), ee.Date('2099-01-01'))
      .filter(ee.Filter.eq('scenario', 'rcp85'))
      # Map the functions over the collection, to get constant and time bands.
      .map(createTimeBand)
      .map(createConstantBand)
      # Select the predictors and the responses.
      .select(['constant', 'system:time_start', 'pr_mean', 'tasmax_mean']))
    
    # Compute ordinary least squares regression coefficients.
    linearRegression = (collection.reduce(
      ee.Reducer.linearRegression(
        numX= 2,
        numY= 2
    )))
    
    # Compute robust linear regression coefficients.
    robustLinearRegression = (collection.reduce(
      ee.Reducer.robustLinearRegression(
        numX= 2,
        numY= 2
    )))
    
    # The results are array images that must be flattened for display.
    # These lists label the information along each axis of the arrays.
    bandNames = [['constant', 'time'], # 0-axis variation.
                     ['precip', 'temp']] # 1-axis variation.
    
    # Flatten the array images to get multi-band images according to the labels.
    lrImage = linearRegression.select(['coefficients']).arrayFlatten(bandNames)
    rlrImage = robustLinearRegression.select(['coefficients']).arrayFlatten(bandNames)
    
    # Print to check it works
    print rlrImage.getInfo(), lrImage.getInfo()
    

    I have not checked the results, but there are no errors, the images are created.