Загрузка данных JSON через DataPortal в параметр

Я хочу загрузить данные из файла JSON в свою модель Pyomo. Я начинаю с

m = AbstractModel()
m.T = RangeSet(1,48,1)
m.TS = Param(m.T)
dp = DataPortal()

Позже я хочу загрузить свой файл json, чтобы заполнить свой параметр TS с помощью

dp.load(param = m.TS, filename = data.json)

Данные представляют собой таймсерии, индексированные целыми числами 1,2, ..., 48 Таким образом, это выглядит так:

{ 
  "1" : 0.0001,
  "2" : 0.1 ,
  ....,
  "48" : 0
}

тогда я создаю

create_instance(dp)

Я получаю следующую ошибку:

RuntimeError: Failed to set value for param=TS, index=1, value=35.676187.
        source error message="Index '1' is not valid for indexed component 'TS'"

person kipstar    schedule 18.06.2019    source источник
comment
При тестировании с ConcreteModel вместо AbstractModel, 1 in m.T возвращает True, а если я использую AbstractModel, этого не происходит. Я предполагаю, что вам нужно создать экземпляр перед использованием портала данных, поскольку m.T.display() показывает, что RangeSet не создан.   -  person V. Brunelle    schedule 18.06.2019
comment
Ах да, простите меня за то, что я не был эффективным с DataPortal, так что я могу ошибаться. Но я вижу, что ваши данные очень похожи на словарь. Если вы посмотрите на свои ключи, вы увидите, что это строки, а не числа. Поскольку RangeSet() генерирует набор с числами, возможно, он не найдет строку"1" в вашем наборе чисел, и это также объяснит вашу ошибку.   -  person V. Brunelle    schedule 18.06.2019
comment
Привет, спасибо за идеи. Но поскольку мне нужно перебирать индекс, я думаю, что числовые данные необходимы, поскольку порядок изменяется, когда я использую строки.   -  person kipstar    schedule 27.06.2019
comment
Я понимаю. Я имел в виду, что, возможно, ваши ключи не преобразуются в числа между вашим JSON и Pyomo, и это может быть проблемой. Но я больше готов поспорить, что проблема в том, как вы справляетесь с AbstractModel.   -  person V. Brunelle    schedule 27.06.2019
comment
@V.Brunelle прав, тот факт, что эти ключи являются строками, определенно является проблемой. Вы можете либо преобразовать эти ключи в целые числа, либо сразу использовать YAML, поскольку он поддерживает целые числа в качестве ключей.   -  person Giorgio Balestrieri    schedule 29.06.2019


Ответы (1)


Итак, я пришел с решением этой проблемы. Файл JSON должен быть записан следующим образом:

{"TS":
    [
     {'index':1, 'value':1},
     {'index':2, 'value':0},
     {'index':3, 'value':1},
    ]
}
person kipstar    schedule 12.08.2019