Мой код в python блокноте запускается вечно, пожалуйста, помогите:
Моя слава данных выглядит так: ... | -From- | --- To --- | Название судна | --time-- | ... 0 | Море 0 | Порт 1 | --- Судно 1 --- | время 1 | ... Избранный 1 1 | Порт 1 | Порт 2 | --- Судно 1 --- | время 2 | ... 2 | Порт 2 | Порт 3 | --- Судно 1 --- | время 3 | ... 3 | Порт 3 | Море 0 | --- Судно 1 --- | время 4 | ... 4 | Море 0 | Порт 4 | --- Судно 1 --- | время 5 | ... 5 | Порт 4 | Порт 5 | --- Судно 1 --- | время 6 | ... Выбрано 2 (отфильтровано по сосуду 1)
- Цель: получить строки (i-я строка) из фрейма данных, которые соответствуют следующим требованиям:
- «От» - Море 0 для i-й строки, а «Кому» - порт, порт в списке желаемых портов (Выбран 1)
- «От» - Море 0 раньше, «Кому» - порт, порт в списке желаемых портов (для Chosen 2 в момент 6, время 5 From равно Sea 0) (Предположим, что это пример выше, порт 1 и порт 4 находятся в списке желаемых портов, поэтому выбраны строка 0 и строка 4)
Ввод и вывод
- ввод: фрейм данных над «df»
- промежуточный вывод: фрейм данных выше минус проверенные строки (не отмеченные строки ввода), имя «df_look»
- вывод: 1. для каждого судна: фрейм данных состоит из выбранных строк с именем «df_inbound» - 2. для всего сосуда: var (результат работы exe c функции)
Компонент модели
- Пример: список имен судов, необходимых для фильтрации основного фрейма данных, каждый отфильтрованный фрейм данных будет иметь пример имени фрейма данных. Каждый пример будет обновлен как df_look с помощью следующей функции:
- find_to_location (): для каждого df_look найдите строку, где «To» - это нужный порт, посмотрите строку за строкой в кадре данных df_look, удалите просмотренные строки и обновить до нового df_look, пока не будет найдена нужная строка, которая затем добавляется к df_inbound
- find_from_location_sea (): для каждого df_look найдите строку, где «From» - «0 море», посмотрите на df_look кадр за строкой, удалите строки, которые были просмотрены, обновите до нового df_look
- используйте функцию exce для получения желаемых строк из каждого кадра данных, отфильтрованных по судну: каждый кадр данных с фильтрацией по судну будет генерировать переменную {i} из его df_inbound, где i - позиция определенного имени судна в списке судов, а затем эти переменные {i} будут добавлены к основному выходу var
Процесс модели:
- Сохранение альтернативных запусков find_to_location () и find_from_location_sea () (find_to_location () fisrt и find_from_location_sea ()), пока не будет найдено 0 в "From "
- Используйте try-except, чтобы исправить ошибку, например, индекс вне допустимого диапазона (когда есть ошибка для одного из судов, функция не будет работать и ничего не будет делать, но ошибка с одним именем судна не помешает другому. название судна, так как они фильтруются независимо
Возникли проблемы
- Функция работает быстро, когда в списке только несколько судов
Когда списки судов становятся длинными ( Итого 2004 г.), похоже, модель будет работать вечно. Как уменьшить время работы?
Код
# the function (aa=1 in except is to stops the function when mistake occurs. It has no impact here)
def inboud_data(vessel_name):
example=df[df['Vessel']==vessel_name]
global df_inbound
df_inbound=pd.DataFrame()
df_look=example.iloc[0,len(example)+1]
index=0
def find_to_location():
nonlocal index
nonlocal df_look
global df_inbound
try:
while example.iloc[index]['ToLocation'] not in terminals:
if index <len(example):
index = index+1
df_inbound=df_inbound.append(example.iloc[index])
df_look = example.iloc[index+1:len(example)+1]
except:aa=1
find_to_location()
try:
while 'BROTCHIE (SEA)' in df_look['From Location'].tolist():
def find_from_location_sea():
nonlocal index
nonlocal df_look
try:
while example.iloc[index]['From Location'] !='BROTCHIE (SEA)':
if index <len(example):
index = index+1
df_look = example.iloc[index+1:len(example)+1]
except:aa=1
find_from_location_sea()
find_to_location()
except:aa=1
-
функция работает быстро с 2 судами:
vessel_inbound_list=['AMIS GLORY','AMIS FORTUNE']
var=pd.DataFrame()
for i in range(0,2):
vessel_name=vessel_inbound_list[i]
inboud_data(vessel_name)
exec('var{}=df_inbound'.format(i,i))
exec('var=var.append(var{})'.format(i))
var
-
функция работает вечно, когда есть суда 2004 года:
vessel_inbound_list=df['Vessel'].tolist()
new_vessel_inbound_list=[]
for a in vessel_inbound_list:
if a not in new_vessel_inbound_list:
new_vessel_inbound_list.append(a)
len(new_vessel_inbound_list) #2004 vessels
var=pd.DataFrame()
for i in range(0,2004):
vessel_name=vessel_inbound_list[i]
inboud_data(vessel_name)
exec('var{}=df_inbound'.format(i,i))
exec('var=var.append(var{})'.format(i))
var.to_csv ('inbound_traffic.csv')