You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Data structure(s) for PV measurement datasets such as I-V curves #469
I'm looking for input on using/creating a "standard" data structure to store PV measurement datasets, such as I-V curves supporting IEC 61853-1. I'm thinking of something flexible/extensible and self-documenting (esp. w.r.t. units). This space also seems to intersect with time-series of I-V curves and maybe PECOS workflows.
For example, I have a collection of I-V-F-T curves, each with possibly varying numbers of points, that are each taken at a "nominal" matrix of effective irradiance F = 0.1, 0.2, 0.4, 0.6, 0.8, 1.0, 1.1 (unitless) and temperature T = 15, 25, 50 degC. Sticking to just python and numpy (pandas doesn't seem like the right fit here), I came up with this dict-based structure:
In this case, I could retrieve the currents vector for a particular curve using data[('0.2', '15 degC')]['i_A']. I also need to concatenate (in a consistent order) all the currents, voltages, etc. from all the curves together. One could also imagine repeated I-V-F-T curve measurements at each nominal setting (with possibly a different number of points in each repetition).
The ordered-pair keys can also be sorted in various ways using sorted(), as long as the chosen strings don't cause ordering problems. Note that replacing the keys with timestamps would produce time-series I-V-F-T curve data.
@thunderfish24 I support this effort. FYI - we're planning a more formal taxonomy development as part of Orange Button that has these data within it's scope, but that's a year out. Some thoughts about python structure:
instead of 2 numpy.arrays, what about an array of tuples (v_V, I_A)? The voltage and current come in pairs. It may be awkward to work with them as tuple type, though.
the use of values in the keys (e..g, ('0.1', '15 decC')) seems awkward - what if the effective irradiance isn't exactly 0.1? Also, the effective irradiance value is also in the dict. What about an ordinal index for the primary key, and a dict for a single curve with metadata as single fields and the IV curve in a dict, like `{'Ee' : value, 'Tc' : value, 'IVdata' : {'v_V' : array, 'I_A' : array, etc.} }
I'm now inclined that a class definition would be great here, because I can foresee that we'll want a number of convenience methods to access and manipulate the data in the set of IV curves. E.g., IVCurve.get_Ee_values would return a list of the nominal effective irradiances for a set of IV curves.
Notation - I think you are alone in using 'F' for effective irradiance. While I certain you have your reasons, I most often see 'E' for this quantity, and 'G' for broadband.
Xarrays might work, but would suggest a simple 2D table (in Pandas) with columns such as:
row id
curve id
test id
timestamp
nominal temperature
nominal irradiance
measured voltage
measured current
measured irradiance
measured temperature
more stuff
You can then use query to extract subsets and/or reindex/pivot/unstack to rearrange the data for analysis. I tend to see units as meta data.
(The suggestion above is for internal python storage/data structures to facilitate analysis, which the question seems to be focusing on. External/file storage options would ideally not be python-specific.)
netCDF might be a good option here. This may be complicated enough and have enough different use cases that it's worth adopting a standard, well-supported framework instead of developing our own.
In some of our research projects, trying to apply our half-baked data models to the netCDF format revealed gaps in how we were thinking about the problem.
You could wrap up the netCDF data with a custom class, if desired.
After looking a bit further, I would say that NetCDF has the most potential and the best "alignment" to this particular dataset that I have in mind. (pandas' Dataframe still seems less well aligned to me, but it's probably doable.) With netCDF, the data formatting and storage would be more standardized than what I suggested, and I agree that units are best kept in the metadata and out of the data's indexes. It seems that the standardization part with netCDF involves coming up with "conventions", analogous to the CF conventions and its units, that cover the various PV performance measurement/monitoring cases. (Perhaps one aligns the conventions with the eventual Orange Button taxonomy?) The devil might be in the details, though, so I am going to report back after I try to actually implement netCDF for my particular data at hand.
Regarding some of @cwhanse 's more specific comments:
I would have to play around with the tuple indexing. I'm hoping that netCDF will allow better "simultaneous slicing" of all four components from a single I-V-F-T curve.
The values used in the keys are the "nominal" F and T values for identifying a particular curve. The actual values (that may vary) during the I-V curve measurement are in the data vectors. This particular case is of "uncorrected" I-V curves taken in a measurement lab with a solar simulator that "flickers" and possible heating of the device during the I-V measurement. I suppose outdoor data would usually just have a single F and T for each curve, or possibly two values from pre- and post-curve sweep. I suppose that ideally one might like to have accurate timestamps on all the points, which I think would allow one to cover all these different setups more generally in the data structure. The calibration labs I know of don't record such timestamps :(. Indeed they usually don't actually record separate temperatures at each point in the sweep, which may be justified for fast sweeps where the 3 sig-fig temperature gauge doesn't respond quickly enough.
I agree that a wrapper class looks like an eventuality. However, we should strive to make the data structure as easy to query as possible "in the raw", which I see as a particular strength of pandas.
I think I switched to F because NREL used E for spectral irradiance, and, more importantly, my particular "effective irradiance" is defined as a ratio of short-circuit currents, F = Isc/Isc0, where Isc is at prevailing POA spectral+total irradiance and junction temperature and Isc0 is at reference conditions. This is also the value reported by a reference monitoring device via F = Isc/Isc0 = M*Isc,r/Isc0,r, where the spectral correction factor M changes with the temperature of both devices and there is a linearity assumption w.r.t. current vs. total irradiance (and, of course, a homogeneity assumption). This differs a bit from some of the other "flavors" of effective irradiance.
Actually this nomenclature is not suitable because of the Greek letters, subscripts and commas. The newer version of this standard (2017) is no better, nor is the variable list on the PVPMC website.
@adriesse I had forgotten about that list at https://pvpmc.sandia.gov/resources-and-events/variable-list/ We compiled that list consistent with the notation on https://pvpmc.sandia.gov and the PVLib for MATLAB toolbox. But it's consistent with notation generally in PV-related literature, e.g., alpha for temperature coefficient for current. Do you see the spelled-out greek letters as an issue for column naming?
Not a fundamental issue. But there aren't that many of them and they get reused a lot. Typesetting and programming have different needs and constraints for notation.
We also keep this related list in our own documentation: http://pvlib-python.readthedocs.io/en/latest/variables_style_rules.html I'd like to see more names fully spelled out, and fewer abbreviations and spelled-out greek letters. I'd vote for that in column/variable naming conventions for a data structure as well.
my personal recommendation would be to use HDF5 and h5py but netCDF is also good. AFAICT, XArray is an in-memory data structure, not a serialized format, but they recommend storing XArray as netCDF. Another in-memory data structure is Apache Arrow which serializes as Feather. There are probably many more, and many deciding factors that could influence your choice: maturity, performance, etc.
as far as notation I'm in favor of syncing the PVPMC and PVLib notation as much as possible and using verbose names, ie: spell them out, as @wholmgren seems to indicate, but syncing later with OrangeButton and other constituents (CF, Unidata, etc.) will still be an oustanding issue. My advice is to document as much as possible, maybe start with that first, and make the documentation public.
one thing to note about heirarchical formats is that they are optimized to be sliced along certain dimensions, and will slow down in other directions so understanding how you want to use your data will instruct how you store it.
instead of 2 numpy.arrays, what about an array of tuples (v_V, I_A)? The voltage and current come in pairs. It may be awkward to work with them as tuple type, though.
I'm not endorsing this, just making sure you all are aware of it. But note how you can make the cell current and voltage fields 1x100 since we know we'll set ivcurve_pnts to 100, we know this size. Also we are not likely to ever need to slice across this set of values, so it's okay that they are lumped in a field. Finally, you could just as easily make this entire array M by N dimensions, where, M is the number of temperatures (T), and N is the number of irradiances (E). Then to get the I-V curves for a particular (E, T) combination, just use my_data[m, n] where m is the index of the desired T, and n is the index of the desired E. Then you can do NumPy "fancy" indexing to get the i-v curve of at (E, T)
your_data=np.copy(my_data)
# reshape my_data and your_data from (2,) to (1, 2), and concatentate# you could also use np.atleast_2d or np.tile probably, ...# lots of options here, not sure best ...all_data=np.concatenate([my_data.reshape(1,2), your_data.reshape(1,2)], axis=0)
all_data.shape# (2, 2)# now "fancy" indexing to get i-v curve at (E, T)all_data[1, 1][['i', 'v']]
([[5.09950248e+00, 5.09674358e+00, 5.09398468e+00, 5.09122577e+00, 5.08846685e+00, ...]],
[[ 0. , 0.339375 , 0.67875 , 1.01812499, 1.35749999, ...]])
You could easily plot families of curves this same way.
I like this format better than making individual (i, v) pairs because as I said before, you would never need to use the data that way, so adding that extra dimension, would add a lot of unnecessary indices, blow up the size of your record and make retrieval that much slower. IMO even better would be to keep all of the currents and voltages for a single (E, T) pair in one field, just call it ('i-v', float, (2, 100)) for i-v curves that are always 100 points long, then just document somewhere which is in the 0th index and which is in the 1st index. Or keep i and v separate like I did in my example, but IMO don't break up each (i, v) pair.
also you can index into a dictionary using tuples, since they are immutable and therefore hashable, you can use any hashable index for a dictionary
@adriesse It turns out pandas' multi-indexing dataframe is a "natural" solution (at least for my way of thinking) as well as mapping 1-1 to the underlying spreadsheet template that we are using for data collection. Below is an example with a matrix of fake I-V-F-H curves, each with 10 points. In the case with curves with differing numbers of points, some "trailing" missing values would be NaN and they would need to be accommodated, which could lead to significant wasted memory in some datasets. This also doesn't address the question of how to best store the dataframe.
I sometimes do that, but other times I just do a query to get the subset I want, which I find more straightforward than the multi-index syntax, but is probably less efficient.
IMO don't split up iv curves, more efficient to slice along useful dimensions, and store grouped items together
IMO use h5py, transparent with NumPy, also has many compression formats
I should add that serializing and deserializing my example with h5py is trivial:
importnumpyasnpimportpvlibimporth5py# create some datax=pvlib.pvsystem.singlediode(6.1, 1.2e-7, 0.012, 123, 1.23*60*0.026, 100)
y=pvlib.pvsystem.singlediode(5.1, 1.2e-7, 0.012, 123, 1.23*60*0.026, 100)
# set the dtypes to use as a structured arraymy_dtype=np.dtype([
('i_l', float), ('i_0', float), ('r_s', float), ('r_sh', float), ('nNsVth', float),
('i_sc', float), ('v_oc', float), ('i_mp', float), ('v_mp', float),
('i', float, (1,100)), ('v', float, (1, 100))
])
# store the data in structured array, note that the IV curve is a nestedmy_data=np.array([
(6.1, 1.2e-7, 0.012, 123, 1.23*60*0.026,
x['i_sc'], x['v_oc'], x['i_mp'], x['v_mp'], x['i'], x['v']),
(5.1, 1.2e-7, 0.012, 123, 1.23*60*0.026,
y['i_sc'], y['v_oc'], y['i_mp'], y['v_mp'], y['i'], y['v'])
], my_dtype)
# pretend that this is a grid of IV curves for matrix of (E, T)your_data=np.copy(my_data)
# reshape my_data and your_data from (2,) to (1, 2),# and concatentate to make fake gridall_data=np.concatenate([my_data.reshape(1,2), your_data.reshape(1,2)], axis=0)
# output to a filewithh5py.File('THIS_IS_A_TEST_FILE.H5', 'w') asf:
f['data'] =all_data# key "data" is arbitrary, choose as many groups as you need
quit python and restart
importh5pyimportnumpyasnp# retrieve the data from filewithh5py.File('THIS_IS_A_TEST_FILE.H5', 'r') asf:
all_data=np.array(f['data'])
# do some fancy indexing:all_data[1,1][['i', 'v']]
# ([[5.09950248e+00, 5.09674358e+00, ..., 1.41340468e+00, 7.65749212e-01, 7.99360578e-15]],# [[ 0. , 0.339375 , 0.67875 , ..., 32.91937481, 33.2587498 , 33.5981248 ]])
At the moment, the discussion is relevant to the demonstration data for #229 and possibly to whatever we do with #511. I'm OK closing this as an issue, and taking up the discussion when we have a specific implementation to review. I'd rather see a pull request targeting iotools for reading/writing IV curve data for use in pvlib.
@mikofski You have convinced me to take a closer look at numpy's structured/record array :). The alternative that I choose (pandas vs. numpy) will mostly rely on which "feels" more lightweight and natural in terms of things like complex slicing, concatenation, dealing with I-V curves of different lengths, and handling repeated measurements. Oh, did I mention that I also have normal-incidence QE's at three temperatures for this dataset too?
I don't see any big issues saving either alternative to HDF5, but I do need to further investigate the storage of meta-data such as channel units as well as settle upon the names (and maybe a standards effort would ultimately prefer netCDF with PV-specific "conventions"). Finally, do you know if it makes sense to transfer the HDF5 over the wire for a REST API, or would you anticipate a server-side JSON conversion?
@adriesse Pandas' pivoting is impressive and thanks for bringing that tool to my attention. I'm hoping that the "raw" data structure can be organized (at least for the IEC 61853-1 use case) such that it could be readily "understood" by a human who loads it out of storage and displays the data object for the first time, and it seems like the multi-index setup accomplishes that well.
@wholmgren I will close this issue now, but @cwhanse please reference this use case as the Green Button initiative gets underway.
Activity
cwhanse commentedon May 31, 2018
@thunderfish24 I support this effort. FYI - we're planning a more formal taxonomy development as part of Orange Button that has these data within it's scope, but that's a year out. Some thoughts about python structure:
instead of 2 numpy.arrays, what about an array of tuples (v_V, I_A)? The voltage and current come in pairs. It may be awkward to work with them as tuple type, though.
the use of values in the keys (e..g,
('0.1', '15 decC')) seems awkward - what if the effective irradiance isn't exactly 0.1? Also, the effective irradiance value is also in the dict. What about an ordinal index for the primary key, and a dict for a single curve with metadata as single fields and the IV curve in a dict, like `{'Ee' : value, 'Tc' : value, 'IVdata' : {'v_V' : array, 'I_A' : array, etc.} }I'm now inclined that a class definition would be great here, because I can foresee that we'll want a number of convenience methods to access and manipulate the data in the set of IV curves. E.g., IVCurve.get_Ee_values would return a list of the nominal effective irradiances for a set of IV curves.
Notation - I think you are alone in using 'F' for effective irradiance. While I certain you have your reasons, I most often see 'E' for this quantity, and 'G' for broadband.
adriesse commentedon May 31, 2018
Xarrays might work, but would suggest a simple 2D table (in Pandas) with columns such as:
You can then use query to extract subsets and/or reindex/pivot/unstack to rearrange the data for analysis. I tend to see units as meta data.
(The suggestion above is for internal python storage/data structures to facilitate analysis, which the question seems to be focusing on. External/file storage options would ideally not be python-specific.)
wholmgren commentedon May 31, 2018
netCDF might be a good option here. This may be complicated enough and have enough different use cases that it's worth adopting a standard, well-supported framework instead of developing our own.
In some of our research projects, trying to apply our half-baked data models to the netCDF format revealed gaps in how we were thinking about the problem.
You could wrap up the netCDF data with a custom class, if desired.
markcampanelli commentedon Jun 1, 2018
Thanks everyone for the thoughtful responses!
After looking a bit further, I would say that NetCDF has the most potential and the best "alignment" to this particular dataset that I have in mind. (pandas' Dataframe still seems less well aligned to me, but it's probably doable.) With netCDF, the data formatting and storage would be more standardized than what I suggested, and I agree that units are best kept in the metadata and out of the data's indexes. It seems that the standardization part with netCDF involves coming up with "conventions", analogous to the CF conventions and its units, that cover the various PV performance measurement/monitoring cases. (Perhaps one aligns the conventions with the eventual Orange Button taxonomy?) The devil might be in the details, though, so I am going to report back after I try to actually implement netCDF for my particular data at hand.
Regarding some of @cwhanse 's more specific comments:
I would have to play around with the tuple indexing. I'm hoping that netCDF will allow better "simultaneous slicing" of all four components from a single I-V-F-T curve.
The values used in the keys are the "nominal" F and T values for identifying a particular curve. The actual values (that may vary) during the I-V curve measurement are in the data vectors. This particular case is of "uncorrected" I-V curves taken in a measurement lab with a solar simulator that "flickers" and possible heating of the device during the I-V measurement. I suppose outdoor data would usually just have a single F and T for each curve, or possibly two values from pre- and post-curve sweep. I suppose that ideally one might like to have accurate timestamps on all the points, which I think would allow one to cover all these different setups more generally in the data structure. The calibration labs I know of don't record such timestamps :(. Indeed they usually don't actually record separate temperatures at each point in the sweep, which may be justified for fast sweeps where the 3 sig-fig temperature gauge doesn't respond quickly enough.
I agree that a wrapper class looks like an eventuality. However, we should strive to make the data structure as easy to query as possible "in the raw", which I see as a particular strength of pandas.
I think I switched to F because NREL used E for spectral irradiance, and, more importantly, my particular "effective irradiance" is defined as a ratio of short-circuit currents, F = Isc/Isc0, where Isc is at prevailing POA spectral+total irradiance and junction temperature and Isc0 is at reference conditions. This is also the value reported by a reference monitoring device via F = Isc/Isc0 = M*Isc,r/Isc0,r, where the spectral correction factor M changes with the temperature of both devices and there is a linearity assumption w.r.t. current vs. total irradiance (and, of course, a homogeneity assumption). This differs a bit from some of the other "flavors" of effective irradiance.
wholmgren commentedon Jun 1, 2018
I forgot to mention CF conventions! Developing similar conventions for pv data in netCDF format could be a high impact project.
cwhanse commentedon Jun 1, 2018
what's a CF convention?
wholmgren commentedon Jun 1, 2018
http://cfconventions.org/faq.html#what
markcampanelli commentedon Jun 2, 2018
@mikofski Do you have any insight on how we might integrate, for example, netCDF files with
pvfree?(https://pvfree.alwaysdata.net/ is down ATM, so I couldn't look at the user interface to the existing data.)
dacoex commentedon Jun 2, 2018
Responding to: #469 (comment)
For columns please try to use the existing standards as much as possible.
See: IEC 61724.
see page 7 of
https://ia801002.us.archive.org/6/items/gov.in.is.iec.61724.1998/is.iec.61724.1998.pdf
(outdated standard, but 2017 version is +/- same)
The data format could be, as suggested, csv/pandas for simple & netcdf or hdf5 for larger datasets.
adriesse commentedon Jun 2, 2018
Actually this nomenclature is not suitable because of the Greek letters, subscripts and commas. The newer version of this standard (2017) is no better, nor is the variable list on the PVPMC website.
Or maybe I misinterpreted your suggestion?
cwhanse commentedon Jun 4, 2018
@adriesse I had forgotten about that list at https://pvpmc.sandia.gov/resources-and-events/variable-list/ We compiled that list consistent with the notation on https://pvpmc.sandia.gov and the PVLib for MATLAB toolbox. But it's consistent with notation generally in PV-related literature, e.g., alpha for temperature coefficient for current. Do you see the spelled-out greek letters as an issue for column naming?
adriesse commentedon Jun 4, 2018
Not a fundamental issue. But there aren't that many of them and they get reused a lot. Typesetting and programming have different needs and constraints for notation.
wholmgren commentedon Jun 4, 2018
We also keep this related list in our own documentation: http://pvlib-python.readthedocs.io/en/latest/variables_style_rules.html I'd like to see more names fully spelled out, and fewer abbreviations and spelled-out greek letters. I'd vote for that in column/variable naming conventions for a data structure as well.
mikofski commentedon Jun 4, 2018
mikofski commentedon Jun 4, 2018
Hi @thunderfish24 , sorry all, unfortunately some of my GitHub notifications have been going to spam☹️
sapmDetails
and
snlinvertermodelsDetails
my personal recommendation would be to use HDF5 and
h5pybut netCDF is also good. AFAICT, XArray is an in-memory data structure, not a serialized format, but they recommend storing XArray as netCDF. Another in-memory data structure is Apache Arrow which serializes as Feather. There are probably many more, and many deciding factors that could influence your choice: maturity, performance, etc.For an example of using netCDF4 with NumPy in Python see
ecmwf_macc_tools.pyin my PVSC-44 repo which is applied to AOD data downloaded from the ECMWF API with theall_ecmwf_data.pyscript, once you've registered and installed their python API client. See How to retrieve ECMWF Public Datasets. You can see how I use theAtmosphereclass in the ECMWF section of the Jupyter notebook.as far as notation I'm in favor of syncing the PVPMC and PVLib notation as much as possible and using verbose names, ie: spell them out, as @wholmgren seems to indicate, but syncing later with OrangeButton and other constituents (CF, Unidata, etc.) will still be an oustanding issue. My advice is to document as much as possible, maybe start with that first, and make the documentation public.
one thing to note about heirarchical formats is that they are optimized to be sliced along certain dimensions, and will slow down in other directions so understanding how you want to use your data will instruct how you store it.
re: @cwhanse comment
you can also use NumPy structured arrays with nested fields of arbitrary dimensions.
I'm not endorsing this, just making sure you all are aware of it. But note how you can make the cell current and voltage fields 1x100 since we know we'll set
ivcurve_pntsto 100, we know this size. Also we are not likely to ever need to slice across this set of values, so it's okay that they are lumped in a field. Finally, you could just as easily make this entire array M by N dimensions, where, M is the number of temperatures (T), and N is the number of irradiances (E). Then to get the I-V curves for a particular (E, T) combination, just usemy_data[m, n]wheremis the index of the desired T, andnis the index of the desired E. Then you can do NumPy "fancy" indexing to get the i-v curve of at (E, T)then plot
You could easily plot families of curves this same way.
I like this format better than making individual (i, v) pairs because as I said before, you would never need to use the data that way, so adding that extra dimension, would add a lot of unnecessary indices, blow up the size of your record and make retrieval that much slower. IMO even better would be to keep all of the currents and voltages for a single (E, T) pair in one field, just call it
('i-v', float, (2, 100))for i-v curves that are always 100 points long, then just document somewhere which is in the 0th index and which is in the 1st index. Or keep i and v separate like I did in my example, but IMO don't break up each (i, v) pair.also you can index into a dictionary using tuples, since they are immutable and therefore hashable, you can use any hashable index for a dictionary
markcampanelli commentedon Aug 7, 2018
@adriesse It turns out pandas' multi-indexing dataframe is a "natural" solution (at least for my way of thinking) as well as mapping 1-1 to the underlying spreadsheet template that we are using for data collection. Below is an example with a matrix of fake I-V-F-H curves, each with 10 points. In the case with curves with differing numbers of points, some "trailing" missing values would be NaN and they would need to be accommodated, which could lead to significant wasted memory in some datasets. This also doesn't address the question of how to best store the dataframe.
gives
adriesse commentedon Aug 7, 2018
As I mentioned, you can pivot 2-D data into other forms such as the one you show (see https://pandas.pydata.org/pandas-docs/stable/reshaping.html) to facilitate analysis or visualization.
I sometimes do that, but other times I just do a query to get the subset I want, which I find more straightforward than the multi-index syntax, but is probably less efficient.
mikofski commentedon Aug 7, 2018
Sorry if my previous comment too long and meandering.☹️
I should add that serializing and deserializing my example with h5py is trivial:
quit python and restart
use record arrays instead of structured:
AFAICT the only difference between structured and record arrays is the ability to use attributes for column names instead of fields.
cwhanse commentedon Aug 7, 2018
@mikofski what might change if we want to store multiple IV curves, and the
vvector has different lengths?wholmgren commentedon Aug 7, 2018
Are we still (or were we ever) discussing a pvlib enhancement? If no, let's at least close the issue if not move it elsewhere.
cwhanse commentedon Aug 7, 2018
At the moment, the discussion is relevant to the demonstration data for #229 and possibly to whatever we do with #511. I'm OK closing this as an issue, and taking up the discussion when we have a specific implementation to review. I'd rather see a pull request targeting
iotoolsfor reading/writing IV curve data for use in pvlib.markcampanelli commentedon Aug 8, 2018
@mikofski You have convinced me to take a closer look at numpy's structured/record array :). The alternative that I choose (pandas vs. numpy) will mostly rely on which "feels" more lightweight and natural in terms of things like complex slicing, concatenation, dealing with I-V curves of different lengths, and handling repeated measurements. Oh, did I mention that I also have normal-incidence QE's at three temperatures for this dataset too?
I don't see any big issues saving either alternative to HDF5, but I do need to further investigate the storage of meta-data such as channel units as well as settle upon the names (and maybe a standards effort would ultimately prefer netCDF with PV-specific "conventions"). Finally, do you know if it makes sense to transfer the HDF5 over the wire for a REST API, or would you anticipate a server-side JSON conversion?
@adriesse Pandas' pivoting is impressive and thanks for bringing that tool to my attention. I'm hoping that the "raw" data structure can be organized (at least for the IEC 61853-1 use case) such that it could be readily "understood" by a human who loads it out of storage and displays the data object for the first time, and it seems like the multi-index setup accomplishes that well.
@wholmgren I will close this issue now, but @cwhanse please reference this use case as the Green Button initiative gets underway.