pandas cumsum, который сбрасывается при достижении некоторого значения - PullRequest
2 голосов
/ 27 апреля 2019

Я хочу вычислить сумму для некоторого столбца, но сбрасываю сумму каждый раз, когда достигаю некоторого значения.

Я прочитал несколько вопросов, касающихся условного сброса для суммы.Все они включают в себя какой-то другой столбец, который имеет «значение сброса».

Я использую функцию расстояния geopy, чтобы вычислить расстояние от первой точки (строка 0), которая выдает

    lat lng all_distances
0   39.984198   116.319322  0.000000
12  39.984611   116.319822  62.663690
24  39.984252   116.320826  128.601760
36  39.983916   116.320980  145.036185
48  39.982688   116.321225  233.518640
60  39.981441   116.321305  349.856365
72  39.980291   116.321430  469.693983

Но я хочу вычислить расстояние до 200, а затем снова вычислить сумму, но заменить «первую» точку следующей точкой.

Вот работающий MCVE, чтобы его время могло бытьпо сравнению с векторизованным временем.

import pandas as pd
from geopy.distance import distance
print(pd.__version__)

data = [[ 39.984198, 116.319322],
       [ 39.984611, 116.319822],
       [ 39.984252, 116.320826],
       [ 39.983916, 116.32098 ],
       [ 39.982688, 116.321225],
       [ 39.981441, 116.321305],
       [ 39.980291, 116.32143 ],
       [ 39.979675, 116.321805],
       [ 39.979546, 116.322926],
       [ 39.979758, 116.324513]]

user_gps_log = pd.DataFrame(data, columns=['lat', 'lng'])

first_lat = user_gps_log.iloc[0].lat
first_lng = user_gps_log.iloc[0].lng
all_distances = user_gps_log.apply(lambda x: distance((x.lat, x.lng), (first_lat, first_lng)).m, axis=1)

user_gps_log['all_distances'] = all_distances

p = user_gps_log
i = 0
dist_thres = 2

while i < len(p):
    j = i+1
    while j < len(p):
        dist = distance((p.iloc[i].lat, p.iloc[i].lng), (p.iloc[j].lat, p.iloc[j].lng)).m
        if dist > dist_thres:
            # do stuff
            i = j
            token = 1
        break
    j = j+1

РЕДАКТИРОВАТЬ ОБНОВЛЕНИЕ

Пробная реализация с использованием njit (нельзя избежать повторения ..)

@njit
def cumsum_distance(lat, lng, limit=200):
    running_distance = 0
    first = (lat[0], lng[0])
    for i in range(lat.shape[0]):
        dist = distance(first, (lat[i], lng[i])).m
        running_distance += dist
        if running_distance > limit:
            yield i, running_distance
            running_distance = 0

runnig_distances = cumsum_distance(user_gps_log.lat.values, user_gps_log.lng.values, 200)

Получение этой ошибки:

TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Untyped global name 'distance': cannot determine Numba type of <class 'type'>

File "<ipython-input-194-7214618c7e64>", line 6:
def cumsum_distance(lat, lng, limit=200):
    <source elided>
    for i in range(lat.shape[0]):
        dist = distance(first, (lat[i], lng[i])).m
        ^

This is not usually a problem with Numba itself but instead often caused by
the use of unsupported features or an issue in resolving types.

Это потому, что я использую функцию расстояния геопсии?нужно ли регистрировать «тип» так же, как при использовании udaf в pyspark?

...