gpt4 book ai didi

python - 如何在计算期间并根据该计算的先前结果更新 Excel 中的值?

转载 作者:太空宇宙 更新时间:2023-11-03 11:38:21 26 4
gpt4 key购买 nike

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

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

我制作了一个简单概述的表格,其中有 2 个“供应”点和几个“需求”点。 “供应”点 1 的可用资源为 10,“供应”点 2 的可用资源为 20。所有“需求”点的需求各不相同。 The Excel table looks like this:

使用该 Excel 表格,我想计算从每个“供应”点 ('D') 到最接近(和第二个最接近……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 的值。

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

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

我尝试用字典中的值更新新的“供应”和“需求”值,但这并没有给出预期的结果。

最佳答案

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

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]

关于python - 如何在计算期间并根据该计算的先前结果更新 Excel 中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54829743/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com