如何使用datafram编写三维索引

2024-09-29 06:32:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我在优化一个有很多参数的随机问题,其中一个参数由三组组成。对于那个特定的参数,我试图使用dataframe在三维中编写它,但我一直得到IndexError: list index out of range。如何在3-dimension中正确地编写这个问题

我尝试过逐行编写值和其他一些格式,但仍然没有很好的改变

from __future__ import print_function, absolute_import, division
import sys
import os


def main(argc, argv):
    from amplpy import AMPL, DataFrame
    os.chdir(os.path.dirname(__file__) or os.curdir)
    try:
        ampl = AMPL()

        if argc > 1:
            ampl.setOption('solver', argv[1])

        # Read the model file
        modelDirectory = argv[2] if argc == 3 else os.path.join('..', 'models')
        ampl.read(os.path.join(modelDirectory, 'pigskin_updated/pigskin_updated.mod'))

        periods = ['0']

        df = DataFrame('PERIOD')
        df.setColumn('PERIOD', periods)
        ampl.setData(df, 'PERIOD')

        period1toends = ['1']

        df = DataFrame('PERIOD1_TO_END')
        df.setColumn('PERIOD1_TO_END', period1toends)
        ampl.setData(df, 'PERIOD1_TO_END')

        products = ['1P', '2P']

        df = DataFrame('PRODUCT')
        df.setColumn('PRODUCT', products)
        ampl.setData(df, 'PRODUCT')

        resources = ['1R', '2R']

        df = DataFrame('RESOURCE')
        df.setColumn('RESOURCE', resources)
        ampl.setData(df, 'RESOURCE')

        scenarios = ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '30']

        df = DataFrame('SCENARIO')
        df.setColumn('SCENARIO', scenarios)
        ampl.setData(df, 'SCENARIO')

        prodcost = [
            [12.5],
            [12.55]
        ]

        df = DataFrame(('PRODUCT', 'PERIOD1_TO_END'), 'Prodcost')
        df.setValues({
            (product, period1toend): prodcost[i][t]
            for i, product in enumerate(products)
            for t, period1toend in enumerate(period1toends)
        })
        ampl.setData(df)

        Resource = [
            [ 16,    100],
            [ 24,   200]
        ]

        df = DataFrame(('PRODUCT', 'RESOURCE'), 'Resource')
        df.setValues({
            (product, resource): Resource[i][r]
            for i, product in enumerate(products)
            for r, resource in enumerate(resources)
        })
        ampl.setData(df)

        avail = [
           [138516],
           [278847]
        ]

        df = DataFrame(('RESOURCE', 'PERIOD1_TO_END'), 'avail')
        df.setValues({
            (resource, period1toend): avail[r][t]
            for r, resource in enumerate(resources)
            for t, period1toend in enumerate(period1toends)
        })
        ampl.setData(df)

        perhold = [
            [0.0008],
            [0.0008]
        ]

        df = DataFrame(('PRODUCT', 'PERIOD1_TO_END'), 'perhold')
        df.setValues({
            (product, period1toend): perhold[i][t]
            for i, product in enumerate(products)
            for t, period1toend in enumerate(period1toends)
        })
        ampl.setData(df)

        prob = [
             0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333, 0.03333333 
        ]

        df = DataFrame(('SCENARIO'), 'prob')
        df.setValues({
            (scenario): prob[s]
            for s, scenario in enumerate(scenarios)
        })
        ampl.setData(df)

        Demand = [
            [[216],[191 ]],[[290],[330 ]],[[224],[194 ]],[[283],[329 ]],[[159],[164 ]],[[215],[349 ]],[[247],[201 ]],[[201],[328 ]],[[343],[230 ]],[[326],[278 ]],[[319],[342 ]],[[223],[298 ]],[[292],[191 ]],[[262],[284 ]],[[285],[200 ]],[[296],[346 ]],[[210],[318 ]],[[200],[257 ]],[[314],[336 ]],[[205],[290 ]],[[174],[184 ]],[[258],[290 ]],[[284],[158 ]],[[264],[312 ]],[[228],[333 ]],[[239],[255 ]],[[190],[322 ]],[[344],[219 ]],[[280],[241 ]],[[186],[254 ]]        
        ]
        df = DataFrame(('SCENARIO','PRODUCT','PERIOD1_TO_END'), 'Demand')
        df.setValues({
            (scenario,product,period1toend): Demand[i][t][s]
            for i, product in enumerate(products)
            for t, period1toend in enumerate(period1toends)
            for s, scenario in enumerate(scenarios)

        })
        ampl.setData(df)

        ampl.solve()

        print('Objective: {}'.format(ampl.getObjective('Total_cost').value()))

        produce = ampl.getVariable('Produce')
        df = produce.getValues()
        # Print them
        print(df)
        # Get the values of the variable in a dataframe object
        inventory = ampl.getVariable('Inventory')
        df = inventory.getValues()
        # Print them
        print(df)

    except Exception as e:
        print(e)
        raise


if __name__ == '__main__':
    main(len(sys.argv), sys.argv)

我希望目标(Total_value)值的输出是8679.95,而生产和库存的值是


Tags: toindataframedfforosproductend