如何根据该计算的先前结果在计算过程中更新Excel中的值



我正在使用模型来匹配供求。对该模型的简短说明:我有几个"供应"点具有一定的资源和几个"需求"点。目的是通过最大程度地减少运输距离来将可用的资源从"供应"点"排放"到最接近的"需求"点。

在Arcgis中,我已经找到了与相应距离的每个"供应"点最接近的"需求"点。此外,在"需求"点所需的"供应"点和资源上,我还拥有大量资源。我将结果存储在Excel表中,并将它们排序以使其距离很小到大,以便我可以使用Python与它们进一步合作。

我做了一个简单概述的桌子,其中我有2个"供应点"和几个"需求"点。"供应"点1的可用资源为10,在"供应"点2为20。所有"需求"点的需求各不相同。Excel表看起来像这样:

使用该excel表,我想计算每个"供应"点('d')可以提供多少个资源单位,并将最接近(最接近的……最接近的……最接近)的"需求"点('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的所有资源都用过(使用demand_fid = 10的"需求点" 6个单位为"需求点"和4个单位到"需求点"需求_fid = 11)。之后,所有"供应"点1(供应_r)的单位"消失",满足需求= 10的"需求点"的需求均已满足,并且demand_fid = 11的"需求点"的需求从6降低到1。因此,甚至不应计算第六行,因为"供应"点1不能为"需求点"提供任何其他资源因此,我想在计算一行之后更新供应_r和demand_r的值。

带有结果的"理想"表应该是这样的:

如何根据计算中的先前行解决一行更改一个值的问题?

我试图用字典的值更新新的"供应"one_answers"需求"值,但这并不能给出所需的结果。

我现在实际解决了问题。我正在使用词典来更新每一行的值(对不起,列的编号现在有所不同,但希望该方法很清楚)

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]

最新更新