From 8d29cc120872a39bff8d085ebad4d8f4a3dbed0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Victor?= Date: Mon, 5 Jul 2021 23:59:42 -0300 Subject: [PATCH 1/3] Putting examples on Folium module --- pymove/visualization/folium.py | 379 ++++++++++++++++++++++++++++++++- 1 file changed, 378 insertions(+), 1 deletion(-) diff --git a/pymove/visualization/folium.py b/pymove/visualization/folium.py index 2eb84256..70837e2e 100644 --- a/pymove/visualization/folium.py +++ b/pymove/visualization/folium.py @@ -93,6 +93,18 @@ def save_map( ------- Map folium map or None + + Examples + -------- + >>> from pymove.visualization.folium import save_map + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> save_map(df, filename = '/content/test.map') """ map_ = folium.Map(tiles=tiles) map_.fit_bounds( @@ -148,6 +160,18 @@ def create_base_map( ------- Map a folium map + + Examples + -------- + >>> from pymove.visualization.folium import create_base_map + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> create_base_map(move_df) """ if lat_origin is None and lon_origin is None: lat_origin = move_data[LATITUDE].median() @@ -205,6 +229,18 @@ def heatmap( ------- Map folium Map + + Examples + -------- + >>> from pymove.visualization.folium import heatmap + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> heatmap(move_df) """ if base_map is None: base_map = create_base_map( @@ -284,6 +320,18 @@ def heatmap_with_time( ------- Map folium Map + + Examples + -------- + >>> from pymove.visualization.folium import heatmap_with_time + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> heatmap_with_time(move_df) """ if base_map is None: base_map = create_base_map( @@ -369,6 +417,18 @@ def cluster( ------- Map folium Map + + Examples + -------- + >>> from pymove.visualization.folium import cluster + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> cluster(move_df) """ if base_map is None: base_map = create_base_map( @@ -447,6 +507,18 @@ def faster_cluster( ------- Map folium Map + + Examples + -------- + >>> from pymove.visualization.folium import faster_cluster + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> faster_cluster(move_df) """ if base_map is None: base_map = create_base_map( @@ -520,6 +592,18 @@ def plot_markers( ------- Map folium Map + + Examples + -------- + >>> from pymove.visualization.folium import plot_markers + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_markers(move_df) """ if base_map is None: base_map = create_base_map( @@ -596,6 +680,26 @@ def _filter_and_generate_colors( list of tuples list containing a combination of id and color + Examples + -------- + >>> from pymove.visualization.folium import _filter_and_generate_colors + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> _filter_and_generate_colors(move_df) + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + ... ... ... ... .. + [5000 rows x 4 columns], [(1, '#e41a1c')]) + """ if n_rows is None: n_rows = move_data.shape[0] @@ -664,6 +768,22 @@ def _filter_generated_feature( dataframe filtered dataframe + Examples + -------- + >>> from pymove.visualization.folium import _filter_generated_feature + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> print(_filter_generated_feature(df8, feature='lat', values=[39.984198])) + lat lon datetime id + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + >>> print(_filter_generated_feature(df8, feature='lon', values=[116.319236])) + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 """ if len(values) == 1: mv_df = move_data[move_data[feature] == values[0]] @@ -699,6 +819,19 @@ def _add_begin_end_markers_to_folium_map( Color of the markers, by default None id: int, optional Id of the trajectory, by default None + + Examples + -------- + >>> from pymove.visualization.folium import _add_begin_end_markers_to_folium_map + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> map = create_base_map(move_df) + >>> _add_begin_end_markers_to_folium_map(move_df, map) """ points = folium.map.FeatureGroup( 'The start and end points of trajectory {}'.format(_id or '') @@ -751,6 +884,17 @@ def _add_trajectories_to_folium_map( filename : str, optional Represents the file name of new file .html, by default 'map.html'. + Examples + -------- + >>> from pymove.visualization.folium import _add_trajectories_to_folium_map + >>> move_df + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + ... ... ... ... ... + 113605 39.988118 116.326672 2008-10-25 14:39:19 5 + 113606 39.987965 116.326675 2008-10-25 14:39:24 5 + >>> _add_trajectories_to_folium_map(move_data = df10, base_map = map1,items=[(1, 'red'), [5, 'green']]) """ for _id, color in items: mv = move_data[move_data[TRAJ_ID] == _id] @@ -826,6 +970,17 @@ def plot_trajectories_with_folium( Map a folium map with visualization. + Examples + -------- + >>> from pymove.visualization.folium import plot_trajectories_with_folium + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_trajectories_with_folium(move_df) """ if base_map is None: base_map = create_base_map( @@ -907,6 +1062,17 @@ def plot_trajectory_by_id_folium( IndexError If there is no user with the id passed + Examples + -------- + >>> from pymove.visualization.folium import plot_trajectory_by_id_folium + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_trajectory_by_id_folium(move_df, id_=1) """ if base_map is None: base_map = create_base_map( @@ -994,6 +1160,26 @@ def plot_trajectory_by_period( IndexError If there is no user with the id passed + Examples + -------- + >>> from pymove.visualization.folium import plot_trajectory_by_period + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_trajectory_by_period(move_df, period='Early morning') + >>> move_df.head() + lat lon datetime id period + 0 39.984094 116.319236 2008-10-23 05:53:05 1 Early morning + 1 39.984198 116.319322 2008-10-23 05:53:06 1 Early morning + 2 39.984224 116.319402 2008-10-23 05:53:11 1 Early morning + 3 39.984211 116.319389 2008-10-23 05:53:16 1 Early morning + 4 39.984217 116.319422 2008-10-23 05:53:21 1 Early morning + >>> move_df['period'].unique() + array(['Early morning', 'Morning', 'Afternoon', 'Evening'], dtype=object) """ if base_map is None: base_map = create_base_map( @@ -1085,6 +1271,26 @@ def plot_trajectory_by_day_week( IndexError If there is no user with the id passed + Examples + -------- + >>> from pymove.visualization.folium import plot_trajectory_by_day_week + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_trajectory_by_day_week(move_df, day_week='Friday') + >>> move_df.head() + lat lon datetime id day + 0 39.984094 116.319236 2008-10-23 05:53:05 1 Thursday + 1 39.984198 116.319322 2008-10-23 05:53:06 1 Thursday + 2 39.984224 116.319402 2008-10-23 05:53:11 1 Thursday + 3 39.984211 116.319389 2008-10-23 05:53:16 1 Thursday + 4 39.984217 116.319422 2008-10-23 05:53:21 1 Thursday + >>> move_df.day.unique() + array(['Thursday', 'Friday', 'Saturday'], dtype=object) """ if base_map is None: base_map = create_base_map( @@ -1179,9 +1385,30 @@ def plot_trajectory_by_date( IndexError If there is no user with the id passed + Examples + -------- + >>> from pymove.visualization.folium import plot_trajectory_by_date + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_trajectory_by_date(move_df, start_date = '2008-10-23 05:53:05',end_date = '2008-10-23 23:43:56') + >>> move_df.head() + lat lon datetime id date + 0 39.984094 116.319236 2008-10-23 05:53:05 1 2008-10-23 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 2008-10-23 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 2008-10-23 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 2008-10-23 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 2008-10-23 + >>> move_df.date.unique() + array([datetime.date(2008, 10, 23), datetime.date(2008, 10, 24), + datetime.date(2008, 10, 25)], dtype=object) """ if base_map is None: - base_map = create_base_map( + bfrom pymove.visualization.folium import plot_trajectory_by_hourase_map = create_base_map( move_data, lat_origin, lon_origin, @@ -1279,6 +1506,25 @@ def plot_trajectory_by_hour( IndexError If there is no user with the id passed + Examples + -------- + >>> from pymove.visualization.folium import plot_trajectory_by_hour + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_trajectory_by_hour(move_df, start_hour=5,end_hour = 6) + lat lon datetime id hour + 0 39.984094 116.319236 2008-10-23 05:53:05 1 5 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 5 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 5 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 5 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 5 + >>> move_df['hour'].unique() + array([ 5, 6, 10, 11, 12, 23, 0, 1, 2, 3, 4]) """ if base_map is None: base_map = create_base_map( @@ -1370,6 +1616,30 @@ def plot_stops( IndexError If there is no user with the id passed + Examples + -------- + >>> from pymove.visualization.folium import plot_stops + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_stops(move_df) + >>> move_df.head() + lat lon datetime id\ + dist_to_prev dist_to_next dist_prev_to_next situation + 0 39.984094 116.319236 2008-10-23 05:53:05 1\ + NaN 13.690153 NaN nan + 1 39.984198 116.319322 2008-10-23 05:53:06 1\ + 13.690153 7.403788 20.223428 move + 2 39.984224 116.319402 2008-10-23 05:53:11 1\ + 7.403788 1.821083 5.888579 move + 3 39.984211 116.319389 2008-10-23 05:53:16 1\ + 1.821083 2.889671 1.873356 move + 4 39.984217 116.319422 2008-10-23 05:53:21 1\ + 2.889671 66.555997 68.727260 move """ if base_map is None: base_map = create_base_map( @@ -1443,6 +1713,10 @@ def plot_bbox( Map folium map with bounding box + Examples + -------- + >>> from pymove.visualization.folium import plot_bbox + >>> plot_bbox((39.984094,116.319236,39.997535,116.196345)) """ if base_map is None: base_map = folium.Map(tiles=tiles) @@ -1479,6 +1753,20 @@ def _format_tags(line: Union[List, Dict], slice_: List) -> Text: ------- str: formatted html tag + Examples + -------- + >>> from pymove.visualization.folium import _format_tags, plot_points_folium + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> _format_tags(line={'lat': 39.984094, 'lon': 116.319236, 'datetime': '2008-10-23 05:53:05', 'id': 1} + , slice_=['lat', 'lon', 'datetime', 'id']) + lat: 39.984094
lon: 116.319236
datetime: 2008-10-23 05:53:05
id: 1 + >>> plot_points_folium(move_df.head()) """ map_formated_tags = map(lambda tag: '{}: {}'.format(tag, line[tag]), slice_) @@ -1511,6 +1799,20 @@ def _circle_maker( radius: float. radius size. map_: Folium map. + + Examples + -------- + >>> from pymove.visualization.folium import _circle_maker + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> row = move_df.iloc[0]; iter_tuple = (0, row); user_lat = 'lat'; user_lon = 'lon' + >>> slice_tags = row.keys(); user_point = 'pink'; radius = 10; map_ = create_base_map(move_df) + >>> _circle_maker(iter_tuple, user_lat, user_lon, slice_tags, user_point, radius, map_) """ _, line = iter_tuple @@ -1572,6 +1874,18 @@ def plot_points_folium( ------- Map A folium map + + Examples + -------- + >>> from pymove.visualization.folium import plot_points_folium + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_points_folium(move_df) """ if slice_tags is None: slice_tags = list(move_data.columns) @@ -1645,6 +1959,18 @@ def plot_poi_folium( ------- folium.folium.Map. Represents a folium map with visualization. + + Examples + -------- + >>> from pymove.visualization.folium import plot_poi_folium + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_poi_folium(move_df) """ return plot_points_folium( move_data, @@ -1699,6 +2025,18 @@ def plot_event_folium( Returns ------- A folium map. + + Examples + -------- + >>> from pymove.visualization.folium import plot_event_folium + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_event_folium(move_df) """ return plot_points_folium( move_data, @@ -1783,6 +2121,9 @@ def show_trajs_with_event( ------ ValueError If feature generation fails + + Examples + -------- """ # building structure for deltas delta_event = pd.to_timedelta(window_time_event, unit='s') @@ -1970,6 +2311,9 @@ def show_traj_id_with_event( ------- Map A list of folium maps. + + Examples + -------- """ df_id = move_data[move_data[user_id] == subject_id] @@ -2019,6 +2363,27 @@ def _create_geojson_features_line( ------- list GeoJSON features. + + Examples + -------- + >>> from pymove.visualization.folium import _create_geojson_features_line + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> _create_geojson_features_line(move_df) + [{'geometry': {'coordinates': [[116.319236, 39.984094], + [116.319322, 39.984198]], + 'type': 'Linestr'}, + 'properties': {'popup': 'lat: 39.984094
lon: 116.319236
datetime: 2008-10-23 05:53:05
id: 1', + 'style': {'color': 'red', + 'icon': 'circle', + 'iconstyle': {'color': 'red', 'weight': 4}}, + 'times': ['2008-10-23T05:53:05', '2008-10-23T05:53:06']}, + 'type': 'Feature'},...] """ features = [] @@ -2096,6 +2461,18 @@ def plot_traj_timestamp_geo_json( ------- Map A folium map. + + Examples + -------- + >>> from pymove.visualization.folium import plot_traj_timestamp_geo_json + >>> move_df.head() + lat lon datetime id + 0 39.984094 116.319236 2008-10-23 05:53:05 1 + 1 39.984198 116.319322 2008-10-23 05:53:06 1 + 2 39.984224 116.319402 2008-10-23 05:53:11 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 1 + 4 39.984217 116.319422 2008-10-23 05:53:21 1 + >>> plot_traj_timestamp_geo_json(move_df) """ features = _create_geojson_features_line( move_data, From 2b171e37fe1802979b03862e342d3bd6398932de Mon Sep 17 00:00:00 2001 From: flych3r Date: Tue, 6 Jul 2021 16:05:00 -0300 Subject: [PATCH 2/3] fix some linting issues --- pymove/tests/test_visualization_folium.py | 67 ---- pymove/visualization/folium.py | 435 +++++----------------- 2 files changed, 94 insertions(+), 408 deletions(-) diff --git a/pymove/tests/test_visualization_folium.py b/pymove/tests/test_visualization_folium.py index 588c71e5..300c2f33 100644 --- a/pymove/tests/test_visualization_folium.py +++ b/pymove/tests/test_visualization_folium.py @@ -1076,73 +1076,6 @@ def test_plot_event_folium(tmpdir): ) -def test_show_trajs_with_event(): - - move_df = _default_move_df() - - df_event = move_df.iloc[0:3, :] - - list_ = folium.show_trajs_with_event( - move_data=move_df, - window_time_subject=4, - df_event=df_event, - window_time_event=4, - radius=150, - event_lat=LATITUDE, - event_lon=LONGITUDE, - event_datetime=DATETIME, - user_lat=LATITUDE, - user_lon=LONGITUDE, - user_datetime=DATETIME, - event_id='id', - event_point=EVENT_POINT, - user_id='id', - user_point=USER_POINT, - line_color=LINE_COLOR, - slice_event_show=None, - slice_subject_show=None, - ) - - assert len(list_) == 3, 'list with wrong number of elements' - for i in list_: - base_map = i[0] - assert(base_map.control_scale is True) - - -def test_show_traj_id_with_event(): - - move_df = _default_move_df() - - df_event = move_df.iloc[0:3, :] - - list_ = folium.show_traj_id_with_event( - move_data=move_df, - window_time_subject=4, - subject_id=1, - df_event=df_event, - window_time_event=4, - radius=150, - event_lat=LATITUDE, - event_lon=LONGITUDE, - event_datetime=DATETIME, - user_lat=LATITUDE, - user_lon=LONGITUDE, - user_datetime=DATETIME, - event_id='id', - event_point=EVENT_POINT, - user_id='id', - user_point=USER_POINT, - line_color=LINE_COLOR, - slice_event_show=None, - slice_subject_show=None, - ) - - assert type(list_) == tuple, 'Wrong type' - assert len(list_) == 2, 'list with wrong number of elements' - assert len(list_[1]) == 2 - assert list_[0].control_scale is True - - def test_create_geojson_features_line(): move_df = _default_move_df() diff --git a/pymove/visualization/folium.py b/pymove/visualization/folium.py index 70837e2e..2a1fc102 100644 --- a/pymove/visualization/folium.py +++ b/pymove/visualization/folium.py @@ -30,14 +30,11 @@ import folium import numpy as np -import pandas as pd from folium import Map, plugins from folium.plugins import FastMarkerCluster, HeatMap, HeatMapWithTime, MarkerCluster from pandas import DataFrame from pymove import PandasMoveDataFrame -from pymove.preprocessing import filters -from pymove.utils import distances from pymove.utils.constants import ( COUNT, DATE, @@ -104,7 +101,7 @@ def save_map( 2 39.984224 116.319402 2008-10-23 05:53:11 1 3 39.984211 116.319389 2008-10-23 05:53:16 1 4 39.984217 116.319422 2008-10-23 05:53:21 1 - >>> save_map(df, filename = '/content/test.map') + >>> save_map(df, filename='test.map') """ map_ = folium.Map(tiles=tiles) map_.fit_bounds( @@ -688,18 +685,18 @@ def _filter_and_generate_colors( 0 39.984094 116.319236 2008-10-23 05:53:05 1 1 39.984198 116.319322 2008-10-23 05:53:06 1 2 39.984224 116.319402 2008-10-23 05:53:11 1 - 3 39.984211 116.319389 2008-10-23 05:53:16 1 - 4 39.984217 116.319422 2008-10-23 05:53:21 1 - >>> _filter_and_generate_colors(move_df) + 3 39.984211 116.319389 2008-10-23 05:53:16 2 + 4 39.984217 116.319422 2008-10-23 05:53:21 2 + >>> df, colors = _filter_and_generate_colors(move_df) + >>> df lat lon datetime id 0 39.984094 116.319236 2008-10-23 05:53:05 1 1 39.984198 116.319322 2008-10-23 05:53:06 1 2 39.984224 116.319402 2008-10-23 05:53:11 1 - 3 39.984211 116.319389 2008-10-23 05:53:16 1 - 4 39.984217 116.319422 2008-10-23 05:53:21 1 - ... ... ... ... .. - [5000 rows x 4 columns], [(1, '#e41a1c')]) - + 3 39.984211 116.319389 2008-10-23 05:53:16 2 + 4 39.984217 116.319422 2008-10-23 05:53:21 2 + >>> colors + [(1, '#e41a1c'), (2, '#377eb8')] """ if n_rows is None: n_rows = move_data.shape[0] @@ -778,10 +775,10 @@ def _filter_generated_feature( 2 39.984224 116.319402 2008-10-23 05:53:11 1 3 39.984211 116.319389 2008-10-23 05:53:16 1 4 39.984217 116.319422 2008-10-23 05:53:21 1 - >>> print(_filter_generated_feature(df8, feature='lat', values=[39.984198])) + >>> _filter_generated_feature(move_df, feature='lat', values=[39.984198]) lat lon datetime id 1 39.984198 116.319322 2008-10-23 05:53:06 1 - >>> print(_filter_generated_feature(df8, feature='lon', values=[116.319236])) + >>> _filter_generated_feature(move_df, feature='lon', values=[116.319236]) lat lon datetime id 0 39.984094 116.319236 2008-10-23 05:53:05 1 """ @@ -891,10 +888,13 @@ def _add_trajectories_to_folium_map( lat lon datetime id 0 39.984094 116.319236 2008-10-23 05:53:05 1 1 39.984198 116.319322 2008-10-23 05:53:06 1 - ... ... ... ... ... - 113605 39.988118 116.326672 2008-10-25 14:39:19 5 - 113606 39.987965 116.326675 2008-10-25 14:39:24 5 - >>> _add_trajectories_to_folium_map(move_data = df10, base_map = map1,items=[(1, 'red'), [5, 'green']]) + 3 39.988118 116.326672 2008-10-25 14:39:19 5 + 4 39.987965 116.326675 2008-10-25 14:39:24 5 + >>> _add_trajectories_to_folium_map( + >>> move_data=move_df, + >>> base_map=map1, + >>> items=[(1, 'red'), [5, 'green']] + >>> ) """ for _id, color in items: mv = move_data[move_data[TRAJ_ID] == _id] @@ -1070,8 +1070,8 @@ def plot_trajectory_by_id_folium( 0 39.984094 116.319236 2008-10-23 05:53:05 1 1 39.984198 116.319322 2008-10-23 05:53:06 1 2 39.984224 116.319402 2008-10-23 05:53:11 1 - 3 39.984211 116.319389 2008-10-23 05:53:16 1 - 4 39.984217 116.319422 2008-10-23 05:53:21 1 + 3 39.984211 116.319389 2008-10-23 05:53:16 2 + 4 39.984217 116.319422 2008-10-23 05:53:21 2 >>> plot_trajectory_by_id_folium(move_df, id_=1) """ if base_map is None: @@ -1178,8 +1178,6 @@ def plot_trajectory_by_period( 2 39.984224 116.319402 2008-10-23 05:53:11 1 Early morning 3 39.984211 116.319389 2008-10-23 05:53:16 1 Early morning 4 39.984217 116.319422 2008-10-23 05:53:21 1 Early morning - >>> move_df['period'].unique() - array(['Early morning', 'Morning', 'Afternoon', 'Evening'], dtype=object) """ if base_map is None: base_map = create_base_map( @@ -1289,8 +1287,6 @@ def plot_trajectory_by_day_week( 2 39.984224 116.319402 2008-10-23 05:53:11 1 Thursday 3 39.984211 116.319389 2008-10-23 05:53:16 1 Thursday 4 39.984217 116.319422 2008-10-23 05:53:21 1 Thursday - >>> move_df.day.unique() - array(['Thursday', 'Friday', 'Saturday'], dtype=object) """ if base_map is None: base_map = create_base_map( @@ -1395,7 +1391,11 @@ def plot_trajectory_by_date( 2 39.984224 116.319402 2008-10-23 05:53:11 1 3 39.984211 116.319389 2008-10-23 05:53:16 1 4 39.984217 116.319422 2008-10-23 05:53:21 1 - >>> plot_trajectory_by_date(move_df, start_date = '2008-10-23 05:53:05',end_date = '2008-10-23 23:43:56') + >>> plot_trajectory_by_date( + >>> move_df, + >>> start_date='2008-10-23 05:53:05', + >>> end_date='2008-10-23 23:43:56' + >>> ) >>> move_df.head() lat lon datetime id date 0 39.984094 116.319236 2008-10-23 05:53:05 1 2008-10-23 @@ -1403,12 +1403,9 @@ def plot_trajectory_by_date( 2 39.984224 116.319402 2008-10-23 05:53:11 1 2008-10-23 3 39.984211 116.319389 2008-10-23 05:53:16 1 2008-10-23 4 39.984217 116.319422 2008-10-23 05:53:21 1 2008-10-23 - >>> move_df.date.unique() - array([datetime.date(2008, 10, 23), datetime.date(2008, 10, 24), - datetime.date(2008, 10, 25)], dtype=object) """ if base_map is None: - bfrom pymove.visualization.folium import plot_trajectory_by_hourase_map = create_base_map( + base_map = create_base_map( move_data, lat_origin, lon_origin, @@ -1516,15 +1513,13 @@ def plot_trajectory_by_hour( 2 39.984224 116.319402 2008-10-23 05:53:11 1 3 39.984211 116.319389 2008-10-23 05:53:16 1 4 39.984217 116.319422 2008-10-23 05:53:21 1 - >>> plot_trajectory_by_hour(move_df, start_hour=5,end_hour = 6) + >>> plot_trajectory_by_hour(move_df, start_hour=4,end_hour=6) lat lon datetime id hour 0 39.984094 116.319236 2008-10-23 05:53:05 1 5 1 39.984198 116.319322 2008-10-23 05:53:06 1 5 2 39.984224 116.319402 2008-10-23 05:53:11 1 5 3 39.984211 116.319389 2008-10-23 05:53:16 1 5 4 39.984217 116.319422 2008-10-23 05:53:21 1 5 - >>> move_df['hour'].unique() - array([ 5, 6, 10, 11, 12, 23, 0, 1, 2, 3, 4]) """ if base_map is None: base_map = create_base_map( @@ -1628,17 +1623,17 @@ def plot_stops( 4 39.984217 116.319422 2008-10-23 05:53:21 1 >>> plot_stops(move_df) >>> move_df.head() - lat lon datetime id\ + lat lon datetime id \ dist_to_prev dist_to_next dist_prev_to_next situation - 0 39.984094 116.319236 2008-10-23 05:53:05 1\ + 0 39.984094 116.319236 2008-10-23 05:53:05 1 \ NaN 13.690153 NaN nan - 1 39.984198 116.319322 2008-10-23 05:53:06 1\ + 1 39.984198 116.319322 2008-10-23 05:53:06 1 \ 13.690153 7.403788 20.223428 move - 2 39.984224 116.319402 2008-10-23 05:53:11 1\ + 2 39.984224 116.319402 2008-10-23 05:53:11 1 \ 7.403788 1.821083 5.888579 move - 3 39.984211 116.319389 2008-10-23 05:53:16 1\ + 3 39.984211 116.319389 2008-10-23 05:53:16 1 \ 1.821083 2.889671 1.873356 move - 4 39.984217 116.319422 2008-10-23 05:53:21 1\ + 4 39.984217 116.319422 2008-10-23 05:53:21 1 \ 2.889671 66.555997 68.727260 move """ if base_map is None: @@ -1763,10 +1758,16 @@ def _format_tags(line: Union[List, Dict], slice_: List) -> Text: 2 39.984224 116.319402 2008-10-23 05:53:11 1 3 39.984211 116.319389 2008-10-23 05:53:16 1 4 39.984217 116.319422 2008-10-23 05:53:21 1 - >>> _format_tags(line={'lat': 39.984094, 'lon': 116.319236, 'datetime': '2008-10-23 05:53:05', 'id': 1} - , slice_=['lat', 'lon', 'datetime', 'id']) + >>> _format_tags( + >>> line={ + >>> 'lat': 39.984094, + >>> 'lon': 116.319236, + >>> 'datetime': '2008-10-23 05:53:05', + >>> 'id': 1 + >>> }, + >>> slice_=['lat', 'lon', 'datetime', 'id'] + >>> ) lat: 39.984094
lon: 116.319236
datetime: 2008-10-23 05:53:05
id: 1 - >>> plot_points_folium(move_df.head()) """ map_formated_tags = map(lambda tag: '{}: {}'.format(tag, line[tag]), slice_) @@ -1810,9 +1811,18 @@ def _circle_maker( 2 39.984224 116.319402 2008-10-23 05:53:11 1 3 39.984211 116.319389 2008-10-23 05:53:16 1 4 39.984217 116.319422 2008-10-23 05:53:21 1 - >>> row = move_df.iloc[0]; iter_tuple = (0, row); user_lat = 'lat'; user_lon = 'lon' - >>> slice_tags = row.keys(); user_point = 'pink'; radius = 10; map_ = create_base_map(move_df) - >>> _circle_maker(iter_tuple, user_lat, user_lon, slice_tags, user_point, radius, map_) + >>> row = move_df.iloc[0] + >>> iter_tuple = (0, row) + >>> user_lat = 'lat' + >>> user_lon = 'lon' + >>> slice_tags = row.keys() + >>> user_point = 'pink' + >>> radius = 10 + >>> map_ = create_base_map(move_df) + >>> _circle_maker( + >>> iter_tuple, user_lat, user_lon, + >>> slice_tags, user_point, radius, map_ + >>> ) """ _, line = iter_tuple @@ -2052,293 +2062,6 @@ def plot_event_folium( ) -def show_trajs_with_event( - move_data: DataFrame, - window_time_subject: float, - df_event: DataFrame, - window_time_event: float, - radius: float, - event_lat: Text = LATITUDE, - event_lon: Text = LONGITUDE, - event_datetime: Text = DATETIME, - user_lat: Text = LATITUDE, - user_lon: Text = LONGITUDE, - user_datetime: Text = DATETIME, - event_id: Text = EVENT_ID, - event_point: Text = EVENT_POINT, - user_id: Text = UID, - user_point: Text = USER_POINT, - line_color: Text = LINE_COLOR, - slice_event_show: Optional[List] = None, - slice_subject_show: Optional[List] = None, -) -> List[Map]: - """ - Plot a trajectory, including your user_points lat lon and your tags. - - Parameters - ---------- - move_data: DataFrame. - Trajectory input data. - window_time_subject: float. - The subject time window. - window_time_event: float. - The event time window. - radius: float. - The radius to use. - event_lat: str, optional - Event latitude column name, by default LATITUDE. - event_lon: str, optional - Event longitude column name, by default LONGITUDE. - event_datetime: str, optional - Event datetime column name, by default DATETIME. - user_lat: str, optional - User latitude column name, by default LATITUDE. - user_lon: str, optional - User longitude column name, by default LONGITUDE. - user_datetime: str, optional - User datetime column name, by default DATETIME. - event_id_: str, optional - Event id column name, by default TRAJ_ID. - event_point: str, optional - Event color, by default EVENT_POI. - user_id: str, optional - User id column name, by default TRAJ_ID. - user_point: str, optional - User point color, by default USER_POINT. - line_color: str, optional - Line color, by default 'blue'. - slice_event_show: list, optional - by default None. - slice_subject_show: list, optional - by default None. - - Returns - ------- - list of Map - A list of folium maps. - - Raises - ------ - ValueError - If feature generation fails - - Examples - -------- - """ - # building structure for deltas - delta_event = pd.to_timedelta(window_time_event, unit='s') - delta_user = pd.to_timedelta(window_time_subject, unit='s') - - # length of df_user - len_df_user = move_data.shape[0] - - # building structure for lat and lon array - lat_arr = np.zeros(len_df_user) - lon_arr = np.zeros(len_df_user) - - # folium map list - folium_maps = [] - - # for each event in df_event - for _, line in df_event.iterrows(): - - e_lat = line[event_lat] - e_lon = line[event_lon] - e_datetime = line[event_datetime] - e_id = line[event_id] - - # building time window for event search - start_time = pd.to_datetime(e_datetime - delta_event) - end_time = pd.to_datetime(e_datetime + delta_event) - - # filtering df_ for time window - df_filtered = filters.by_datetime( - move_data, - start_datetime=start_time, - end_datetime=end_time - ) - - if df_filtered is None: - raise ValueError('Filter datetime failed!') - - # length of df_temp - len_df_temp = df_filtered.shape[0] - - # using the util part of the array for haversine function - lat_arr[:len_df_temp] = e_lat - lon_arr[:len_df_temp] = e_lon - - # building distances to event column - df_filtered['distances'] = distances.haversine( - lat_arr[:len_df_temp], - lon_arr[:len_df_temp], - df_filtered[user_lat].values, - df_filtered[user_lon].values - ) - - # building nearby column - df_filtered['nearby'] = df_filtered['distances'].map(lambda x: (x <= radius)) - - # if any data for df_ in event time window is True - if df_filtered['nearby'].any(): - - # building the df for the first user_points of user in nearby event - df_begin = df_filtered[df_filtered['nearby']].sort_values( - user_datetime - ) - - move_data = df_event[df_event[event_id] == e_id] - - base_map = plot_event_folium( - move_data, - event_lat=event_lat, - event_lon=event_lon, - event_point=event_point, - slice_tags=slice_event_show - ) - - # keep only the first user_point nearby to event for each user - df_begin.drop_duplicates( - subset=[user_id, 'nearby'], - inplace=True - ) - # for each user nearby to event - users = [] - - for time_user, id_user in zip( - df_begin[user_datetime], - df_begin[user_id] - ): - # making the time window for user - start_time = pd.to_datetime(time_user - delta_user) - end_time = pd.to_datetime(time_user + delta_user) - - # building the df for one id - df_id = move_data[move_data[user_id] == id_user] - - # filtering df_id for time window - df_temp = filters.by_datetime( - df_id, - start_datetime=start_time, - end_datetime=end_time - ) - - users.append(df_temp) - # add to folium map created - base_map = plot_trajectories_with_folium( - df_temp, - color=[line_color], - base_map=base_map - ) - base_map = plot_points_folium( - df_temp, - user_lat=user_lat, - user_lon=user_lon, - user_point=user_point, - base_map=base_map, - slice_tags=slice_subject_show - ) - # add to folium maps list: (id event, folium map, quantity of user in map, df) - folium_maps.append((base_map, pd.concat(users))) - - return folium_maps - - -def show_traj_id_with_event( - move_data: DataFrame, - window_time_subject: float, - df_event: DataFrame, - window_time_event: float, - radius: float, - subject_id: int, - event_lat: Text = LATITUDE, - event_lon: Text = LONGITUDE, - event_datetime: Text = DATETIME, - user_lat: Text = LATITUDE, - user_lon: Text = LONGITUDE, - user_datetime: Text = DATETIME, - event_id: Text = EVENT_ID, - event_point: Text = EVENT_POINT, - user_id: Text = UID, - user_point: Text = USER_POINT, - line_color: Text = LINE_COLOR, - slice_event_show: Optional[List] = None, - slice_subject_show: Optional[List] = None, -) -> Map: - """ - Plot a trajectory, including your user_points lat lon and your tags. - - Parameters - ---------- - move_data: DataFrame. - Trajectory input data. - window_time_subject: float. - The subject time window. - window_time_event: float. - The event time window. - radius: float. - The radius to use. - subject_id: int - Id of the trajectory - event_lat: str, optional - Event latitude column name, by default LATITUDE. - event_lon: str, optional - Event longitude column name, by default LONGITUDE. - event_datetime: str, optional - Event datetime column name, by default DATETIME. - user_lat: str, optional - User latitude column name, by default LATITUDE. - user_lon: str, optional - User longitude column name, by default LONGITUDE. - user_datetime: str, optional - User datetime column name, by default DATETIME. - event_id_: str, optional - Event id column name, by default TRAJ_ID. - event_point: str, optional - Event color, by default EVENT_POINT. - user_id: str, optional - User id column name, by default TRAJ_ID. - user_point: str, optional - User point color, by default USER_POINT. - line_color: str, optional - Line color, by default 'blue'. - slice_event_show: list, optional - by default None. - slice_subject_show: list, optional - by default None. - - Returns - ------- - Map - A list of folium maps. - - Examples - -------- - """ - df_id = move_data[move_data[user_id] == subject_id] - - return show_trajs_with_event( - df_id, - window_time_subject, - df_event, - window_time_event, - radius, - event_lat=event_lat, - event_lon=event_lon, - event_datetime=event_datetime, - user_lat=user_lat, - user_lon=user_lon, - user_datetime=user_datetime, - event_id=event_id, - event_point=event_point, - user_id=user_id, - user_point=user_point, - line_color=line_color, - slice_event_show=slice_event_show, - slice_subject_show=slice_subject_show - )[0] - - def _create_geojson_features_line( move_data: DataFrame, label_lat: Text = LATITUDE, @@ -2375,15 +2098,41 @@ def _create_geojson_features_line( 3 39.984211 116.319389 2008-10-23 05:53:16 1 4 39.984217 116.319422 2008-10-23 05:53:21 1 >>> _create_geojson_features_line(move_df) - [{'geometry': {'coordinates': [[116.319236, 39.984094], - [116.319322, 39.984198]], - 'type': 'Linestr'}, - 'properties': {'popup': 'lat: 39.984094
lon: 116.319236
datetime: 2008-10-23 05:53:05
id: 1', - 'style': {'color': 'red', - 'icon': 'circle', - 'iconstyle': {'color': 'red', 'weight': 4}}, - 'times': ['2008-10-23T05:53:05', '2008-10-23T05:53:06']}, - 'type': 'Feature'},...] + [ + { + "type":"Feature", + "geometry":{ + "type":"Linestr", + "coordinates":[ + [ + 116.319236, + 39.984094 + ], + [ + 116.319322, + 39.984198 + ] + ] + }, + "properties":{ + "times":[ + "2008-10-23T05:53:05", + "2008-10-23T05:53:06" + ], + "popup":"lat: 39.984094
lon: 116.319236
\ + datetime: 2008-10-23 05:53:05
id: 1", + "style":{ + "color":"red", + "icon":"circle", + "iconstyle":{ + "color":"red", + "weight":4 + } + } + } + }, + ... + ] """ features = [] @@ -2391,7 +2140,11 @@ def _create_geojson_features_line( _, last = next(row_iterator) columns = move_data.columns - for i, row in progress_bar(row_iterator, total=move_data.shape[0] - 1) : + for i, row in progress_bar( + row_iterator, + total=move_data.shape[0], + desc='Generating GeoJSon' + ): last_time = last[label_datetime].strftime('%Y-%m-%dT%H:%M:%S') next_time = row[label_datetime].strftime('%Y-%m-%dT%H:%M:%S') From 4b6a5a92d9123ea3ab1040ad23ce8741c651232f Mon Sep 17 00:00:00 2001 From: flych3r Date: Tue, 6 Jul 2021 16:05:56 -0300 Subject: [PATCH 3/3] removed missing function from module doc --- pymove/visualization/folium.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/pymove/visualization/folium.py b/pymove/visualization/folium.py index 2a1fc102..2755e34e 100644 --- a/pymove/visualization/folium.py +++ b/pymove/visualization/folium.py @@ -19,8 +19,6 @@ plot_points_folium, plot_poi_folium, plot_event_folium, -show_trajs_with_event, -show_traj_id_with_event, plot_traj_timestamp_geo_json """