Add scale_voltage_current_power to ModelChain.pvwatts_dc#1138
Add scale_voltage_current_power to ModelChain.pvwatts_dc#1138wholmgren merged 10 commits intopvlib:masterfrom
Conversation
|
@wholmgren I should have looked at the base level function. |
|
I had the same oversight despite the fact that "voltage" and "current" are in the name. I'd prefer a new function over changing the existing function. Maybe this is a little lazy and inconsistent, but I'd also be ok with skipping the function layer and only implementing the |
…s, and accept Series
|
I got impatient and tried the first option (make existing function more general). One drawback of the existing function is that it requires all keys including 'i_x' and 'i_xx' which are produced by the singlediode function probably to be consistent with the output of the sapm. |
|
@wholmgren see what you think before I undo or fix what is broken. I think we can keep the same signature of |
|
You've managed to make the name and signature make sense, but using the seldom-used Another option to consider:
|
|
If |
pvlib/pvsystem.py
Outdated
| currents = ['i_mp', 'i_x', 'i_xx', 'i_sc'] | ||
| voltages = voltage_keys and data.columns | ||
| currents = current_keys and data.columns | ||
| powers = power_keys and data.columns |
There was a problem hiding this comment.
I was thinking of something like this:
In [28]: voltage = 5
In [29]: current = 10
In [30]: df = pd.DataFrame([[1, 1, 1]], columns=['p_mp', 'v_mp', 'i_mp'])
In [31]: df
Out[31]:
p_mp v_mp i_mp
0 1 1 1
In [32]: voltage_keys = ['v_mp', 'v_oc']
...: current_keys = ['i_mp', 'i_x', 'i_xx', 'i_sc']
...: power_keys = ['p_mp']
In [33]: df.filter(voltage_keys, axis=1) * voltage
Out[33]:
v_mp
0 5
In [34]: df.filter(current_keys, axis=1) * current
Out[34]:
i_mp
0 10There was a problem hiding this comment.
In [35]: voltage_df = df.filter(voltage_keys, axis=1) * voltage
In [36]: current_df = df.filter(current_keys, axis=1) * current
In [37]: df = pd.concat([voltage_df, current_df], axis=1)
In [38]: df['p_mp'] = df['v_mp'] * df['i_mp']
In [39]: df
Out[39]:
v_mp i_mp p_mp
0 5 10 50
There was a problem hiding this comment.
I don't know how to scale a power other than p_mp without hugely complicating the code. I also don't know that there's a need for it at this time.
There was a problem hiding this comment.
The pvwatts methods don't produce voltage or current.
There was a problem hiding this comment.
I was still in the mindset that we could provide a DataFrame with p_mp=pdc, v_mp=pdc, and i_mp=1 as I suggested above. But yes it is better to just multiply the power keys by the voltage and current scale factors.
In [42]: df = pd.DataFrame([[1, 1, 1]], columns=['p_mp', 'v_mp', 'i_mp'])
In [43]: voltage_df = df.filter(voltage_keys, axis=1) * voltage
In [44]: current_df = df.filter(current_keys, axis=1) * current
In [45]: power_df = df.filter(power_keys, axis=1) * voltage * current
In [49]: concat_df = pd.concat([voltage_df, current_df, power_df], axis=1)
In [50]: concat_df = concat_df[df.columns]
In [51]: concat_df
Out[51]:
p_mp v_mp i_mp
0 50 5 10There was a problem hiding this comment.
One issue with the temporary DataFrame: when converting back to Series, the column label 'p_mp' is assigned to the Series name, which affects testing but likely no user code. Any concern here?
There was a problem hiding this comment.
no concern. pandas assert_series_equal only recently started checking that attribute and it was a fair bit of work to fix all of the newly broken tests in the Arbiter.
|
Test failure is unrelated, timeout when fetching SURFRAD data. |
Co-authored-by: Will Holmgren <william.holmgren@gmail.com>
Co-authored-by: Will Holmgren <william.holmgren@gmail.com>
|
failures are still surfrad io. Thanks @cwhanse! |
docs/sphinx/source/api.rstfor API changes.docs/sphinx/source/whatsnewfor all changes. Includes link to the GitHub Issue with:issue:`num`or this Pull Request with:pull:`num`. Includes contributor name and/or GitHub username (link with:ghuser:`user`).Adds scaling by modules per string and strings per inverter to the ModelChain.pvwatts_dc method. This behavior parallels ModelChain.sapm and ModelChain.singlediode. User code is not likely to be affected since PVSystem.modules_per_strings and PVSystem.strings_per_inverter both default to 1.