我有一个地理位置点(日期时间、纬度、经度)的数据帧,我已经用关联的地理哈希标记了这些数据帧。
日期时间 纬度 经度 地理哈希 363446 2015-02-28 16:00:44.837 41.712755 -87.614916 dp3tq38 363428 2015-02-28 16:26:30.047 41.434128 -87.505173 dp3g8yb 363425 2015-02-28 16:30:02.659 41.421538 -87.480122 dp3g9kd 363411 2015-02-28 16:45:17.706 41.377853 -87.470677 dp3g3s9 363406 2015-02-28 16:54:50.763 41.290409 -87.467947 dp3fcse 363401 2015-02-28 17:01:21.800 41.295870 -87.439538 dp3ffm8 363373 2015-02-28 17:46:06.890 41.299363 -87.433795 dp3ffqk 363368 2015-02-28 18:07:05.769 41.299243 -87.433823 dp3ffqk 363367 2015-02-28 18:11:50.918 41.299261 -87.433823 dp3ffqk 363359 2015-02-28 18:23:33.470 41.299290 -87.433819 dp3ffqk
我将连续地理哈希的每个块视为一个独立的事件。 我想计算聚合并计算基本统计数据(最大值、最小值、平均值)的事件。
例如,在数据帧上方的最后四行与地理哈希dp3ffqk
相关联。 地理哈希dp3ffqk
存在于数据帧中的其他位置,因此groupby
似乎不合适。 我对这块地理哈希dp3ffqk
的期望输出是最小和最大时间戳之间的持续时间。
我看过cumsum
、rolling
、cut
等。 但是,它们似乎都暗示了一个静态窗口。 就我而言,我的窗口大小将是动态的。
我尝试使用shift()
创建额外的列GEOHASH_
。 然后在GEOHASH
和GEOHASH_
之间执行逐行比较,并在适当时更新词典。 这真的很混乱。
我期望的输出是合并与每个地理哈希相关的事件,以及基于为每个地理哈希计算的持续时间集合的统计数据。
GEOHASH 最大最小平均值 1 dp3ffqk 112 10 42.34 2 dp3ffm8 72 11 38.21
IIUC,即使你的数据没有显示它,我想你只想考虑GEOHASH的连续分组。 这意味着如果相同的 GEOHASH 稍后出现,它将被视为不同的组。
v = df.GEOHASH.values
groups = np.append(v[:-1] != v[1:], False).cumsum()
df.groupby([df.GEOHASH, groups]).agg(['min', 'max', 'mean'])
LATITUDE LONGITUDE
min max mean min max mean
GEOHASH
dp3fcse 5 41.290409 41.290409 41.290409 -87.467947 -87.467947 -87.467947
dp3ffm8 6 41.295870 41.295870 41.295870 -87.439538 -87.439538 -87.439538
dp3ffqk 6 41.299243 41.299363 41.299289 -87.433823 -87.433795 -87.433815
dp3g3s9 4 41.377853 41.377853 41.377853 -87.470677 -87.470677 -87.470677
dp3g8yb 2 41.434128 41.434128 41.434128 -87.505173 -87.505173 -87.505173
dp3g9kd 3 41.421538 41.421538 41.421538 -87.480122 -87.480122 -87.480122
dp3tq38 1 41.712755 41.712755 41.712755 -87.614916 -87.614916 -87.614916
更多参与,也没有对 GEOHASH 进行排序
v = df.GEOHASH.values
groups = np.append(v[:-1] != v[1:], False).cumsum()
funcs = dict(
LATITUDE=['min', 'max', 'mean'],
LONGITUDE=['min', 'max', 'mean'],
DATETIME=['min', 'max', 'count']
)
df.groupby([df.GEOHASH, groups], sort=False).agg(funcs)
LATITUDE LONGITUDE DATETIME
min max mean min max mean min max count
GEOHASH
dp3tq38 1 41.712755 41.712755 41.712755 -87.614916 -87.614916 -87.614916 2015-02-28 16:00:44.837 2015-02-28 16:00:44.837 1
dp3g8yb 2 41.434128 41.434128 41.434128 -87.505173 -87.505173 -87.505173 2015-02-28 16:26:30.047 2015-02-28 16:26:30.047 1
dp3g9kd 3 41.421538 41.421538 41.421538 -87.480122 -87.480122 -87.480122 2015-02-28 16:30:02.659 2015-02-28 16:30:02.659 1
dp3g3s9 4 41.377853 41.377853 41.377853 -87.470677 -87.470677 -87.470677 2015-02-28 16:45:17.706 2015-02-28 16:45:17.706 1
dp3fcse 5 41.290409 41.290409 41.290409 -87.467947 -87.467947 -87.467947 2015-02-28 16:54:50.763 2015-02-28 16:54:50.763 1
dp3ffm8 6 41.295870 41.295870 41.295870 -87.439538 -87.439538 -87.439538 2015-02-28 17:01:21.800 2015-02-28 17:01:21.800 1
dp3ffqk 6 41.299243 41.299363 41.299289 -87.433823 -87.433795 -87.433815 2015-02-28 17:46:06.890 2015-02-28 18:23:33.470 4