pandas - 将时间和 space 函数应用于 groupby
pandas - apply time and space functions to groupby
我有一个如下所示的 DataFrame df:
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
它包含有关用户Space(纬度和经度)和时间(日期时间)位置的信息。所有用户显示单个 space 时间位置,但最后一个 414673119,由时间和地点的三个样本运动追踪。我想评估一个参数,例如 Users "speed"。我想使用应用于纬度/经度列的 pandas 函数,与欧几里德距离的两点之间的最短距离相关。
在第一步移动期间调用 Lat1 和 Lat2 space 中的不同位置(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
到目前为止,我按 User_ID 对 DataFrame 进行了排序和分组,以检测多个(和连续的)运动:
# 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'])
现在的问题是访问space和时间的组信息,过滤speed
参数高于或低于某个值的用户。
非常感谢您的帮助。
你已经完成了大部分工作。这里有一些可能有用的调整。
要计算系列中相邻值之间的差异,请使用 diff
方法。因此,例如,Lat2-Lat1
将变为 grp['Lat'].diff()
。
dist = np.sqrt(grp['Latitude'].diff()**2 + grp['Longitude'].diff()**2)
如果 Datetime
列的数据类型为 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
我有一个如下所示的 DataFrame df:
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
它包含有关用户Space(纬度和经度)和时间(日期时间)位置的信息。所有用户显示单个 space 时间位置,但最后一个 414673119,由时间和地点的三个样本运动追踪。我想评估一个参数,例如 Users "speed"。我想使用应用于纬度/经度列的 pandas 函数,与欧几里德距离的两点之间的最短距离相关。 在第一步移动期间调用 Lat1 和 Lat2 space 中的不同位置(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
到目前为止,我按 User_ID 对 DataFrame 进行了排序和分组,以检测多个(和连续的)运动:
# 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'])
现在的问题是访问space和时间的组信息,过滤speed
参数高于或低于某个值的用户。
非常感谢您的帮助。
你已经完成了大部分工作。这里有一些可能有用的调整。
要计算系列中相邻值之间的差异,请使用
diff
方法。因此,例如,Lat2-Lat1
将变为grp['Lat'].diff()
。dist = np.sqrt(grp['Latitude'].diff()**2 + grp['Longitude'].diff()**2)
如果
Datetime
列的数据类型为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