From f86eb557827c949c27b3a078b203688174662073 Mon Sep 17 00:00:00 2001 From: bstabler Date: Fri, 25 Jun 2021 16:56:44 -0700 Subject: [PATCH 1/2] for #431 --- activitysim/core/util.py | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/activitysim/core/util.py b/activitysim/core/util.py index 6bed9c3111..8b682a5bc1 100644 --- a/activitysim/core/util.py +++ b/activitysim/core/util.py @@ -242,32 +242,13 @@ def quick_loc_df(loc_list, target_df, attribute=None): ------- pandas.DataFrame or, if attribbute specified, pandas.Series """ - - left_on = "left" - - if isinstance(loc_list, pd.Int64Index): - left_df = pd.DataFrame({left_on: loc_list.values}) - elif isinstance(loc_list, pd.Series): - left_df = loc_list.to_frame(name=left_on) - elif isinstance(loc_list, np.ndarray): - left_df = pd.DataFrame({left_on: loc_list}) - else: - raise RuntimeError("quick_loc_df loc_list of unexpected type %s" % type(loc_list)) - if attribute: target_df = target_df[[attribute]] - df = pd.merge(left_df, - target_df, - left_on=left_on, - right_index=True, - how="left").set_index(left_on) + df = target_df.reindex(loc_list) df.index.name = target_df.index.name - # regression test - # assert df.equals(target_df.loc[loc_list]) - if attribute: # return series return df[attribute] From c8e05f87d5dd002e0701cd4df5e4122cd902c0cb Mon Sep 17 00:00:00 2001 From: bstabler Date: Sun, 1 Aug 2021 09:12:52 -0700 Subject: [PATCH 2/2] faster to use series.map if zone_ids is a series --- activitysim/core/skim_dictionary.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/activitysim/core/skim_dictionary.py b/activitysim/core/skim_dictionary.py index 587eaab89e..ba23b85dce 100644 --- a/activitysim/core/skim_dictionary.py +++ b/activitysim/core/skim_dictionary.py @@ -123,8 +123,13 @@ def map(self, zone_ids): if self.offset_series is not None: assert(self.offset_int is None) assert isinstance(self.offset_series, pd.Series) - # FIXME - faster to use series.map if zone_ids is a series? - offsets = quick_loc_series(zone_ids, self.offset_series).fillna(NOT_IN_SKIM_ZONE_ID).astype(int) + + # FIXME - turns out it is faster to use series.map if zone_ids is a series + # offsets = quick_loc_series(zone_ids, self.offset_series).fillna(NOT_IN_SKIM_ZONE_ID).astype(int) + + if isinstance(zone_ids, np.ndarray): + zone_ids = pd.Series(zone_ids) + offsets = zone_ids.map(self.offset_series, na_action='ignore').fillna(NOT_IN_SKIM_ZONE_ID).astype(int) elif self.offset_int: assert (self.offset_series is None)