def __init__( self, start, stop, *, subscriber_identifier="msisdn", statistic="sum", spatial_unit: Optional[AnySpatialUnit] = None, hours="all", subscriber_subset=None, ): self.start = standardise_date(start) self.stop = standardise_date(stop) self.subscriber_identifier = subscriber_identifier if spatial_unit is None: self.spatial_unit = make_spatial_unit("admin", level=3) else: self.spatial_unit = spatial_unit self.statistic = statistic.lower() if self.statistic not in valid_stats: raise ValueError( "{} is not a valid statistic. Use one of {}".format( self.statistic, valid_stats ) ) column_list = [ "id", self.subscriber_identifier, "msisdn_counterpart", "outgoing", "duration", "location_id", "datetime", ] unioned_query = location_joined_query( EventsTablesUnion( self.start, self.stop, tables="events.calls", columns=column_list, hours=hours, subscriber_subset=subscriber_subset, subscriber_identifier=self.subscriber_identifier, ), spatial_unit=self.spatial_unit, time_col="datetime", ) self.joined = unioned_query.subset("outgoing", "t").join( unioned_query.subset("outgoing", "f"), on_left="id", on_right="id", right_append="_counterpart", how="left", ) warnings.warn("This query is considerably slower than the other variants.") super().__init__()
def __init__( self, start: str, stop: str, *, table: Union[None, List[str]] = None, spatial_unit: AnySpatialUnit = make_spatial_unit("cell"), interval: str = "hour", direction: Union[str, Direction] = Direction.BOTH, hours: Optional[Tuple[int, int]] = None, subscriber_subset=None, subscriber_identifier="msisdn", ): self.start = standardise_date(start) self.stop = standardise_date(stop) self.table = table self.spatial_unit = spatial_unit self.interval = interval self.direction = Direction(direction) if self.interval not in self.allowed_intervals: raise ValueError("'Interval must be one of: {} got: {}".format( self.allowed_intervals, self.interval)) self.time_cols = ["(datetime::date)::text AS date"] if self.interval == "hour" or self.interval == "min": self.time_cols.append("extract(hour FROM datetime) AS hour") if self.interval == "min": self.time_cols.append("extract(minute FROM datetime) AS min") events_tables_union_cols = [ "location_id", "datetime", subscriber_identifier ] # if we need to filter on outgoing/incoming calls, we will also fetch this # column. Don't fetch it if it is not needed for both efficiency and the # possibility that we might want to do pass another data type which does not # have this information. events_tables_union_cols += self.direction.required_columns self.unioned = location_joined_query( EventsTablesUnion( self.start, self.stop, tables=self.table, columns=events_tables_union_cols, hours=hours, subscriber_subset=subscriber_subset, subscriber_identifier=subscriber_identifier, ), spatial_unit=self.spatial_unit, time_col="datetime", ) super().__init__()
def __init__( self, start, stop, *, subscriber_identifier="msisdn", direction: Union[str, Direction] = Direction.OUT, statistic="sum", spatial_unit: Optional[AnySpatialUnit] = None, hours="all", subscriber_subset=None, ): self.start = standardise_date(start) self.stop = standardise_date(stop) self.subscriber_identifier = subscriber_identifier self.direction = Direction(direction) if spatial_unit is None: self.spatial_unit = make_spatial_unit("admin", level=3) else: self.spatial_unit = spatial_unit self.statistic = statistic.lower() if self.statistic not in valid_stats: raise ValueError( "{} is not a valid statistic. Use one of {}".format( self.statistic, valid_stats ) ) column_list = [ self.subscriber_identifier, "msisdn_counterpart", "duration", "location_id", "datetime", *self.direction.required_columns, ] self.unioned_query = location_joined_query( EventsTablesUnion( self.start, self.stop, tables="events.calls", columns=column_list, hours=hours, subscriber_subset=subscriber_subset, subscriber_identifier=self.subscriber_identifier, ), spatial_unit=self.spatial_unit, time_col="datetime", ) super().__init__()
def __init__( self, start, stop, statistic="avg", *, spatial_unit: AnySpatialUnit = make_spatial_unit("cell"), hours="all", tables="all", subscriber_identifier="msisdn", direction: Union[str, Direction] = Direction.BOTH, subscriber_subset=None, ): self.start = standardise_date(start) self.stop = standardise_date(stop) self.spatial_unit = spatial_unit self.hours = hours self.tables = tables self.subscriber_identifier = subscriber_identifier self.direction = Direction(direction) self.statistic = statistic if self.statistic not in valid_stats: raise ValueError( "{} is not a valid statistic. Use one of {}".format( self.statistic, valid_stats)) column_list = [ self.subscriber_identifier, "location_id", "datetime", *self.direction.required_columns, ] self.unioned_query = location_joined_query( EventsTablesUnion( self.start, self.stop, tables=self.tables, columns=column_list, hours=hours, subscriber_identifier=subscriber_identifier, subscriber_subset=subscriber_subset, ), spatial_unit=self.spatial_unit, time_col="datetime", ) super().__init__()
def __init__( self, start: str, stop: str, *, table: str = "all", spatial_unit: AnySpatialUnit = make_spatial_unit("cell"), direction: Union[Direction, str] = Direction.BOTH, hours: Optional[Tuple[int, int]] = None, subscriber_subset=None, subscriber_identifier="msisdn", ): self.start = standardise_date(start) self.stop = standardise_date(stop) self.table = table self.spatial_unit = spatial_unit self.direction = Direction(direction) self.unioned_query = location_joined_query( EventsTablesUnion( self.start, self.stop, columns=[ "id", "outgoing", "location_id", "datetime", subscriber_identifier, ], tables=self.table, hours=hours, subscriber_subset=subscriber_subset, subscriber_identifier=subscriber_identifier, ), spatial_unit=self.spatial_unit, time_col="datetime", ) super().__init__()