Dataset Open Access

Shaping photovoltaic array output to align with changing wholesale electricity price profiles

Brown, Patrick R.; O'Sullivan, Francis M.

This repository includes python scripts and input/output data associated with the following publication:

[1] Brown, P.R.; O'Sullivan, F. "Shaping photovoltaic array output to align with changing wholesale electricity price profiles." Applied Energy 2019.

Please cite reference [1] for full documentation if the contents of this repository are used for subsequent work.

Some of the scripts and data are also used in the following working paper:

[2] Brown, P.R.; O'Sullivan, F. "Spatial and temporal variation in the value of solar power across United States electricity markets". Working Paper, MIT Center for Energy and Environmental Policy Research. 2019.

All code is in python 3 and relies on a number of dependencies that can be installed using pip or conda.


  • : Python module with functions for modeling PV generation, calculating PV revenues and capacity factors, and optimizing PV orientation.
  • : Jupyter notebooks, including:
    • pvvm-pvtos-data.ipynb: Example scripts used to download and clean input LMP data, determine LMP node locations, and reproduce some figures in reference [1]
    • pvvm-pvtos-analysis.ipynb: Example scripts used to perform the calculations and reproduce some figures in reference [1]
    • pvvm-pvtos-plots.ipynb: Scripts used to produce additional figures in reference [1]
    • pvvm-example-generation.ipynb: Example scripts demonstrating the usage of the PV generation model and orientation optimization
  • : Static images of the above Jupyter notebooks for viewing without a python kernel
  • : Day-ahead and real-time nodal locational marginal prices (LMPs) for CAISO, ERCOT, MISO, NYISO, and ISONE.
    • At the time of publication of this repository, permission had not been received from PJM to republish their LMP data. If permission is received in the future, a new version of this repository will linked here with the complete dataset.
  • : Simulation results associated with reference [1] above, including modeled revenue, capacity factor, and optimized orientations for PV systems at all LMP nodes

Data terms and usage notes

Code license and usage notes

  • Code (*.py and *.ipynb files) is provided under the MIT License, as specified in the pvvm/LICENSE file.
  • Updates to the code, if any, will be posted in the non-static repository at  The code in the present repository has the following version-specific dependencies:
    • matplotlib: 3.0.3
    • numpy: 1.16.2
    • pandas: 0.24.2
    • pvlib: 0.6.1
    • scipy: 1.2.1
    • tqdm: 4.31.1
  • To use the NSRDB download functions, modify the "" file to insert a valid NSRDB API key, which can be requested from Locations can be specified by passing latitude, longitude floats to, or by passing a string googlemaps query to To use the googlemaps functionality, request a googlemaps API key ( and insert it in the "" file.
  • Note that many of the ISO websites have changed in the time since the functions in the module were written and the LMP data used in the above papers were downloaded. As such, the function no longer works for all ISOs and years. We provide this function to illustrate the general procedure used, and do not intend to maintain it or keep it up to date with the changing ISO websites. For up-to-date functions for accessing ISO data, the following repository (no connection to the present work) may be helpful:

Files (7.8 GB)
Name Size
7.7 GB Download
14.1 MB Download
14.1 MB Download
135.9 kB Download
109.4 MB Download
All versions This version
Views 388388
Downloads 7272
Data volume 216.6 GB216.6 GB
Unique views 333333
Unique downloads 4242


Cite as