Source code for bsrn.qc.k_index
"""
BSRN Level 5 checks - radiometric index tests (k-tests).
"""
import numpy as np
import pandas as pd
[docs]
def kb_kt_test(ghi, bni, bni_extra, zenith):
"""
Check if beam transmittance ($k_b$) is less than clearness index ($k_t$) [1]_.
Parameters
----------
ghi : numeric or Series
Global horizontal irradiance ($G_h$). [W/m^2]
bni : numeric or Series
Beam normal irradiance ($B_n$). [W/m^2]
bni_extra : numeric or Series
Extraterrestrial beam normal irradiance ($E_{0n}$). [W/m^2]
zenith : numeric or Series
Solar zenith angle ($Z$). [degrees]
Returns
-------
flags : Series or ndarray
Boolean flags (True = Pass). [bool]
References
----------
.. [1] Forstinger, A., et al. (2021). Expert quality control of solar
radiation ground data sets. In SWC 2021: ISES Solar World Congress.
International Solar Energy Society.
"""
mu0 = np.cos(np.radians(zenith))
kb = bni / bni_extra
kt = ghi / (bni_extra * mu0)
# Domain: GHI > 50 and kb > 0 and kt > 0
in_domain = (ghi > 50) & (kb > 0) & (kt > 0)
condition_met = kb < kt
if hasattr(in_domain, 'iloc'):
return (~in_domain) | condition_met
else:
return (not in_domain) or condition_met
[docs]
def kb_limit_test(bni, bni_extra, elevation, ghi):
"""
Check if beam transmittance ($k_b$) stays within absolute physical limits based on elevation [1]_.
Parameters
----------
bni : numeric or Series
Beam normal irradiance ($B_n$). [W/m^2]
bni_extra : numeric or Series
Extraterrestrial beam normal irradiance ($E_{0n}$). [W/m^2]
elevation : numeric
Site elevation. [m]
ghi : numeric or Series
Global horizontal irradiance ($G_h$). [W/m^2]
Returns
-------
flags : Series or ndarray
Boolean flags (True = Pass). [bool]
References
----------
.. [1] Forstinger, A., et al. (2021). Expert quality control of solar
radiation ground data sets. In SWC 2021: ISES Solar World Congress.
International Solar Energy Society.
"""
kb = bni / bni_extra
# Domain: GHI > 50 and kb > 0
in_domain = (ghi > 50) & (kb > 0)
condition_met = kb < (1100 + 0.03 * elevation) / bni_extra
if hasattr(in_domain, 'iloc'):
return (~in_domain) | condition_met
else:
return (not in_domain) or condition_met
[docs]
def kt_limit_test(ghi, bni_extra, zenith):
"""
Check if clearness index ($k_t$) is within physically possible limits [1]_.
Parameters
----------
ghi : numeric or Series
Global horizontal irradiance ($G_h$). [W/m^2]
bni_extra : numeric or Series
Extraterrestrial beam normal irradiance ($E_{0n}$). [W/m^2]
zenith : numeric or Series
Solar zenith angle ($Z$). [degrees]
Returns
-------
flags : Series or ndarray
Boolean flags (True = Pass). [bool]
References
----------
.. [1] Forstinger, A., et al. (2021). Expert quality control of solar
radiation ground data sets. In SWC 2021: ISES Solar World Congress.
International Solar Energy Society.
"""
mu0 = np.cos(np.radians(zenith))
kt = ghi / (bni_extra * mu0)
# Domain: GHI > 50 and kt > 0
in_domain = (ghi > 50) & (kt > 0)
condition_met = kt < 1.35
if hasattr(in_domain, 'iloc'):
return (~in_domain) | condition_met
else:
return (not in_domain) or condition_met