NREL / gdx-pandas

Python interface to read and write GAMS GDX files using pandas.DataFrames as the intermediate data format.
BSD 3-Clause "New" or "Revised" License
43 stars 15 forks source link

It is possible to update one parameter in an existing gdx file? #57

Open amabdallah opened 5 years ago

amabdallah commented 5 years ago

@elainethale as far as I've seen, the gdxpds seems to write parameters into a new file. Is it possible to add new or overwrite a parameter in an existing file?

For example, how can I add my_set2 and my_parameter2 to the exisitng file that has my_set1 and my_parameter1?

import gdxpds

out_file = 'my_new_gdx_data.gdx'
with gdxpds.gdx.GdxFile() as gdx:
    # Create a new set with one dimension
    gdx.append(gdxpds.gdx.GdxSymbol('my_set2',gdxpds.gdx.GamsDataType.Set,dims=['u']))
    data = pd.DataFrame([['u' + str(i)] for i in range(1,11)])
    data['Value'] = True
    gdx[-1].dataframe = data
    # Create a new parameter with one dimension
    gdx.append(gdxpds.gdx.GdxSymbol('my_parameter2',gdxpds.gdx.GamsDataType.Parameter,dims=['u']))
    data = pd.DataFrame([['u' + str(i), i*100] for i in range(1,11)],
                         columns=(gdx[-1].dims + gdx[-1].value_col_names))
    gdx[-1].dataframe = data
    gdx.write(out_file)
jebob commented 5 years ago

I don't think this is possible, GAMS itself doesn't offer such an option so it probably doesn't exist yet.

amabdallah commented 5 years ago

Thanks @jebob for sharing your thoughts. That's very interesting that its not supported yet. A simple use case is that a user wants to update one parameter in GDX and rerun the model. Anyways, its good to keep it in mind in case it becomes supported one day.

elainethale commented 5 years ago

You can write some quick wrapper code to accomplish this. Just load the current file, make your change, write to a temporary file, delete the original file, and then resave the temporary file to the original location and delete the temporary.

amabdallah commented 5 years ago

Thanks, @elainethale for the suggestion :)