Skip to content

Fix emeval.metrics.reference_trajectory for trajectory evaluation notebooks #25

@singhish

Description

@singhish

@shankari as I had mentioned earlier today, trajectory_evaluation_timestamp_metric_selection and trajectory_evaluation_spatio_temporal are currently failing due to issues with the emeval.metrics.reference_trajectory module.

The error in the former notebook occurs at:

ref_tree = {}
coverage_list = []
coverage_list.extend(get_reference_coverage(pv_la, ref_tree))
coverage_list.extend(get_reference_coverage(pv_sj, ref_tree))
coverage_list.extend(get_reference_coverage(pv_ucb, ref_tree))

coverage_df = pd.DataFrame(coverage_list)

and the stack trace is as follows:

ValueError                                Traceback (most recent call last)
<ipython-input-33-2252b9dd9ae9> in <module>
      3 coverage_list.extend(get_reference_coverage(pv_la, ref_tree))
      4 coverage_list.extend(get_reference_coverage(pv_sj, ref_tree))
----> 5 coverage_list.extend(get_reference_coverage(pv_ucb, ref_tree))
      6 
      7 coverage_df = pd.DataFrame(coverage_list)

<ipython-input-31-95ac980592cc> in get_reference_coverage(pv, ref_tree_root)
     74     ref_tree = get_reference_trajectory_tree(pv)
     75     ref_tree_root[pv.spec_details.curr_spec["id"]] = ref_tree
---> 76     [fill_ref_tree_entry(e) for e in ref_tree.values()]
     77     return get_coverage(pv, ref_tree)

<ipython-input-31-95ac980592cc> in <listcomp>(.0)
     74     ref_tree = get_reference_trajectory_tree(pv)
     75     ref_tree_root[pv.spec_details.curr_spec["id"]] = ref_tree
---> 76     [fill_ref_tree_entry(e) for e in ref_tree.values()]
     77     return get_coverage(pv, ref_tree)

<ipython-input-31-95ac980592cc> in fill_ref_tree_entry(e)
     49     # So the "latitude" and "longitude" here is actually in meters and the points can't be displayed directly
     50     # TODO: figure out the best way to support both
---> 51     e["travel_forward_25"] = emr.ref_travel_forward(e, 25, tz=curr_tz)
     52     e["travel_forward_50"] = emr.ref_travel_forward(e, 50, tz=curr_tz)
     53     e["ct_midpoint_25"] = emr.ref_ct_general(e, emr.b_merge_midpoint, 25, tz=curr_tz)

~/mobilitynet-analysis-scripts/emeval/metrics/reference_trajectory.py in ref_travel_forward(e, dist_threshold, tz)
    362         emd.to_geo_df(e["temporal_control"]["ios"]["location_df"]),
    363         section_gt_shapes.filter(["start_loc","end_loc"]))
--> 364     new_location_df_a = get_int_aligned_trajectory(filtered_utm_loc_df_a, tz)
    365     new_location_df_i = get_int_aligned_trajectory(filtered_utm_loc_df_b, tz)
    366 

~/mobilitynet-analysis-scripts/emeval/metrics/reference_trajectory.py in get_int_aligned_trajectory(location_df, tz)
     41 
     42 def get_int_aligned_trajectory(location_df, tz="UTC"):
---> 43     lat_fn = sci.interp1d(x=location_df.ts, y=location_df.latitude)
     44     lon_fn = sci.interp1d(x=location_df.ts, y=location_df.longitude)
     45     # In order to avoid extrapolation, we use ceil for the first int and floor

~/miniconda3/envs/emissioneval/lib/python3.8/site-packages/scipy/interpolate/interpolate.py in __init__(self, x, y, kind, axis, copy, bounds_error, fill_value, assume_sorted)
    466         # Interpolation goes internally along the first axis
    467         self.y = y
--> 468         self._y = self._reshape_yi(self.y)
    469         self.x = x
    470         del y, x  # clean up namespace to prevent misuse; use attributes

