Source code for pyreal.transformers.geo

import reverse_geocoder as rg

from pyreal.transformers import TransformerBase


[docs]class LatLongToPlace(TransformerBase): """ Converts latitude and longitude columns to neighborhood, city, or state/country names. """
[docs] def __init__( self, level=0, latitude_column="latitude", longitude_column="longitude", result_column="place", **kwargs ): """ Initialize the decoder. Args: level (int): Level of place to return, per Geoname's admin levels. 0 will generally be neighborhood, 1 will generally be city, and 2 will be state or country. latitude_column (string): Name of the column containing latitude. longitude_column (string): Name of the column containing longitude. result_column (string): Name of column to store the resulting locations in """ if level == 0: self.level = "name" elif level == 1: self.level = "admin2" elif level == 2: self.level = "admin1" else: raise ValueError( "level must be one of 0 (neighborhood), 1 (city), or 2 (state/country)" ) self.latitude_column = latitude_column self.longitude_column = longitude_column self.result_column = result_column super().__init__(**kwargs)
def data_transform(self, x): if self.latitude_column not in x: raise ValueError( "Configured latitude column (%s) not present in x" % self.latitude_column ) if self.longitude_column not in x: raise ValueError( "Configured longitude column (%s) not present in x" % self.longitude_column ) coordinates = list( x[[self.latitude_column, self.longitude_column]].itertuples(index=False, name=None) ) results = rg.search(coordinates, verbose=False) places = [result[self.level] for result in results] x[self.result_column] = places return x.drop(columns=[self.latitude_column, self.longitude_column]) def transform_explanation_feature_based(self, explanation): return explanation.combine_columns( [self.latitude_column, self.longitude_column], self.result_column )