Skip to content

Instantly share code, notes, and snippets.

@wholmgren
Last active April 18, 2017 08:03
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save wholmgren/3fabacd3003c2a549b420b5e79f55e95 to your computer and use it in GitHub Desktop.
Save wholmgren/3fabacd3003c2a549b420b5e79f55e95 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# ModelChain refactor\n",
"\n",
"This notebook explains a proposal to refactor ModelChain.\n",
"\n",
"Will Holmgren (@wholmgren), University of Arizona, June, 2016."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Introduction\n",
"\n",
"The ModelChain object was first implemented in pvlib version 0.3. See pvlib-python/issues#17 and pvlib-python/issues#93 for the discussion surrounding the initial implementation.\n",
"\n",
"The pvlib 0.3 ModelChain only supports the SAPM. I proposed refactoring ModelChain into a base class, a SAPM class, and a SingleDiode class in https://github.com/pvlib/pvlib-python/pull/179. This likely is a bad idea. It severely limits the flexibility of future ModelChains by promoting a single model choice, the DC power model, to the level of a class choice. It is also likely to make user code unnecessarily complicated.\n",
"\n",
"Here, I propose a new way to refactor ModelChain that may be more flexible, more powerful, and easier to use.\n",
"\n",
"The code currently lives at https://github.com/wholmgren/pvlib-python/tree/mcrefactor"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setup"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import pandas as pd\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import datetime\n",
"\n",
"import seaborn as sns\n",
"\n",
"from importlib import reload\n",
"\n",
"import pvlib\n",
"from pvlib import pvsystem\n",
"from pvlib.pvsystem import PVSystem\n",
"from pvlib.location import Location\n",
"from pvlib.modelchain import ModelChain"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# some functions that make it convenient to get sam data\n",
"sam_data = {}\n",
"\n",
"def retrieve_sam_network():\n",
" sam_data['cecmod'] = pvsystem.retrieve_sam('cecmod')\n",
" sam_data['sandiamod'] = pvsystem.retrieve_sam('sandiamod')\n",
" sam_data['cecinverter'] = pvsystem.retrieve_sam('cecinverter')\n",
" \n",
" \n",
"def get_sapm_module_parameters():\n",
" # limit network usage\n",
" try:\n",
" modules = sam_data['sandiamod']\n",
" except KeyError:\n",
" retrieve_sam_network()\n",
" modules = sam_data['sandiamod']\n",
"\n",
" module = 'Canadian_Solar_CS5P_220M___2009_'\n",
" module_parameters = modules[module].copy()\n",
"\n",
" return module_parameters\n",
"\n",
"\n",
"def get_cec_module_parameters():\n",
" # limit network usage\n",
" try:\n",
" modules = sam_data['cecmod']\n",
" except KeyError:\n",
" retrieve_sam_network()\n",
" modules = sam_data['cecmod']\n",
"\n",
" module = 'Canadian_Solar_CS5P_220M'\n",
" module_parameters = modules[module].copy()\n",
" module_parameters['b'] = 0.05\n",
" module_parameters['EgRef'] = 1.121\n",
" module_parameters['dEgdT'] = -0.0002677\n",
"\n",
" return module_parameters\n",
"\n",
"\n",
"def get_cec_inverter_parameters():\n",
"\n",
" inverters = sam_data['cecinverter']\n",
" inverter = 'ABB__MICRO_0_25_I_OUTD_US_208_208V__CEC_2014_'\n",
" inverter_parameters = inverters[inverter].copy()\n",
"\n",
" return inverter_parameters"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## ModelChain"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Make the standard PVSystem and Location objects."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"system = PVSystem(module_parameters=get_sapm_module_parameters(),\n",
" inverter_parameters=get_cec_inverter_parameters())\n",
"\n",
"location = Location(32.2, -111, altitude=700)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Make a ModelChain object and run a model just as in pvlib=0.3"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1114d67b8>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1114c9d30>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"mc = ModelChain(system, location)\n",
"times = pd.date_range(start='20160101 0000-0700', end='20160104 0000-0700', freq='5min')\n",
"mc.run_model(times)\n",
"mc.ac.plot(title=mc.dc_model.__name__)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The simple API still works, but there's a lot more going on under the hood.\n",
"\n",
"ModelChain has new ``dc_model`` and ``ac_model`` keyword arguments and methods to support the the DeSoto/singlediode combination as well as future additions such as the adrinverter and PVWatts models. The ModelChain will attempt to infer the correct dc and ac model from the module and inverter parameters."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# calls ModelChain.infer_dc_model and ModelChain.infer_ac_model\n",
"mc = ModelChain(system, location, dc_model=None, ac_model=None)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The inference methods use set logic to assign one of the model-specific methods, such as ``ModelChain.sapm`` or ``ModelChain.snlinverter``, to the universal method names ``ModelChain.dc_model`` and ``ModelChain.ac_model``. Out of laziness, I did not include all of the parameters in the set check -- it's probably fine the way it is."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"In file: /Users/holmgren/git_repos/pvlib-python/pvlib/modelchain.py\n",
"\n",
" def infer_dc_model(self):\n",
" params = set(self.system.module_parameters.keys())\n",
" if set(['A0', 'A1', 'C7']) <= params:\n",
" return self.sapm\n",
" elif set(['a_ref', 'I_L_ref', 'I_o_ref', 'R_sh_ref', 'R_s']) <= params:\n",
" return self.singlediode\n",
" elif set(['temp_co']) <= params:\n",
" return self.pvwatts_dc\n",
" else:\n",
" raise ValueError('could not infer DC model from system.module_parameters')\n",
"\n"
]
}
],
"source": [
"np.source(mc.infer_dc_model)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<function pvlib.modelchain.ModelChain.sapm>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mc.dc_model.__func__"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"In file: /Users/holmgren/git_repos/pvlib-python/pvlib/modelchain.py\n",
"\n",
" def infer_ac_model(self):\n",
" params = set(self.system.inverter_parameters.keys())\n",
" if set(['C0', 'C1', 'C2']) <= params:\n",
" return self.snlinverter\n",
" else:\n",
" raise ValueError('could not infer AC model from system.inverter_parameters')\n",
"\n"
]
}
],
"source": [
"np.source(mc.infer_ac_model)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<function pvlib.modelchain.ModelChain.snlinverter>"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mc.ac_model.__func__"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can also specify the strings ``'sapm'``, ``'singlediode'``, and ``'pvwatts'`` (not yet implemented). This might be useful if you want to be very explicit about what you're doing. It could also be useful if you have a single ``module_parameters`` dictionary that contains parameters for multiple models."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"system = PVSystem(module_parameters=get_sapm_module_parameters(),\n",
" inverter_parameters=get_cec_inverter_parameters())\n",
"\n",
"mc = ModelChain(system, location, dc_model='singlediode', ac_model='snlinverter')"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<function pvlib.modelchain.ModelChain.singlediode>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mc.dc_model.__func__"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Note that the ``dc_model`` function was assigned to the ``singlediode`` function despite the fact that the ``system.module_parameters`` contains SAPM data. Of course, you're going to run into problems if your parameters and model are not compatible."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Next, we demonstrate that the ``ModelChain`` will automatically support CEC module parameters."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1083697b8>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10834ce48>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"system = PVSystem(module_parameters=get_cec_module_parameters(),\n",
" inverter_parameters=get_cec_inverter_parameters())\n",
"\n",
"mc = ModelChain(system, location)\n",
"times = pd.date_range(start='20160101 0000-0700', end='20160104 0000-0700', freq='5min')\n",
"mc.run_model(times)\n",
"mc.ac.plot(title=mc.dc_model.__name__)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now let's dig into the model-specific methods."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"In file: /Users/holmgren/git_repos/pvlib-python/pvlib/modelchain.py\n",
"\n",
" def sapm(self):\n",
" self.temps = self.system.sapm_celltemp(self.total_irrad['poa_global'],\n",
" self.weather['wind_speed'],\n",
" self.weather['temp_air'])\n",
" \n",
" self.dc = self.system.sapm(self.total_irrad['poa_direct'],\n",
" self.total_irrad['poa_diffuse'],\n",
" self.temps['temp_cell'],\n",
" self.airmass['airmass_absolute'],\n",
" self.aoi)\n",
" \n",
" self.dc = self.system.scale_voltage_current_power(self.dc)\n",
" \n",
" return self\n",
"\n"
]
}
],
"source": [
"np.source(mc.sapm)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"In file: /Users/holmgren/git_repos/pvlib-python/pvlib/modelchain.py\n",
"\n",
" def singlediode(self):\n",
" # not sure about the aoi modifiers\n",
" self.aoi_mod = self.system.ashraeiam(self.aoi).fillna(0)\n",
" self.total_irrad['poa_global_aoi'] = (\n",
" self.total_irrad['poa_direct'] * self.aoi_mod +\n",
" self.total_irrad['poa_diffuse'])\n",
"\n",
" self.temps = self.system.sapm_celltemp(\n",
" self.total_irrad['poa_global_aoi'],\n",
" self.weather['wind_speed'],\n",
" self.weather['temp_air'])\n",
"\n",
" (photocurrent, saturation_current, resistance_series,\n",
" resistance_shunt, nNsVth) = (\n",
" self.system.calcparams_desoto(self.total_irrad['poa_global_aoi'],\n",
" self.temps['temp_cell']))\n",
"\n",
" self.desoto = (photocurrent, saturation_current, resistance_series,\n",
" resistance_shunt, nNsVth)\n",
"\n",
" self.dc = self.system.singlediode(\n",
" photocurrent, saturation_current, resistance_series,\n",
" resistance_shunt, nNsVth)\n",
" \n",
" self.dc = self.system.scale_voltage_current_power(self.dc)\n",
" \n",
" return self\n",
"\n"
]
}
],
"source": [
"np.source(mc.singlediode)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The these methods take no arguments and rely wholly on the state of the object. There are some things, such as the temperature calculations, that should be refactored into their own methods that would follow similar patterns. In fact, the current proposal adds ``aoi_model`` and ``temp_model`` keyword arguments to the ModelChain constructor.\n",
"\n",
"This makes the ``ModelChain.run_model`` method trivial to implement."
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"In file: /Users/holmgren/git_repos/pvlib-python/pvlib/modelchain.py\n",
"\n",
" def run_model(self, times, irradiance=None, weather=None):\n",
" \"\"\"\n",
" Run the model.\n",
"\n",
" Parameters\n",
" ----------\n",
" times : DatetimeIndex\n",
" Times at which to evaluate the model.\n",
"\n",
" irradiance : None or DataFrame\n",
" If None, calculates clear sky data.\n",
" Columns must be 'dni', 'ghi', 'dhi'.\n",
"\n",
" weather : None or DataFrame\n",
" If None, assumes air temperature is 20 C and\n",
" wind speed is 0 m/s.\n",
" Columns must be 'wind_speed', 'temp_air'.\n",
"\n",
" Returns\n",
" -------\n",
" self\n",
"\n",
" Assigns attributes: times, solar_position, airmass, irradiance,\n",
" total_irrad, weather, temps, aoi, dc, ac\n",
" \"\"\"\n",
" self.prepare_inputs(times, irradiance, weather)\n",
"\n",
" self.dc_model()\n",
"\n",
" self.ac_model()\n",
"\n",
" return self\n",
"\n"
]
}
],
"source": [
"np.source(mc.run_model)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Also note that the model chain methods return ``self``, allowing for method chaining."
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x10ed60320>"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\nwV827ZZPKAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x10827d208>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"mc = ModelChain(system, location)\n",
"mc.prepare_inputs(times).dc_model().ac_model()\n",
"mc.ac.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can also write your own functions and pass them as arguments to ModelChain. The first argument of your function must be a ModelChain instance. The functions below implement the PVUSA model and a wrapper function appropriate for use with ModelChain. This follows the pattern of implementing the core models using the simplest possible functions, and then implementing wrappers to make them easier to use in specific applications. Of course, you could implement it in a single function if you wanted to."
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def pvusa(poa_global, wind_speed, temp_air, a, b, c, d):\n",
" \"\"\"\n",
" Calculates system power according to the PVUSA equation\n",
" \n",
" P = I * (a + b*I + c*W + d*T)\n",
" \n",
" where\n",
" P is the output power,\n",
" I is the plane of array irradiance,\n",
" W is the wind speed, and\n",
" T is the temperature\n",
" a, b, c, d are empirically derived parameters.\n",
" \"\"\"\n",
" return poa_global * (a + b*poa_global + c*wind_speed + d*temp_air)\n",
"\n",
"\n",
"def pvusa_mc_wrapper(mc):\n",
" # calculate the dc power and assign it to mc.dc\n",
" mc.dc = pvusa(mc.total_irrad['poa_global'], mc.weather['wind_speed'], mc.weather['temp_air'],\n",
" mc.system.module_parameters['a'], mc.system.module_parameters['b'],\n",
" mc.system.module_parameters['c'], mc.system.module_parameters['d'])\n",
" \n",
" # returning mc is optional, but enables method chaining\n",
" return mc\n",
"\n",
"\n",
"def pvusa_ac_mc_wrapper(mc):\n",
" # keep it simple\n",
" mc.ac = mc.dc\n",
" return mc"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x10ed70ba8>"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x108378588>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"module_parameters = {'a': 3, 'b': 0.001, 'c': 1, 'd': -0.05}\n",
"system = PVSystem(module_parameters=module_parameters)\n",
"\n",
"mc = ModelChain(system, location, dc_model=pvusa_mc_wrapper, ac_model=pvusa_ac_mc_wrapper)\n",
"times = pd.date_range(start='20160101 0000-0700', end='20160104 0000-0700', freq='5min')\n",
"mc.run_model(times)\n",
"mc.ac.plot(title='pvusa')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"A ModelChain object uses Python's ``functools.partial`` function to assign itself as the argument to the user-supplied functions."
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"functools.partial(<function pvusa_mc_wrapper at 0x10ed6a620>, ModelChain for: PVSystem with tilt:32.2 and azimuth: 180 with Module: None and Inverter: None orientation_startegy: south_at_latitude_tilt clearsky_model: ineichen transposition_model: haydavies solar_position_method: nrel_numpy airmass_model: kastenyoung1989)"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"mc.dc_model"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.5.1"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment