2015-02-26 2 views
0

У меня есть DataFrame ФР, как следующее:панд - применять временные и пространственные функции для GroupBy

User_ID;Latitude;Longitude;Datetime 
222583401;41.4020375;2.1478710;2014-07-06 20:49:20 
287280509;41.3671346;2.0793115;2013-01-30 09:25:47 
329757763;41.5453577;2.1175164;2012-09-25 08:40:59 
189757330;41.5844998;2.5621569;2013-10-01 11:55:20 
624921653;41.5931846;2.3030671;2013-07-09 20:12:20 
414673119;41.5550136;2.0965829;2014-02-24 20:15:30 
414673119;41.5550136;2.0975829;2014-02-24 20:16:30 
414673119;41.5550136;2.0985829;2014-02-24 20:17:30 

Он содержит информацию о пространстве пользователей (широта и долгота) и время (DateTime) местоположение. Все пользователи показывают единую пространственно-временную позицию, но последний 414673119, который прослеживается тремя пробами во времени и месте. Я хотел бы оценить такой параметр, как «скорость» пользователей. Я хотел бы использовать функции pandas, применяемые в столбцах Latitude/Longitude, связанные с самым коротким расстоянием между двумя точками с евклидовым расстоянием. Вызов LAT1 и LAT2 различных положения в пространстве во время первого этапа движения (то же самое для Lon и DateTime), я могу оценить:

distance_1_2 = math.sqrt((Lat2-Lat1)**2 + (Lon2-Lon1)**2) 
time_1_2 = Datetime2 - Datetime1 

, а затем:

speed_1_2 = distance_1_2/time_1_2 

До сих пор я сортирую и сгруппированы в DataFrame по user_id для обнаружения нескольких (и последовательных) движений:

# Track User Movements in Space and Time - Sort Information 
track = df.sort(['User_ID','Datetime']) 
# MultiIndex --> Index on 'User_ID' 
grouped = track.groupby(['User_ID']) 

Теперь проблема доступа к информации о группе о пространстве и времени , и фильтровать пользователей с параметром speed выше или ниже определенного значения. Большое спасибо за вашу любезную помощь.

ответ

1

У вас есть большая часть штук на месте. Вот некоторые настройки, которые могут помочь.

  • Для вычисления различия между соседними значениями в серии, использовать метод diff. Так, например, Lat2-Lat1 станет grp['Lat'].diff().

    dist = np.sqrt(grp['Latitude'].diff()**2 + grp['Longitude'].diff()**2) 
    
  • Если Datetime столбец имеет DTYPE datetime64[ns], то разница между двумя датами, df['Datetime'].diff() будет timedelta64[ns]. Чтобы разделить расстояние (поплавок) на timedelta64[ns], сначала вам нужно преобразовать timedelta64[ns] в поплавок. Для того, чтобы преобразовать его в число секунд, разделите на np.timedelta64(1, 's'):

    time = grp['Datetime'].diff()/np.timedelta64(1, 's') 
    
  • Вам не нужно сортировать по ['User_ID','Datetime']. Метод groupby отлично работает с несортированными данными. Так пропустить то и просто вызовите

    grouped = df.groupby(['User_ID'], group_keys=False) 
    

import numpy as np 
import pandas as pd 

def speed(grp): 
    dist = np.sqrt(grp['Latitude'].diff()**2 + grp['Longitude'].diff()**2) 
    time = grp['Datetime'].diff()/np.timedelta64(1, 's') 
    result = dist/time 
    return result 

df = pd.read_table('data', sep=';', parse_dates=[3]) 
grouped = df.groupby(['User_ID'], group_keys=False) 
spd = grouped.apply(speed) 
mask = spd > 1e-6 
print(df.loc[mask]) 

урожаи

 User_ID Latitude Longitude   Datetime 
6 414673119 41.555014 2.097583 2014-02-24 20:16:30 
7 414673119 41.555014 2.098583 2014-02-24 20:17:30 
+0

Ого, здорово! Спасибо большое! –

+0

Итак, в этом случае, в каком блоке измеряется скорость? Время во втором, но расстояние? Что делать, если я хотел бы реализовать большое расстояние между двумя точками? –

Смежные вопросы