возвращение ежедневного отчета пользователя, который паркует свой скутер в пределах 100 м от каждого местоположения в кадре данных - PullRequest
0 голосов
/ 20 сентября 2019

Я использую 2 кадра данных.

rent_aug_df выглядит следующим образом:

    end_time                lng        lat
0   2019-08-01 05:16:12  127.048667  37.504856
1   2019-08-01 05:39:18  126.934945  37.558505
2   2019-08-01 05:39:47  126.889154  37.581799
3   2019-08-01 05:44:03  0.000000    0.000000
4   2019-08-01 06:00:13  127.067109  37.543945

cu_nodes_df выглядит так:

id  title            created_at              lng      lat
0   location_1  2019-01-16 21:21:11     127.03338   37.486277
1   location_2  2019-02-15 20:54:59     127.11021   37.402250
2   location_3  2019-02-22 17:57:02     126.93289   37.519600
3   location_4  2019-02-26 21:58:27     127.04459   37.524680
4   location_5  2019-02-26 21:58:55      127.02592  37.518500

Цель: перебрать все location_i в cu_nodes_df ["title"] и сравнить его геокод скаждый геокод в строках rent_aug_df.

это мой код:

from haversine import haversine, Unit
data = {}
for node in cu_nodes_df["title"]:

    # (lat, lng) for current cu_node, getting row where title match.
    geo_df = cu_nodes_df.loc[cu_nodes_df["title"] == node][["lng", "lat"]]
    cu_geocode = (geo_df.T.values[0][0], geo_df.T.values[1][0])

    # x = each row of (lat,lng) in rent_aug_df 
    df = pd.DataFrame(rent_aug_df[(rent_aug_df[['lat','lng']].apply(lambda x: haversine(x, cu_geocode), axis=1)) <= 0.1])

    print(df.head())
    print(type(cu_geocode[0]))
    print(cu_geocode)
    print(df.dtypes)

    df.set_index('end_time', inplace = True)
    data[node] = list(df.groupby(df.index.date)["end_loc"].count())

final = pd.DataFrame(data=data)

вывод на печать:

Empty DataFrame
Columns: [end_loc, end_time, lng, lat]
Index: []
<class 'numpy.float64'>
(127.03338, 37.486277)
end_loc             object
end_time    datetime64[ns]
lng                float64
lat                float64
dtype: object

Я не могу выяснить, что не так с кодом.Я попробовал большинство альтернатив, которые я мог придумать.Я пробовал использовать единственный cu_geocode:

df = pd.DataFrame(rent_aug_df[(rent_aug_df[['lat','lng']].apply(lambda x: haversine(x, (37.504855525623, 127.04866656867)), axis=1)) <= 0.1])

Это прекрасно работает, создавая df, состоящий из арендованных скутеров, которые были возвращены в пределах 0,1 км

, почему он не работает внутри forloop?Заранее спасибо

РЕДАКТИРОВАТЬ: у меня (lng, lat) вместо (lat, lng), когда я изменяю его, он работает.

1 Ответ

0 голосов
/ 20 сентября 2019

Просто подсказка к удобочитаемости кода.

# Augment a new column to have geocode tuple
df['geo_code'] = df.apply(lambda x: (x['lng'], x['lat']))

# Convert to a dict
new_df = df.filter(items['title', 'geo_code'])
data = new_df.to_dict()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...