#python #pandas #algorithm #while-loop
#python #pandas #алгоритм #цикл while
Вопрос:
Я работаю со следующим dfW
фреймом данных (это образец из гораздо большего набора данных):
bank_id x_coordinate y_coordinate money time (hr)
725 725 -0.171722 -4.622425 60700 0.720254
5068 5068 0.899443 0.337507 300 1.408178
6618 6618 2.294234 1.146300 21500 1.296493
2455 2455 -0.946596 2.457585 21300 1.276988
166 166 0.687787 -2.578104 24900 1.312164
2450 2450 0.670821 -0.538727 1100 1.282857
6283 6283 -0.099760 -0.822922 600 0.728104
81 81 2.530440 -0.342033 200 1.327394
3920 3920 3.755900 -4.829356 200 0.383559
9877 9877 -2.262354 -0.245852 1700 0.357900
С ограничением по времени 3 я пытаюсь подсчитать, сколько денег ( score
) я могу извлечь из банков в df, путешествуя со скоростью 30 км / ч от банка к банку, и df['time hr()']
время, необходимое для ограбления банка.
Поэтому я написал следующий код (это часть более крупной функции, но этого достаточно для моего вопроса):
import pandas as pd
import math
bank_list = []
time_left = 3
score = 0
dfW['money/hour'] = dfW['money']/dfW['time (hr)']
while time_left > 1:
df30k = dfW.loc[dfW['money/hour'] > 30_000]
df30k.reset_index(drop=True, inplace=True)
for index, row in df30k.iloc[:-1].iterrows():
current_position = (df30k["x_coordinate"].iloc[index], df30k["y_coordinate"].iloc[index])
new_position = (df30k["x_coordinate"].iloc[(index 1)], df30k["y_coordinate"].iloc[(index 1)])
dist_travelled = math.dist(current_position, new_position)
travel_time = dist_travelled/30
rob_time = df30k["time (hr)"].iloc[index]
time_left -= travel_time
time_left -= rob_time
money_collected = df30k["money"].iloc[index]
score = money_collected
bank_id = df30k["id"].iloc[index]
bank_list.append(bank_id)
time_left -= df30k["time (hr)"].iloc[-1]
score = df30k["money"].iloc[-1]
bank_list.append(df30k["id"].iloc[-1])
print(str(time_left) ' hr remains')
score, time_left
Когда я запускаю код, я получаю следующий вывод:
2.2797462995297955 hr remains
1.559492599059591 hr remains
0.8392388985893864 hr remains
(182100, 0.8392388985893864)
В то время как я хочу, чтобы код прекращал выполнение, когда time_left>= 1, а затем возвращал результат в это время. Я чувствую, что мне не хватает чего-то основного, но не могу понять это. Любая помощь приветствуется!
Комментарии:
1. итак, вы хотите иметь 1.55 в качестве исходного кода?
2. да, в основном хочу, чтобы он остановился после 1.55 (если это последний раз, когда time_left> 1)
3. адаптируйте мое решение к вашему коду и дайте мне знать
Ответ №1:
Решение
while True:
if loop:
...
# outside the if loop
if time_left - X < 1:
print(time_left)
break
Адаптируйте его к своему коду.
if time_left - df30k["time (hr)"].iloc[-1] < 1:
print((score,time_left))
break
time_left -= df30k["time (hr)"].iloc[-1]
score = df30k["money"].iloc[-1]
bank_list.append(df30k["id"].iloc[-1])
print(str(time_left) ' hr remains')
Объяснение
В вашем цикле while вы проверяете, будет ли следующая итерация меньше 1, если да, прервите код и дайте мне текущие значения.
Комментарии:
1. Спасибо за ответ. Просто возник вопрос, хотя, на
if time_left - X < 1:
что ссылается X? И пойдет ли мой код внутрьif loop:
?2.
X
то естьdf30k["time (hr)"].iloc[-1]
вы хотите указать своему коду проверить, будет ли time_left для следующей итерации меньше 1, прежде чем переходить к следующей итерации.3. @sak упростил для вас
4. Эй, я наконец-то получил возможность адаптировать его к своему коду и реализовать его! Для конкретного примера, который я привел выше, этот код действительно работает! Однако, когда я использую его для большей функции, я застреваю в бесконечном цикле while, но я думаю, что смогу это понять. Большое спасибо за вашу помощь!
5. Итак, мой больший код — это в основном то, чем я поделился выше, повторенный еще пару раз для банков с разными коэффициентами. Итак, то, чем я поделился, проверяет банки с соотношением деньги / час> 30_000, а моя более крупная функция имеет пару других диапазонов (пытаясь использовать жадный алгоритм, в котором я сначала выбираю банки с самыми высокими коэффициентами и так далее), Так что это тот же код, который просто повторяется еще 2-3 раза для разных коэффициентов