Skip to content

Commit c2a94ae

Browse files
committed
add assert_frame_equal to ineichen tests. tested on master before the refactor also
1 parent 1c66a05 commit c2a94ae

File tree

2 files changed

+82
-90
lines changed

2 files changed

+82
-90
lines changed

pvlib/clearsky.py

Lines changed: 39 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -115,9 +115,45 @@ def ineichen(time, location, linke_turbidity=None,
115115

116116

117117
if linke_turbidity is None:
118-
TL = lookup_linke_turbidity(time, location.latitude,
119-
location.longitude,
120-
interp_turbidity=interp_turbidity)
118+
# The .mat file 'LinkeTurbidities.mat' contains a single 2160 x 4320 x 12
119+
# matrix of type uint8 called 'LinkeTurbidity'. The rows represent global
120+
# latitudes from 90 to -90 degrees; the columns represent global longitudes
121+
# from -180 to 180; and the depth (third dimension) represents months of
122+
# the year from January (1) to December (12). To determine the Linke
123+
# turbidity for a position on the Earth's surface for a given month do the
124+
# following: LT = LinkeTurbidity(LatitudeIndex, LongitudeIndex, month).
125+
# Note that the numbers within the matrix are 20 * Linke Turbidity,
126+
# so divide the number from the file by 20 to get the
127+
# turbidity.
128+
129+
try:
130+
import scipy.io
131+
except ImportError:
132+
raise ImportError('The Linke turbidity lookup table requires scipy. ' +
133+
'You can still use clearsky.ineichen if you ' +
134+
'supply your own turbidities.')
135+
136+
# consider putting this code at module level
137+
this_path = os.path.dirname(os.path.abspath(__file__))
138+
logger.debug('this_path=%s', this_path)
139+
140+
mat = scipy.io.loadmat(os.path.join(this_path, 'data', 'LinkeTurbidities.mat'))
141+
linke_turbidity = mat['LinkeTurbidity']
142+
LatitudeIndex = np.round_(_linearly_scale(location.latitude,90,- 90,1,2160))
143+
LongitudeIndex = np.round_(_linearly_scale(location.longitude,- 180,180,1,4320))
144+
g = linke_turbidity[LatitudeIndex][LongitudeIndex]
145+
if interp_turbidity:
146+
logger.info('interpolating turbidity to the day')
147+
g2 = np.concatenate([[g[-1]], g, [g[0]]]) # wrap ends around
148+
days = np.linspace(-15, 380, num=14) # map day of year onto month (approximate)
149+
LT = pd.Series(np.interp(time.dayofyear, days, g2), index=time)
150+
else:
151+
logger.info('using monthly turbidity')
152+
ApplyMonth = lambda x:g[x[0]-1]
153+
LT = pd.DataFrame(time.month, index=time)
154+
LT = LT.apply(ApplyMonth, axis=1)
155+
TL = LT / 20.
156+
logger.info('using TL=\n%s', TL)
121157
else:
122158
TL = linke_turbidity
123159

@@ -185,87 +221,6 @@ def ineichen(time, location, linke_turbidity=None,
185221
return df_out
186222

187223

188-
def lookup_linke_turbidity(time, latitude, longitude, filepath=None,
189-
interp_turbidity=True):
190-
"""
191-
Look up the Linke Turibidity from the ``LinkeTurbidities.mat``
192-
data file supplied with pvlib.
193-
194-
Parameters
195-
----------
196-
time : pandas.DatetimeIndex
197-
198-
latitude : float
199-
200-
longitude : float
201-
202-
filepath : string
203-
The path to the ``.mat`` file.
204-
205-
interp_turbidity : bool
206-
If ``True``, interpolates the monthly Linke turbidity values
207-
found in ``LinkeTurbidities.mat`` to daily values.
208-
209-
Returns
210-
-------
211-
turbidity : Series
212-
"""
213-
214-
# The .mat file 'LinkeTurbidities.mat' contains a single 2160 x 4320 x 12
215-
# matrix of type uint8 called 'LinkeTurbidity'. The rows represent global
216-
# latitudes from 90 to -90 degrees; the columns represent global longitudes
217-
# from -180 to 180; and the depth (third dimension) represents months of
218-
# the year from January (1) to December (12). To determine the Linke
219-
# turbidity for a position on the Earth's surface for a given month do the
220-
# following: LT = LinkeTurbidity(LatitudeIndex, LongitudeIndex, month).
221-
# Note that the numbers within the matrix are 20 * Linke Turbidity,
222-
# so divide the number from the file by 20 to get the
223-
# turbidity.
224-
225-
try:
226-
import scipy.io
227-
except ImportError:
228-
raise ImportError('The Linke turbidity lookup table requires scipy. ' +
229-
'You can still use clearsky.ineichen if you ' +
230-
'supply your own turbidities.')
231-
232-
if filepath is None:
233-
pvlib_path = os.path.dirname(os.path.abspath(__file__))
234-
filepath = os.path.join(pvlib_path, 'data', 'LinkeTurbidities.mat')
235-
236-
mat = scipy.io.loadmat(filepath)
237-
linke_turbidity_table = mat['LinkeTurbidity']
238-
239-
latitude_index = np.around(_linearly_scale(latitude, 90, -90, 1, 2160))
240-
longitude_index = np.around(_linearly_scale(longitude, -180, 180, 1, 4320))
241-
242-
g = linke_turbidity_table[latitude_index][longitude_index]
243-
244-
if interp_turbidity:
245-
logger.info('interpolating turbidity to the day')
246-
# Cata covers 1 year.
247-
# Assume that data corresponds to the value at
248-
# the middle of each month.
249-
# This means that we need to add previous Dec and next Jan
250-
# to the array so that the interpolation will work for
251-
# Jan 1 - Jan 15 and Dec 16 - Dec 31.
252-
# Then we map the month value to the day of year value.
253-
# This is approximate and could be made more accurate.
254-
g2 = np.concatenate([[g[-1]], g, [g[0]]])
255-
days = np.linspace(-15, 380, num=14)
256-
linke_turbidity = pd.Series(np.interp(time.dayofyear, days, g2),
257-
index=time)
258-
else:
259-
logger.info('using monthly turbidity')
260-
apply_month = lambda x: g[x[0]-1]
261-
linke_turbidity = pd.DataFrame(time.month, index=time)
262-
linke_turbidity = linke_turbidity.apply(apply_month, axis=1)
263-
264-
linke_turbidity /= 20.
265-
266-
return linke_turbidity
267-
268-
269224
def haurwitz(apparent_zenith):
270225
'''
271226
Determine clear sky GHI from Haurwitz model.

pvlib/test/test_clearsky.py

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
import pandas as pd
66

77
from nose.tools import raises
8-
98
from numpy.testing import assert_almost_equal
9+
from pandas.util.testing import assert_frame_equal
1010

1111
from pvlib.location import Location
1212
from pvlib import clearsky
@@ -19,23 +19,60 @@
1919

2020
ephem_data = solarposition.get_solarposition(times, tus)
2121

22+
2223
# test the ineichen clear sky model implementation in a few ways
2324

2425
def test_ineichen_required():
2526
# the clearsky function should lookup the linke turbidity on its own
2627
# will fail without scipy
27-
clearsky.ineichen(times, tus)
28+
expected = pd.DataFrame(np.array([[0.,0.,0.],
29+
[0.,0.,0.],
30+
[40.53660309,302.47614235,78.1470311],
31+
[98.88372629,865.98938602,699.93403875],
32+
[122.57870881,931.83716051,1038.62116584],
33+
[109.30270612,899.88002304,847.68806472],
34+
[64.25699595,629.91187925,254.53048144],
35+
[0.,0.,0.],
36+
[0.,0.,0.]]),
37+
columns=['dhi', 'dni', 'ghi'],
38+
index=times_localized)
39+
out = clearsky.ineichen(times, tus)
40+
assert_frame_equal(expected, out)
2841

2942
def test_ineichen_supply_linke():
30-
clearsky.ineichen(times, tus, linke_turbidity=3)
43+
expected = pd.DataFrame(np.array([[0.,0.,0.],
44+
[0.,0.,0.],
45+
[40.18673553,322.0649964,80.23287692],
46+
[95.14405816,876.49507151,703.48596755],
47+
[118.45873721,939.81653473,1042.34531752],
48+
[105.36671577,909.113377,851.3283881],
49+
[61.91607984,647.40869542,257.47471759],
50+
[0.,0.,0.],
51+
[0.,0.,0.]]),
52+
columns=['dhi', 'dni', 'ghi'],
53+
index=times_localized)
54+
out = clearsky.ineichen(times, tus, linke_turbidity=3)
55+
assert_frame_equal(expected, out)
3156

3257
def test_ineichen_solpos():
3358
clearsky.ineichen(times, tus, linke_turbidity=3,
34-
solarposition_method='nrel_numpy')
59+
solarposition_method='ephemeris')
3560

3661
def test_ineichen_airmass():
37-
clearsky.ineichen(times, tus, linke_turbidity=3,
38-
airmass_model='simple')
62+
expected = pd.DataFrame(np.array([[0.,0.,0.],
63+
[0.,0.,0.],
64+
[41.70761136,293.72203458,78.22953786],
65+
[95.20590465,876.1650047,703.31872722],
66+
[118.46089555,939.8078753,1042.33896321],
67+
[105.39577655,908.97804342,851.24640259],
68+
[62.35382269,642.91022293,256.55363539],
69+
[0.,0.,0.],
70+
[0.,0.,0.]]),
71+
columns=['dhi', 'dni', 'ghi'],
72+
index=times_localized)
73+
out = clearsky.ineichen(times, tus, linke_turbidity=3,
74+
airmass_model='simple')
75+
assert_frame_equal(expected, out)
3976

4077
def test_ineichen_keys():
4178
clearsky_data = clearsky.ineichen(times, tus, linke_turbidity=3)

0 commit comments

Comments
 (0)