-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Add scale_voltage_current_power to ModelChain.pvwatts_dc #1138
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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 10
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The pvwatts
methods don't produce voltage or current.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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 10
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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 <[email protected]>
Co-authored-by: Will Holmgren <[email protected]>
failures are still surfrad io. Thanks @cwhanse! |
docs/sphinx/source/api.rst
for API changes.docs/sphinx/source/whatsnew
for 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.