Как обновить значения в Excel во время расчета и на основе предыдущих результатов этого расчета? - PullRequest
0 голосов
/ 22 февраля 2019

Я работаю над моделью, чтобы соответствовать спросу и предложению.Краткое объяснение модели: у меня есть несколько точек «предложения» с определенной единицей ресурсов и несколькими точками «спроса».Цель состоит в том, чтобы «разгрузить» имеющиеся ресурсы из точек «предложения» в ближайшую точку «спроса», минимизируя транспортные расстояния.

В ArcGIS я уже нашел ближайшую точку «спроса» для каждой точки «поставки» с соответствующим расстоянием.Кроме того, у меня есть количество ресурсов, произведенных в точке «предложения», и ресурсы, необходимые в точке «спроса».Я сохранил результаты в таблице Excel и отсортировал их по расстоянию от малого до большого, чтобы я мог работать с ними дальше, используя Python.

Я составил таблицу с простым обзором, где у меня есть 2 точки «предложения» и несколько точек «спроса».Ресурсы, доступные в точке 1 «снабжения», равны 10, а в точке 2 «предложения» - 20. Спрос во всех точках «спроса» варьируется. Таблица Excel выглядит следующим образом:

Используя эту таблицу Excel, я хочу вычислить, сколько единиц ресурсов можно было бы доставить из каждой точки «поставки» («D») к ближайшей(и 2-ая ближайшая… n ближайшая) точка «спроса» («E») до тех пор, пока значение в точке «предложения» не станет равным 0 / распределено полностью.Я хочу сохранить значение того, сколько переносится из «предложения» в «спрос» в дополнительном столбце («F»). Для этого я написал следующий код:

for row in range(1,sheet.max_row+1):
   if sheet['D'+str(row)].value !=0 and sheet['E'+str(row)].value !=0:
    for row in range(1,sheet.max_row+1):
        if sheet['D'+str(row)].value > sheet['E'+str(row)].value:
            sheet['F'+str(row)].value = sheet['E'+str(row)].value
            sheet['D'+str(row)].value = sheet['D'+str(row)].value - sheet['E'+str(row)].value
            sheet['E'+str(row)].value = 0
        if sheet['D'+str(row)].value < sheet['E'+str(row)].value:
            sheet['F'+str(row)].value = sheet['D'+str(row)].value
            sheet['E'+str(row)].value = sheet['E'+str(row)].value -sheet['D'+str(row)].value
            sheet['D'+str(row)].value = 0
        if sheet['D'+str(row)].value == sheet['E'+str(row)].value:
            sheet['F'+str(row)].value = sheet['E'+str(row)].value
            sheet['D'+str(row)].value = 0
            sheet['E'+str(row)].value = 0

Приведенный выше код работает и рассчитываетвсе значения, которые я хочу в столбцах F во всех строках по всей длине списка.

Однако остается одна проблема:

То, как код написан сейчас, не корректно обновляет значения спроса и предложения.Таким образом, не принимается во внимание, что если некоторые ресурсы поставляются из одной точки «предложения» в точку «спроса», то количество доступных ресурсов в ячейке «предложения» изменяется для расчетов после этого.

В частности, пункт «снабжения» 1 имеет только 10 единиц, которые он может «распределить».В приведенной ниже таблице примеров точка 1 «снабжения» может поставлять ресурсы только в первую и вторую ближайшую точку «спроса», пока все ресурсы точки «снабжения» 1 не будут израсходованы (6 единиц до «точки спроса» с DEMAND_FID = 10и 4 единицы для «точки спроса» DEMAND_FID = 11).После этого все единицы «точки поставки» 1 (SUPPLY_R) «исчезают», спрос «точки спроса» с DEMAND_FID = 10 выполняется, а спрос «точки спроса» с DEMAND_FID = 11 уменьшается с 6 до 1.Поэтому 6-ю строку не следует даже вычислять, поскольку точка 1 «поставки» не может предоставить какие-либо дополнительные ресурсы для «точки спроса». Поэтому я хочу обновить значения SUPPLY_R и DEMAND_R после того, как была вычислена одна строка.

«Идеальная» таблица с результатами должна выглядеть следующим образом:

Как решить проблему изменения одного значения в одной строке на основе предыдущих строк врасчет?

Я пытался обновить новые значения «предложение» и «спрос» значениями из словаря, но это не дает желаемого результата.

1 Ответ

0 голосов
/ 11 марта 2019

Я действительно решаю проблему сейчас.Я работаю со словарем, чтобы обновить значения в каждой строке (извините, нумерация столбцов теперь другая, но, надеюсь, метод станет понятен)

dict1={1: 156, 2: 5, 3: 207, ....., 226: 142}
dict2={{1: 23, 2: 18, 3: 23,....., 1530: 9}

for row in range(2,sheet.max_row+1):
   sheet['F'+str(row)].value = dict1[sheet['C'+str(row)].value] 
   sheet['I'+str(row)].value = dict2[sheet['D'+str(row)].value]

   if sheet['F'+str(row)].value > sheet['I'+str(row)].value:
          sheet['L'+str(row)].value = sheet['I'+str(row)].value 
          if sheet['L'+str(row)].value <= 0:
                sheet['L'+str(row)].value = None
          sheet['F'+str(row)].value = sheet['F'+str(row)].value -sheet['I'+str(row)].value
          sheet['I'+str(row)].value = 0
          if sheet['L'+str(row)].value > 0:
                sheet['M'+str(row)].value = sheet['C'+str(row)].value
          else:
                sheet['M'+str(row)].value = None
          if sheet['L'+str(row)].value > 0:
                sheet['N'+str(row)].value = sheet['D'+str(row)].value
          else:
                sheet['N'+str(row)].value = None

      #2 different methods to update the dictionary
          dict1_1={sheet['C'+str(row)].value :sheet['F'+str(row)].value}
          dict1.update(dict1_1)
          sheet['F'+str(row)].value = dict1[sheet['C'+str(row)].value]
          dict2[sheet['D'+str(row)].value]= sheet['I'+str(row)].value
          sheet['I'+str(row)].value = dict2[sheet['D'+str(row)].value]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...