Python Скрипт запускается бесконечно (успешно, если ввод в меньшем масштабе) - PullRequest
0 голосов
/ 01 августа 2020

Мой код в 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)

  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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...