pvlib 0.11.2__py3-none-any.whl → 0.12.1a1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pvlib/__init__.py +1 -0
- pvlib/atmosphere.py +40 -40
- pvlib/bifacial/infinite_sheds.py +4 -3
- pvlib/bifacial/utils.py +2 -1
- pvlib/iotools/__init__.py +6 -0
- pvlib/iotools/psm3.py +1 -1
- pvlib/iotools/psm4.py +819 -0
- pvlib/iotools/pvgis.py +10 -2
- pvlib/iotools/tmy.py +3 -69
- pvlib/irradiance.py +38 -15
- pvlib/ivtools/sdm/__init__.py +20 -0
- pvlib/ivtools/sdm/_fit_desoto_pvsyst_sandia.py +585 -0
- pvlib/ivtools/sdm/cec.py +93 -0
- pvlib/ivtools/sdm/desoto.py +401 -0
- pvlib/ivtools/sdm/pvsyst.py +630 -0
- pvlib/location.py +73 -33
- pvlib/modelchain.py +19 -36
- pvlib/pvsystem.py +114 -65
- pvlib/snow.py +64 -28
- pvlib/spectrum/__init__.py +0 -1
- pvlib/spectrum/irradiance.py +2 -64
- pvlib/spectrum/mismatch.py +3 -3
- pvlib/tools.py +6 -5
- {pvlib-0.11.2.dist-info → pvlib-0.12.1a1.dist-info}/METADATA +6 -5
- pvlib-0.12.1a1.dist-info/RECORD +80 -0
- {pvlib-0.11.2.dist-info → pvlib-0.12.1a1.dist-info}/WHEEL +1 -1
- pvlib/data/BIRD_08_16_2012.csv +0 -8761
- pvlib/data/BIRD_08_16_2012_patm.csv +0 -8761
- pvlib/data/Burlington, United States SolarAnywhere Time Series 2021 Lat_44_465 Lon_-73_205 TMY3 format.csv +0 -8762
- pvlib/data/Burlington, United States SolarAnywhere Time Series 20210101 to 20210103 Lat_44_4675 Lon_-73_2075 SA format.csv +0 -578
- pvlib/data/Burlington, United States SolarAnywhere Typical GHI Year Lat_44_465 Lon_-73_205 SA format.csv +0 -74
- pvlib/data/CPS SCH275KTL-DO-US-800-250kW_275kVA_1.OND +0 -146
- pvlib/data/CRNS0101-05-2019-AZ_Tucson_11_W.txt +0 -4
- pvlib/data/CRN_with_problems.txt +0 -3
- pvlib/data/ET-M772BH550GL.PAN +0 -75
- pvlib/data/NLD_Amsterdam062400_IWEC.epw +0 -8768
- pvlib/data/PVsyst_demo.csv +0 -10757
- pvlib/data/PVsyst_demo_model.csv +0 -3588
- pvlib/data/SRML-day-EUPO1801.txt +0 -1441
- pvlib/data/abq19056.dat +0 -6
- pvlib/data/bishop88_numerical_precision.csv +0 -101
- pvlib/data/bsrn-lr0100-pay0616.dat +0 -86901
- pvlib/data/bsrn-pay0616.dat.gz +0 -0
- pvlib/data/cams_mcclear_1min_verbose.csv +0 -60
- pvlib/data/cams_mcclear_monthly.csv +0 -42
- pvlib/data/cams_radiation_1min_verbose.csv +0 -72
- pvlib/data/cams_radiation_monthly.csv +0 -47
- pvlib/data/detect_clearsky_data.csv +0 -35
- pvlib/data/detect_clearsky_threshold_data.csv +0 -126
- pvlib/data/greensboro_kimber_soil_manwash.dat +0 -8761
- pvlib/data/greensboro_kimber_soil_nowash.dat +0 -8761
- pvlib/data/inverter_fit_snl_meas.csv +0 -127
- pvlib/data/inverter_fit_snl_sim.csv +0 -19
- pvlib/data/ivtools_numdiff.csv +0 -52
- pvlib/data/midc_20181014.txt +0 -1441
- pvlib/data/midc_raw_20181018.txt +0 -1441
- pvlib/data/midc_raw_short_header_20191115.txt +0 -1441
- pvlib/data/msn19056.dat +0 -6
- pvlib/data/precise_iv_curves1.json +0 -10251
- pvlib/data/precise_iv_curves2.json +0 -10251
- pvlib/data/precise_iv_curves_parameter_sets1.csv +0 -33
- pvlib/data/precise_iv_curves_parameter_sets2.csv +0 -33
- pvlib/data/pvgis_hourly_Timeseries_45.000_8.000_SA2_10kWp_CIS_5_2a_2013_2014.json +0 -1
- pvlib/data/pvgis_hourly_Timeseries_45.000_8.000_SA_30deg_0deg_2016_2016.csv +0 -35
- pvlib/data/pvgis_tmy_meta.json +0 -32
- pvlib/data/pvgis_tmy_test.csv +0 -8761
- pvlib/data/pvwatts_8760_rackmount.csv +0 -8779
- pvlib/data/pvwatts_8760_roofmount.csv +0 -8779
- pvlib/data/singleaxis_tracker_wslope.csv +0 -8761
- pvlib/data/spectrl2_example_spectra.csv +0 -123
- pvlib/data/surfrad-slv16001.dat +0 -1442
- pvlib/data/test_psm3_2017.csv +0 -17521
- pvlib/data/test_psm3_2019_5min.csv +0 -289
- pvlib/data/test_psm3_tmy-2017.csv +0 -8761
- pvlib/data/test_read_psm3.csv +0 -17523
- pvlib/data/test_read_pvgis_horizon.csv +0 -49
- pvlib/data/tmy_45.000_8.000_2005_2023.csv +0 -8789
- pvlib/data/tmy_45.000_8.000_2005_2023.epw +0 -8768
- pvlib/data/tmy_45.000_8.000_2005_2023.json +0 -1
- pvlib/data/tmy_45.000_8.000_2005_2023.txt +0 -8761
- pvlib/data/tmy_45.000_8.000_userhorizon.json +0 -1
- pvlib/ivtools/sdm.py +0 -1379
- pvlib/spa_c_files/README.md +0 -81
- pvlib/spa_c_files/cspa_py.pxd +0 -43
- pvlib/spa_c_files/spa_py.pyx +0 -30
- pvlib/tests/__init__.py +0 -0
- pvlib/tests/bifacial/__init__.py +0 -0
- pvlib/tests/bifacial/test_infinite_sheds.py +0 -317
- pvlib/tests/bifacial/test_losses_models.py +0 -54
- pvlib/tests/bifacial/test_pvfactors.py +0 -82
- pvlib/tests/bifacial/test_utils.py +0 -192
- pvlib/tests/conftest.py +0 -476
- pvlib/tests/iotools/__init__.py +0 -0
- pvlib/tests/iotools/test_acis.py +0 -213
- pvlib/tests/iotools/test_bsrn.py +0 -131
- pvlib/tests/iotools/test_crn.py +0 -95
- pvlib/tests/iotools/test_epw.py +0 -23
- pvlib/tests/iotools/test_midc.py +0 -89
- pvlib/tests/iotools/test_panond.py +0 -32
- pvlib/tests/iotools/test_psm3.py +0 -198
- pvlib/tests/iotools/test_pvgis.py +0 -644
- pvlib/tests/iotools/test_sodapro.py +0 -298
- pvlib/tests/iotools/test_solaranywhere.py +0 -287
- pvlib/tests/iotools/test_solargis.py +0 -68
- pvlib/tests/iotools/test_solcast.py +0 -324
- pvlib/tests/iotools/test_solrad.py +0 -152
- pvlib/tests/iotools/test_srml.py +0 -124
- pvlib/tests/iotools/test_surfrad.py +0 -75
- pvlib/tests/iotools/test_tmy.py +0 -133
- pvlib/tests/ivtools/__init__.py +0 -0
- pvlib/tests/ivtools/test_sde.py +0 -230
- pvlib/tests/ivtools/test_sdm.py +0 -429
- pvlib/tests/ivtools/test_utils.py +0 -173
- pvlib/tests/spectrum/__init__.py +0 -0
- pvlib/tests/spectrum/conftest.py +0 -40
- pvlib/tests/spectrum/test_irradiance.py +0 -138
- pvlib/tests/spectrum/test_mismatch.py +0 -304
- pvlib/tests/spectrum/test_response.py +0 -124
- pvlib/tests/spectrum/test_spectrl2.py +0 -72
- pvlib/tests/test__deprecation.py +0 -97
- pvlib/tests/test_albedo.py +0 -84
- pvlib/tests/test_atmosphere.py +0 -351
- pvlib/tests/test_clearsky.py +0 -884
- pvlib/tests/test_conftest.py +0 -37
- pvlib/tests/test_iam.py +0 -555
- pvlib/tests/test_inverter.py +0 -213
- pvlib/tests/test_irradiance.py +0 -1487
- pvlib/tests/test_location.py +0 -356
- pvlib/tests/test_modelchain.py +0 -2020
- pvlib/tests/test_numerical_precision.py +0 -124
- pvlib/tests/test_pvarray.py +0 -71
- pvlib/tests/test_pvsystem.py +0 -2511
- pvlib/tests/test_scaling.py +0 -207
- pvlib/tests/test_shading.py +0 -391
- pvlib/tests/test_singlediode.py +0 -608
- pvlib/tests/test_snow.py +0 -212
- pvlib/tests/test_soiling.py +0 -230
- pvlib/tests/test_solarposition.py +0 -966
- pvlib/tests/test_spa.py +0 -454
- pvlib/tests/test_temperature.py +0 -470
- pvlib/tests/test_tools.py +0 -146
- pvlib/tests/test_tracking.py +0 -474
- pvlib/tests/test_transformer.py +0 -60
- pvlib-0.11.2.dist-info/RECORD +0 -191
- {pvlib-0.11.2.dist-info → pvlib-0.12.1a1.dist-info/licenses}/AUTHORS.md +0 -0
- {pvlib-0.11.2.dist-info → pvlib-0.12.1a1.dist-info/licenses}/LICENSE +0 -0
- {pvlib-0.11.2.dist-info → pvlib-0.12.1a1.dist-info}/top_level.txt +0 -0
pvlib/tests/test_location.py
DELETED
|
@@ -1,356 +0,0 @@
|
|
|
1
|
-
import datetime
|
|
2
|
-
from unittest.mock import ANY
|
|
3
|
-
|
|
4
|
-
import numpy as np
|
|
5
|
-
from numpy import nan
|
|
6
|
-
import pandas as pd
|
|
7
|
-
from .conftest import assert_frame_equal, assert_index_equal
|
|
8
|
-
|
|
9
|
-
import pytest
|
|
10
|
-
|
|
11
|
-
import pytz
|
|
12
|
-
from pytz.exceptions import UnknownTimeZoneError
|
|
13
|
-
|
|
14
|
-
import pvlib
|
|
15
|
-
from pvlib import location
|
|
16
|
-
from pvlib.location import Location, lookup_altitude
|
|
17
|
-
from pvlib.solarposition import declination_spencer71
|
|
18
|
-
from pvlib.solarposition import equation_of_time_spencer71
|
|
19
|
-
from .conftest import requires_ephem
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
def test_location_required():
|
|
23
|
-
Location(32.2, -111)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def test_location_all():
|
|
27
|
-
Location(32.2, -111, 'US/Arizona', 700, 'Tucson')
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
@pytest.mark.parametrize('tz', [
|
|
31
|
-
pytz.timezone('US/Arizona'), 'America/Phoenix', -7, -7.0,
|
|
32
|
-
datetime.timezone.utc
|
|
33
|
-
])
|
|
34
|
-
def test_location_tz(tz):
|
|
35
|
-
Location(32.2, -111, tz)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def test_location_invalid_tz():
|
|
39
|
-
with pytest.raises(UnknownTimeZoneError):
|
|
40
|
-
Location(32.2, -111, 'invalid')
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
def test_location_invalid_tz_type():
|
|
44
|
-
with pytest.raises(TypeError):
|
|
45
|
-
Location(32.2, -111, [5])
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
def test_location_print_all():
|
|
49
|
-
tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson')
|
|
50
|
-
expected_str = '\n'.join([
|
|
51
|
-
'Location: ',
|
|
52
|
-
' name: Tucson',
|
|
53
|
-
' latitude: 32.2',
|
|
54
|
-
' longitude: -111',
|
|
55
|
-
' altitude: 700',
|
|
56
|
-
' tz: US/Arizona'
|
|
57
|
-
])
|
|
58
|
-
assert tus.__str__() == expected_str
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def test_location_print_pytz():
|
|
62
|
-
tus = Location(32.2, -111, pytz.timezone('US/Arizona'), 700, 'Tucson')
|
|
63
|
-
expected_str = '\n'.join([
|
|
64
|
-
'Location: ',
|
|
65
|
-
' name: Tucson',
|
|
66
|
-
' latitude: 32.2',
|
|
67
|
-
' longitude: -111',
|
|
68
|
-
' altitude: 700',
|
|
69
|
-
' tz: US/Arizona'
|
|
70
|
-
])
|
|
71
|
-
assert tus.__str__() == expected_str
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
@pytest.fixture
|
|
75
|
-
def times():
|
|
76
|
-
return pd.date_range(start='20160101T0600-0700',
|
|
77
|
-
end='20160101T1800-0700',
|
|
78
|
-
freq='3h')
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
def test_get_clearsky(mocker, times):
|
|
82
|
-
tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson')
|
|
83
|
-
m = mocker.spy(pvlib.clearsky, 'ineichen')
|
|
84
|
-
out = tus.get_clearsky(times)
|
|
85
|
-
assert m.call_count == 1
|
|
86
|
-
assert_index_equal(out.index, times)
|
|
87
|
-
# check that values are 0 before sunrise and after sunset
|
|
88
|
-
assert out.iloc[0, :].sum().sum() == 0
|
|
89
|
-
assert out.iloc[-1:, :].sum().sum() == 0
|
|
90
|
-
# check that values are > 0 during the day
|
|
91
|
-
assert (out.iloc[1:-1, :] > 0).all().all()
|
|
92
|
-
assert (out.columns.values == ['ghi', 'dni', 'dhi']).all()
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
def test_get_clearsky_ineichen_supply_linke(mocker):
|
|
96
|
-
tus = Location(32.2, -111, 'US/Arizona', 700)
|
|
97
|
-
times = pd.date_range(start='2014-06-24-0700', end='2014-06-25-0700',
|
|
98
|
-
freq='3h')
|
|
99
|
-
mocker.spy(pvlib.clearsky, 'ineichen')
|
|
100
|
-
out = tus.get_clearsky(times, linke_turbidity=3)
|
|
101
|
-
# we only care that the LT is passed in this test
|
|
102
|
-
pvlib.clearsky.ineichen.assert_called_once_with(ANY, ANY, 3, ANY, ANY)
|
|
103
|
-
assert_index_equal(out.index, times)
|
|
104
|
-
# check that values are 0 before sunrise and after sunset
|
|
105
|
-
assert out.iloc[0:2, :].sum().sum() == 0
|
|
106
|
-
assert out.iloc[-2:, :].sum().sum() == 0
|
|
107
|
-
# check that values are > 0 during the day
|
|
108
|
-
assert (out.iloc[2:-2, :] > 0).all().all()
|
|
109
|
-
assert (out.columns.values == ['ghi', 'dni', 'dhi']).all()
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
def test_get_clearsky_haurwitz(times):
|
|
113
|
-
tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson')
|
|
114
|
-
clearsky = tus.get_clearsky(times, model='haurwitz')
|
|
115
|
-
expected = pd.DataFrame(data=np.array(
|
|
116
|
-
[[ 0. ],
|
|
117
|
-
[ 242.30085588],
|
|
118
|
-
[ 559.38247117],
|
|
119
|
-
[ 384.6873791 ],
|
|
120
|
-
[ 0. ]]),
|
|
121
|
-
columns=['ghi'],
|
|
122
|
-
index=times)
|
|
123
|
-
assert_frame_equal(expected, clearsky)
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
def test_get_clearsky_simplified_solis(times):
|
|
127
|
-
tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson')
|
|
128
|
-
clearsky = tus.get_clearsky(times, model='simplified_solis')
|
|
129
|
-
expected = pd.DataFrame(data=np.
|
|
130
|
-
array([[ 0. , 0. , 0. ],
|
|
131
|
-
[ 70.00146271, 638.01145669, 236.71136245],
|
|
132
|
-
[ 101.69729217, 852.51950946, 577.1117803 ],
|
|
133
|
-
[ 86.1679965 , 755.98048017, 385.59586091],
|
|
134
|
-
[ 0. , 0. , 0. ]]),
|
|
135
|
-
columns=['dhi', 'dni', 'ghi'],
|
|
136
|
-
index=times)
|
|
137
|
-
expected = expected[['ghi', 'dni', 'dhi']]
|
|
138
|
-
assert_frame_equal(expected, clearsky, check_less_precise=2)
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
def test_get_clearsky_simplified_solis_apparent_elevation(times):
|
|
142
|
-
tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson')
|
|
143
|
-
solar_position = {'apparent_elevation': pd.Series(80, index=times),
|
|
144
|
-
'apparent_zenith': pd.Series(10, index=times)}
|
|
145
|
-
clearsky = tus.get_clearsky(times, model='simplified_solis',
|
|
146
|
-
solar_position=solar_position)
|
|
147
|
-
expected = pd.DataFrame(data=np.
|
|
148
|
-
array([[ 131.3124497 , 1001.14754036, 1108.14147919],
|
|
149
|
-
[ 131.3124497 , 1001.14754036, 1108.14147919],
|
|
150
|
-
[ 131.3124497 , 1001.14754036, 1108.14147919],
|
|
151
|
-
[ 131.3124497 , 1001.14754036, 1108.14147919],
|
|
152
|
-
[ 131.3124497 , 1001.14754036, 1108.14147919]]),
|
|
153
|
-
columns=['dhi', 'dni', 'ghi'],
|
|
154
|
-
index=times)
|
|
155
|
-
expected = expected[['ghi', 'dni', 'dhi']]
|
|
156
|
-
assert_frame_equal(expected, clearsky, check_less_precise=2)
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
def test_get_clearsky_simplified_solis_dni_extra(times):
|
|
160
|
-
tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson')
|
|
161
|
-
clearsky = tus.get_clearsky(times, model='simplified_solis',
|
|
162
|
-
dni_extra=1370)
|
|
163
|
-
expected = pd.DataFrame(data=np.
|
|
164
|
-
array([[ 0. , 0. , 0. ],
|
|
165
|
-
[ 67.82281485, 618.15469596, 229.34422063],
|
|
166
|
-
[ 98.53217848, 825.98663808, 559.15039353],
|
|
167
|
-
[ 83.48619937, 732.45218243, 373.59500313],
|
|
168
|
-
[ 0. , 0. , 0. ]]),
|
|
169
|
-
columns=['dhi', 'dni', 'ghi'],
|
|
170
|
-
index=times)
|
|
171
|
-
expected = expected[['ghi', 'dni', 'dhi']]
|
|
172
|
-
assert_frame_equal(expected, clearsky)
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
def test_get_clearsky_simplified_solis_pressure(times):
|
|
176
|
-
tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson')
|
|
177
|
-
clearsky = tus.get_clearsky(times, model='simplified_solis',
|
|
178
|
-
pressure=95000)
|
|
179
|
-
expected = pd.DataFrame(data=np.
|
|
180
|
-
array([[ 0. , 0. , 0. ],
|
|
181
|
-
[ 70.20556637, 635.53091983, 236.17716435],
|
|
182
|
-
[ 102.08954904, 850.49502085, 576.28465815],
|
|
183
|
-
[ 86.46561686, 753.70744638, 384.90537859],
|
|
184
|
-
[ 0. , 0. , 0. ]]),
|
|
185
|
-
columns=['dhi', 'dni', 'ghi'],
|
|
186
|
-
index=times)
|
|
187
|
-
expected = expected[['ghi', 'dni', 'dhi']]
|
|
188
|
-
assert_frame_equal(expected, clearsky, check_less_precise=2)
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
def test_get_clearsky_simplified_solis_aod_pw(times):
|
|
192
|
-
tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson')
|
|
193
|
-
clearsky = tus.get_clearsky(times, model='simplified_solis',
|
|
194
|
-
aod700=0.25, precipitable_water=2.)
|
|
195
|
-
expected = pd.DataFrame(data=np.
|
|
196
|
-
array([[ 0. , 0. , 0. ],
|
|
197
|
-
[ 85.77821205, 374.58084365, 179.48483117],
|
|
198
|
-
[ 143.52743364, 625.91745295, 490.06254157],
|
|
199
|
-
[ 114.63275842, 506.52275195, 312.24711495],
|
|
200
|
-
[ 0. , 0. , 0. ]]),
|
|
201
|
-
columns=['dhi', 'dni', 'ghi'],
|
|
202
|
-
index=times)
|
|
203
|
-
expected = expected[['ghi', 'dni', 'dhi']]
|
|
204
|
-
assert_frame_equal(expected, clearsky, check_less_precise=2)
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
def test_get_clearsky_valueerror(times):
|
|
208
|
-
tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson')
|
|
209
|
-
with pytest.raises(ValueError):
|
|
210
|
-
tus.get_clearsky(times, model='invalid_model')
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
def test_from_tmy_3():
|
|
214
|
-
from pvlib.tests.iotools.test_tmy import TMY3_TESTFILE
|
|
215
|
-
from pvlib.iotools import read_tmy3
|
|
216
|
-
data, meta = read_tmy3(TMY3_TESTFILE, map_variables=True)
|
|
217
|
-
loc = Location.from_tmy(meta, data)
|
|
218
|
-
assert loc.name is not None
|
|
219
|
-
assert loc.altitude != 0
|
|
220
|
-
assert loc.tz != 'UTC'
|
|
221
|
-
assert_frame_equal(loc.weather, data)
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
def test_from_tmy_2():
|
|
225
|
-
from pvlib.tests.iotools.test_tmy import TMY2_TESTFILE
|
|
226
|
-
from pvlib.iotools import read_tmy2
|
|
227
|
-
data, meta = read_tmy2(TMY2_TESTFILE)
|
|
228
|
-
loc = Location.from_tmy(meta, data)
|
|
229
|
-
assert loc.name is not None
|
|
230
|
-
assert loc.altitude != 0
|
|
231
|
-
assert loc.tz != 'UTC'
|
|
232
|
-
assert_frame_equal(loc.weather, data)
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
def test_from_epw():
|
|
236
|
-
from pvlib.tests.iotools.test_epw import epw_testfile
|
|
237
|
-
from pvlib.iotools import read_epw
|
|
238
|
-
data, meta = read_epw(epw_testfile)
|
|
239
|
-
loc = Location.from_epw(meta, data)
|
|
240
|
-
assert loc.name is not None
|
|
241
|
-
assert loc.altitude != 0
|
|
242
|
-
assert loc.tz != 'UTC'
|
|
243
|
-
assert_frame_equal(loc.weather, data)
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
def test_get_solarposition(expected_solpos, golden_mst):
|
|
247
|
-
times = pd.date_range(datetime.datetime(2003, 10, 17, 12, 30, 30),
|
|
248
|
-
periods=1, freq='D', tz=golden_mst.tz)
|
|
249
|
-
ephem_data = golden_mst.get_solarposition(times, temperature=11)
|
|
250
|
-
ephem_data = np.round(ephem_data, 3)
|
|
251
|
-
expected_solpos.index = times
|
|
252
|
-
expected_solpos = np.round(expected_solpos, 3)
|
|
253
|
-
assert_frame_equal(expected_solpos, ephem_data[expected_solpos.columns])
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
def test_get_airmass(times):
|
|
257
|
-
tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson')
|
|
258
|
-
airmass = tus.get_airmass(times)
|
|
259
|
-
expected = pd.DataFrame(data=np.array(
|
|
260
|
-
[[ nan, nan],
|
|
261
|
-
[ 3.61046506, 3.32072602],
|
|
262
|
-
[ 1.76470864, 1.62309115],
|
|
263
|
-
[ 2.45582153, 2.25874238],
|
|
264
|
-
[ nan, nan]]),
|
|
265
|
-
columns=['airmass_relative', 'airmass_absolute'],
|
|
266
|
-
index=times)
|
|
267
|
-
assert_frame_equal(expected, airmass)
|
|
268
|
-
|
|
269
|
-
airmass = tus.get_airmass(times, model='young1994')
|
|
270
|
-
expected = pd.DataFrame(data=np.array(
|
|
271
|
-
[[ nan, nan],
|
|
272
|
-
[ 3.6075018 , 3.31800056],
|
|
273
|
-
[ 1.7641033 , 1.62253439],
|
|
274
|
-
[ 2.45413091, 2.25718744],
|
|
275
|
-
[ nan, nan]]),
|
|
276
|
-
columns=['airmass_relative', 'airmass_absolute'],
|
|
277
|
-
index=times)
|
|
278
|
-
assert_frame_equal(expected, airmass)
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
def test_get_airmass_valueerror(times):
|
|
282
|
-
tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson')
|
|
283
|
-
with pytest.raises(ValueError):
|
|
284
|
-
tus.get_airmass(times, model='invalid_model')
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
def test_Location___repr__():
|
|
288
|
-
tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson')
|
|
289
|
-
|
|
290
|
-
expected = '\n'.join([
|
|
291
|
-
'Location: ',
|
|
292
|
-
' name: Tucson',
|
|
293
|
-
' latitude: 32.2',
|
|
294
|
-
' longitude: -111',
|
|
295
|
-
' altitude: 700',
|
|
296
|
-
' tz: US/Arizona'
|
|
297
|
-
])
|
|
298
|
-
assert tus.__repr__() == expected
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
@requires_ephem
|
|
302
|
-
def test_get_sun_rise_set_transit(golden):
|
|
303
|
-
times = pd.DatetimeIndex(['2015-01-01 07:00:00', '2015-01-01 23:00:00'],
|
|
304
|
-
tz='MST')
|
|
305
|
-
result = golden.get_sun_rise_set_transit(times, method='pyephem')
|
|
306
|
-
assert all(result.columns == ['sunrise', 'sunset', 'transit'])
|
|
307
|
-
|
|
308
|
-
result = golden.get_sun_rise_set_transit(times, method='spa')
|
|
309
|
-
assert all(result.columns == ['sunrise', 'sunset', 'transit'])
|
|
310
|
-
|
|
311
|
-
dayofyear = 1
|
|
312
|
-
declination = declination_spencer71(dayofyear)
|
|
313
|
-
eot = equation_of_time_spencer71(dayofyear)
|
|
314
|
-
result = golden.get_sun_rise_set_transit(times, method='geometric',
|
|
315
|
-
declination=declination,
|
|
316
|
-
equation_of_time=eot)
|
|
317
|
-
assert all(result.columns == ['sunrise', 'sunset', 'transit'])
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
def test_get_sun_rise_set_transit_valueerror(golden):
|
|
321
|
-
times = pd.DatetimeIndex(['2015-01-01 07:00:00', '2015-01-01 23:00:00'],
|
|
322
|
-
tz='MST')
|
|
323
|
-
with pytest.raises(ValueError):
|
|
324
|
-
golden.get_sun_rise_set_transit(times, method='eyeball')
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
def test_extra_kwargs():
|
|
328
|
-
with pytest.raises(TypeError, match='arbitrary_kwarg'):
|
|
329
|
-
Location(32.2, -111, arbitrary_kwarg='value')
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
@pytest.mark.parametrize('lat,lon,expected_alt', [
|
|
333
|
-
pytest.param(32.2540, -110.9742, 724, id='Tucson, USA'),
|
|
334
|
-
pytest.param(-15.3875, 28.3228, 1253, id='Lusaka, Zambia'),
|
|
335
|
-
pytest.param(35.6762, 139.6503, 40, id='Tokyo, Japan'),
|
|
336
|
-
pytest.param(-35.2802, 149.1310, 566, id='Canberra, Australia'),
|
|
337
|
-
pytest.param(4.7110, -74.0721, 2555, id='Bogota, Colombia'),
|
|
338
|
-
pytest.param(31.525849, 35.449214, -415, id='Dead Sea, West Bank'),
|
|
339
|
-
pytest.param(28.6139, 77.2090, 214, id='New Delhi, India'),
|
|
340
|
-
pytest.param(0, 0, 0, id='Null Island, Atlantic Ocean'),
|
|
341
|
-
])
|
|
342
|
-
def test_lookup_altitude(lat, lon, expected_alt):
|
|
343
|
-
alt_found = lookup_altitude(lat, lon)
|
|
344
|
-
assert alt_found == pytest.approx(expected_alt, abs=125)
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
def test_location_lookup_altitude(mocker):
|
|
348
|
-
mocker.spy(location, 'lookup_altitude')
|
|
349
|
-
tus = Location(32.2, -111, 'US/Arizona', 700, 'Tucson')
|
|
350
|
-
location.lookup_altitude.assert_not_called()
|
|
351
|
-
assert tus.altitude == 700
|
|
352
|
-
location.lookup_altitude.reset_mock()
|
|
353
|
-
|
|
354
|
-
tus = Location(32.2, -111, 'US/Arizona')
|
|
355
|
-
location.lookup_altitude.assert_called_once_with(32.2, -111)
|
|
356
|
-
assert tus.altitude == location.lookup_altitude(32.2, -111)
|