Я работаю над проектом, в котором я импортирую файл .gpx и преобразую его в Pandas фрейм данных для дальнейшего анализа. Этот файл содержит данные о местонахождении и времени тренировок, например, от Strava, Endomondo, Runkeeper и т. Д. Я уже рассчитал статистику, такую как общее расстояние, время и скорость, но затем я также хочу найти самое быстрое или лучшее время для указанных c расстояний в пределах тренировки. Итак, для 16-километровой тренировки я хочу вычислить мои самые быстрые 5k, 10k и т. Д. В пределах этих 16k.
Я написал кое-что, что работает, но это включает в себя циклы по кадру данных. Так как циклирование над фреймом данных - это то, чего я должен избегать, я чувствую, что должно быть более эффективное решение.
Фрейм данных выглядит примерно так:
distance_dis_3d time_delta
0 0.000000 0.0
1 0.000000 18.0
2 28.229476 1.0
3 5.452599 3.0
4 3.078864 1.0
...
Этот код работает для нахождения самого быстрого 5000 метров:
df_selected['distance_cumsum'] = df_selected['distance_dis_3d'].cumsum()
df_selected['time_cumsum'] = df_selected['time_delta'].cumsum()
df_output = pd.DataFrame(columns=['time', 'distance', 'minutes_per_kilometer'])
for i in range(len(df_selected.index)):
df_xK = df_selected[(df_selected['distance_cumsum'] - df_selected['distance_cumsum'].iat[i]) >= 5000]
if(len(df_xK.index) != 0):
time = df_xK['time_cumsum'].iat[0] - df_selected['time_cumsum'].iat[i]
distance = df_xK['distance_cumsum'].iat[0] - df_selected['distance_cumsum'].iat[i]
minutes_per_kilometer = (time/60)/(distance/1000)
df_output = df_output.append({'time': time, 'distance': distance, 'minutes_per_kilometer': minutes_per_kilometer}, ignore_index=True)
best_5k = df_output.loc[df_output['minutes_per_kilometer'].idxmin()]
print('Time 5K:', floor(best_5k['time'] / 60), 'min', floor(best_5k['time'] % 60), 'sec.')
Я знаю, что должен использовать векторизацию или .apply (), но я не могу понять, как это сделать здесь. Так что любая помощь очень ценится! Спасибо!
Тестовый файл можно скачать здесь: http://gofile.me/2RsVN/dos1tPTVD