~/miniconda3/envs/emissioneval/lib/python3.8/site-packages/scipy/interpolate/polyint.py in _reshape_yi(self, yi, check)
    109                                            self._y_extra_shape[:-self._y_axis])
    110             raise ValueError("Data must be of shape %s" % ok_shape)
--> 111         return yi.reshape((yi.shape[0], -1))
    112 
    113     def _set_yi(self, yi, xi=None, axis=None):

ValueError: cannot reshape array of size 0 into shape (0,newaxis)

Here, it is clear that the error occurs in reference_trajectory's get_int_aligned_trajectory function (line 42).

For the latter notebook, the error occurs at:

ref_tree = {}
get_reference_trajectory_tree(pv_la, ref_tree)
get_reference_trajectory_tree(pv_sj, ref_tree)
get_reference_trajectory_tree(pv_ucb, ref_tree)

with the following stack trace:

AttributeError                            Traceback (most recent call last)
<ipython-input-12-10e416badc4c> in <module>
      2 get_reference_trajectory_tree(pv_la, ref_tree)
      3 get_reference_trajectory_tree(pv_sj, ref_tree)
----> 4 get_reference_trajectory_tree(pv_ucb, ref_tree)

<ipython-input-11-00a6964e029f> in get_reference_trajectory_tree(pv, ref_tree_root)
     55     curr_ref_tree = get_reference_trajectory_input_tree(pv)
     56     ref_tree_root[pv.spec_details.CURR_SPEC_ID] = curr_ref_tree
---> 57     [fill_ref_tree_entry(pv, e) for e in curr_ref_tree.values()]

<ipython-input-11-00a6964e029f> in <listcomp>(.0)
     55     curr_ref_tree = get_reference_trajectory_input_tree(pv)
     56     ref_tree_root[pv.spec_details.CURR_SPEC_ID] = curr_ref_tree
---> 57     [fill_ref_tree_entry(pv, e) for e in curr_ref_tree.values()]

<ipython-input-11-00a6964e029f> in fill_ref_tree_entry(pv, e)
     50     curr_tz = pv.spec_details.eval_tz
     51     assert "android" in e["temporal_control"] and "ios" in e["temporal_control"]
---> 52     (e["reference_algo"], e["reference_df"]) = emr.final_ref_ensemble(e, 25, tz=curr_tz)
     53 
     54 def get_reference_trajectory_tree(pv, ref_tree_root):

~/mobilitynet-analysis-scripts/emeval/metrics/reference_trajectory.py in final_ref_ensemble(e, dist_threshold, tz)
    432     ct_stats = {
    433         "coverage_density": coverage_density(ct_ref_df, e),
--> 434         "coverage_time": coverage_time(ct_ref_df, e),
    435         "coverage_max_gap": coverage_max_gap(ct_ref_df, e)
    436     }

~/mobilitynet-analysis-scripts/emeval/metrics/reference_trajectory.py in <lambda>(df, sr)
    417 
    418 coverage_density = lambda df, sr: len(df)/(sr["end_ts"] - sr["start_ts"])
--> 419 coverage_time = lambda df, sr: (df.ts.iloc[-1] - df.ts.iloc[0])/(sr["end_ts"] - sr["start_ts"])
    420 coverage_max_gap = lambda df, sr: df.ts.diff().max()/(sr["end_ts"] - sr["start_ts"])
    421 

~/miniconda3/envs/emissioneval/lib/python3.8/site-packages/pandas/core/generic.py in __getattr__(self, name)
   5272             if self._info_axis._can_hold_identifiers_and_holds_name(name):
   5273                 return self[name]
-> 5274             return object.__getattribute__(self, name)
   5275 
   5276     def __setattr__(self, name: str, value) -> None:

AttributeError: 'GeoDataFrame' object has no attribute 'ts'

Here, final_ref_ensemble is the problematic function.

These errors need to be fixed for the above notebooks to work properly.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions