Neste tutorial nós iremos mostrar como fazer o uso do PyMove para pré-processamento e visualização dos dados de trajetória!
Para trabalhar com o PyMove é preciso que você importe os seus dados para a nossa estrutura de dados interna: MoveDataFrame.
O MoveDataFrame é uma abstração que instancia uma estrutura de dados que pode manipula diferentes bibliotecas para trabalhar com dados de trajetória.
Você precisa mandar uma flag no momento da criação do MoveDataFrame para indicar qual biblioteca você deseja uitlizar internamente para manipular o seu conjunto de dados. Atualmente a única opção disponível é o Pandas.
O MoveDataFrame deve conter as seguintes colunas:
O usuário tem a liberdade para adicionar quaisquer outras colunas que desejar. Se uma coluna contendo o id das trajetórias não for indicado os pontos são considerados pertencentes a mesma trajetória.
Agora vamos iniciar o nosso tutorial!!
Vamos criar um MoveDataFrame a partir de um arquivo csv. O conjunto de dados utilizado é o Geolife GPS trajectory dataset da microsoft.
import pymove
from pymove import MoveDataFrame
import pandas as pd
df = pd.read_csv('examples/geolife_sample.csv', parse_dates=['datetime'])
move_df = MoveDataFrame(data=df, latitude="lat", longitude="lon", datetime="datetime")
move_df.head()
Vamos utilizar a função "show_trajectories_info" para visualizar algumas informações sobre o conjunto de dados.
move_df.show_trajectories_info()
Para o pré-processamento, o nosso objetivo é realizar a compressão de dados, mas para isso é preciso passar por um conjunto de etapas. Vamos realizar as seguintes atividades:
O objetivo desta etapa é eliminar pontos que podem estar inconsistentes, duplicados ou contenham dados inválidos, a fim de contribuir para um melhor resultado nas etapas posteriores.
Primeiro vamos utiizar a função "clean_gps_jumps_by_distance" do módulo filters para eliminar outliers do conjunto de dados.
from pymove import filters
filters.clean_gps_jumps_by_distance(move_df)
Em seguida vamos para eliminar pontos consecutivos com a mesma latitude e a mesma longitude e por fim eliminar trajetórias que possuem menos de 100 pontos, para isso vamos utilizar as funções "clean_consecutive_duplicates" e "clean_trajectories_with_few_points" do módulo filters respectivamente.
filters.clean_consecutive_duplicates(move_df)
filters.clean_trajectories_with_few_points(move_df)
Agora que terminamos a filtragem de ruído, é necessário segmentar os dados. Uma das funções diponnives para isso é a "segmentation_by_max_dist" do módulo segmentation. A geometria foi o critério escolhido para realizar a segmentação. Foram segmentadas todas as trajetórias que possuíam uma distância superior a 200 metros entre os seus pontos adjacentes.
from pymove import segmentation
segmentation.by_max_dist(move_df, max_dist_between_adj_points = 200)
Para realizar a compressão é necessário identificar os pontos de parada, para isso vamos utilizar a função "create_or_update_move_stop_by_disttime" do módulo stay point_detection.
from pymove import stay_point_detection
stay_point_detection.create_or_update_move_stop_by_dist_time(move_df, dist_radius=40, time_radius=1000)
Agora que já realizamos todas as etapas necessárias vamos finalmente comprimir as trajetórias, para isso vamos utilizar a função "compress_segment_stop_to_point" do módulo compression.
from pymove import compression
compression.compress_segment_stop_to_point(move_df)
move_df.show_trajectories_info()
from pymove.visualization import visualization
Temos uma função que permite gerar cores aleatórias para que você possa ter mais opções de cores em suas visualizações!
visualization.generate_color()
Caso queira, você também pode gerar tuplas que representam cores RGB, passando a intensidade de cada cor.
rgb = visualization.rgb([0.6, 0.2, 0.2])
rgb
Com esta tupla RGB você pode gerar cores hexadecimais!
visualization.hex_rgb([0.6, 0.2, 0.2])
Podemos gerar uma visão geral que contém a distribuição de dados por período, hora, data e dia da semana para entender melhor como os dados são distribuídos.
visualization.show_object_id_by_date(move_df)
Podemos plotar todos os dados de trajetória para termos uma ideia ou noção inicial (ou confundirmo-nos mais ainda, rs). O marcador verde indica o ponto inicial da trajetória e marcador vermelho indica o ponto final.
Observação: Para essa e as demais visualizações com mapas, utilizamos a biblioteca Folium. Quando essas visualizações incluem muitos dados, a visualização não consegue ser carregada em um notebook como este. Por isso, recomendamos que você salve esse tipo de visualização como um arquivo .html. Para isto basta setar o parâmetro save_as_html como True e indicar o nome do arquivo a ser salvo no parâmetro filename. Neste tutorial iremos limitar o número de dados para que possamos vislumbrar aqui as visualizações.
visualization.plot_trajectories_with_folium(move_df, n_rows=10000)
Também podemos gerar visualizações dos pontos de trajetória filtrados por features de tempo, como:
Dia da semana com a função plot_trajectory_by_day_week
Período de tempo com data de início e data de término com a função plot_trajectory_by_date
Período de tempo com hora de início e hora de término com a função plot_trajectory_by_hour
Período de um dia com a função plot_trajectory_by_period
Aqui embaixo temos um exemplo utilizando o plot_trajectory_by_date.
visualization.plot_trajectory_by_date(move_df, '2008-10-23', '2008-10-23')
Também podemos gerar IDs para as trajetórias e plotar!
Utilizando o matplotlib:
move_df.generate_tid_based_on_id_datatime()
move_df.plot_traj_id(move_df['tid'][0])
Ou o Folium!
visualization.plot_trajectory_by_id_with_folium(move_df, 1, n_rows=1000, color="black")
Também podemos gerar visualizações com Mapa de Calor e visualizar quais as zonas quentes nos nossos dados!
visualization.heatmap(move_df, 10000)
Também podemos plotar a trajetória como pontos utilizando marcadores!
visualization.plot_markers(move_df, n_rows=400)
Ou, para não poluir tanto a visualização quando houver muitos dados, podemos utilizar a técnica de Cluster!
visualization.cluster(move_df, 1000)
E com isso, chegamos ao final de nosso tutorial!
O PyMove permanece em construção e aprimoramento de suas funcionalidades. Para sugestões ou eventuais dúvidas entre em contato conosco!