如何在计算期间更新Excel中的值并基于该计算的先前结果?

问题描述 投票:4回答:1

我正在研究一种匹配供需的模型。对模型的简短解释:我有几个“供应”点,具有一定的资源单位和几个“需求”点。目的是通过最小化传输距离将可用资源从“供应”点“释放”到最接近的“需求”点。

在ArcGIS中,我已经找到了与每个“供应”点最近的“需求”点以及相应的距离。此外,我有“供应”点产生的资源量和“需求”点所需的资源。我将结果存储在Excel表格中,并将它们从小到大的距离进行排序,以便我可以使用Python进一步处理它们。

我做了一个简单概述的表格,我有2个“供应”点和几个“需求”点。 “供应”点1处可用的资源是10,“供应”点2处的资源是20.所有“需求”点的需求变化。 The Excel table looks like this:

有了这个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

上面的代码在列表长度的所有行中工作并计算我想要的所有值。

但是,仍有一个问题:

现在编写代码的方式,它不会正确更新供应和需求的值。因此,没有考虑到,如果从一个“供应”点向“需求”点提供一些资源,则“供应”单元中的可用资源量随后的计算而改变。

更具体地,“供应”点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的值。

The “ideal” table with results should look like this:

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

我试图用字典中的值更新新的“供应”和“需求”值,但这不会产生预期的结果。

python excel python-2.7 arcmap
1个回答
1
投票

我现在真的解决了这个问题。我正在使用字典更新每行中的值(抱歉,列的编号现在不同但希望方法变得清晰)

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]
© www.soinside.com 2019 - 2024. All rights reserved.