pvlib 0.13.0__py3-none-any.whl → 0.13.1__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/bifacial/pvfactors.py +1 -1
- pvlib/clearsky.py +21 -12
- pvlib/inverter.py +11 -7
- pvlib/iotools/__init__.py +6 -0
- pvlib/iotools/meteonorm.py +623 -0
- pvlib/iotools/nasa_power.py +153 -0
- pvlib/iotools/pvgis.py +1 -1
- pvlib/iotools/tmy.py +4 -2
- pvlib/irradiance.py +307 -295
- pvlib/ivtools/sdm/_fit_desoto_pvsyst_sandia.py +1 -1
- pvlib/ivtools/sdm/cec.py +1 -1
- pvlib/ivtools/sdm/desoto.py +6 -6
- pvlib/ivtools/sdm/pvsyst.py +7 -7
- pvlib/modelchain.py +19 -10
- pvlib/pvarray.py +61 -17
- pvlib/singlediode.py +16 -10
- pvlib/solarposition.py +11 -10
- pvlib/spectrum/mismatch.py +7 -19
- pvlib/temperature.py +58 -10
- pvlib/tools.py +2 -2
- pvlib/tracking.py +11 -6
- {pvlib-0.13.0.dist-info → pvlib-0.13.1.dist-info}/METADATA +5 -5
- {pvlib-0.13.0.dist-info → pvlib-0.13.1.dist-info}/RECORD +27 -25
- {pvlib-0.13.0.dist-info → pvlib-0.13.1.dist-info}/WHEEL +0 -0
- {pvlib-0.13.0.dist-info → pvlib-0.13.1.dist-info}/licenses/AUTHORS.md +0 -0
- {pvlib-0.13.0.dist-info → pvlib-0.13.1.dist-info}/licenses/LICENSE +0 -0
- {pvlib-0.13.0.dist-info → pvlib-0.13.1.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"""Functions for reading and retrieving data from NASA POWER."""
|
|
2
|
+
|
|
3
|
+
import pandas as pd
|
|
4
|
+
import requests
|
|
5
|
+
import numpy as np
|
|
6
|
+
|
|
7
|
+
URL = 'https://power.larc.nasa.gov/api/temporal/hourly/point'
|
|
8
|
+
|
|
9
|
+
DEFAULT_PARAMETERS = [
|
|
10
|
+
'dni', 'dhi', 'ghi', 'temp_air', 'wind_speed'
|
|
11
|
+
]
|
|
12
|
+
|
|
13
|
+
VARIABLE_MAP = {
|
|
14
|
+
'ALLSKY_SFC_SW_DWN': 'ghi',
|
|
15
|
+
'ALLSKY_SFC_SW_DIFF': 'dhi',
|
|
16
|
+
'ALLSKY_SFC_SW_DNI': 'dni',
|
|
17
|
+
'CLRSKY_SFC_SW_DWN': 'ghi_clear',
|
|
18
|
+
'T2M': 'temp_air',
|
|
19
|
+
'WS2M': 'wind_speed_2m',
|
|
20
|
+
'WS10M': 'wind_speed',
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def get_nasa_power(latitude, longitude, start, end,
|
|
25
|
+
parameters=DEFAULT_PARAMETERS, *, community='re',
|
|
26
|
+
elevation=None, wind_height=None, wind_surface=None,
|
|
27
|
+
map_variables=True, url=URL):
|
|
28
|
+
"""
|
|
29
|
+
Retrieve irradiance and weather data from NASA POWER.
|
|
30
|
+
|
|
31
|
+
A general description of NASA POWER is given in [1]_ and the API is
|
|
32
|
+
described in [2]_. A detailed list of the available parameters can be
|
|
33
|
+
found in [3]_.
|
|
34
|
+
|
|
35
|
+
Parameters
|
|
36
|
+
----------
|
|
37
|
+
latitude: float
|
|
38
|
+
In decimal degrees, north is positive (ISO 19115).
|
|
39
|
+
longitude: float
|
|
40
|
+
In decimal degrees, east is positive (ISO 19115).
|
|
41
|
+
start: datetime like
|
|
42
|
+
First timestamp of the requested period.
|
|
43
|
+
end: datetime like
|
|
44
|
+
Last timestamp of the requested period.
|
|
45
|
+
parameters: str, list
|
|
46
|
+
List of parameters. The default parameters are mentioned below; for the
|
|
47
|
+
full list see [3]_. Note that the pvlib naming conventions can also be
|
|
48
|
+
used.
|
|
49
|
+
|
|
50
|
+
* Global Horizontal Irradiance (GHI) [Wm⁻²]
|
|
51
|
+
* Diffuse Horizontal Irradiance (DHI) [Wm⁻²]
|
|
52
|
+
* Direct Normal Irradiance (DNI) [Wm⁻²]
|
|
53
|
+
* Air temperature at 2 m [C]
|
|
54
|
+
* Wind speed at 10 m [m/s]
|
|
55
|
+
|
|
56
|
+
community: str, default 're'
|
|
57
|
+
Can be one of the following depending on which parameters are of
|
|
58
|
+
interest. Note that in many cases this choice
|
|
59
|
+
might affect the units of the parameter.
|
|
60
|
+
|
|
61
|
+
* ``'re'``: renewable energy
|
|
62
|
+
* ``'sb'``: sustainable buildings
|
|
63
|
+
* ``'ag'``: agroclimatology
|
|
64
|
+
|
|
65
|
+
elevation: float, optional
|
|
66
|
+
The custom site elevation in meters to produce the corrected
|
|
67
|
+
atmospheric pressure adjusted for elevation.
|
|
68
|
+
wind_height: float, optional
|
|
69
|
+
The custom wind height in meters to produce the wind speed adjusted
|
|
70
|
+
for height. Has to be between 10 and 300 m; see [4]_.
|
|
71
|
+
wind_surface: str, optional
|
|
72
|
+
The definable surface type to adjust the wind speed. For a list of the
|
|
73
|
+
surface types see [4]_. If you provide a wind surface alias please
|
|
74
|
+
include a site elevation with the request.
|
|
75
|
+
map_variables: bool, default True
|
|
76
|
+
When true, renames columns of the Dataframe to pvlib variable names
|
|
77
|
+
where applicable. See variable :const:`VARIABLE_MAP`.
|
|
78
|
+
|
|
79
|
+
Raises
|
|
80
|
+
------
|
|
81
|
+
requests.HTTPError
|
|
82
|
+
Raises an error when an incorrect request is made.
|
|
83
|
+
|
|
84
|
+
Returns
|
|
85
|
+
-------
|
|
86
|
+
data : pd.DataFrame
|
|
87
|
+
Time series data. The index corresponds to the start (left) of the
|
|
88
|
+
interval.
|
|
89
|
+
meta : dict
|
|
90
|
+
Metadata.
|
|
91
|
+
|
|
92
|
+
References
|
|
93
|
+
----------
|
|
94
|
+
.. [1] `NASA Prediction Of Worldwide Energy Resources (POWER)
|
|
95
|
+
<https://power.larc.nasa.gov/>`_
|
|
96
|
+
.. [2] `NASA POWER API
|
|
97
|
+
<https://power.larc.nasa.gov/api/pages/>`_
|
|
98
|
+
.. [3] `NASA POWER API parameters
|
|
99
|
+
<https://power.larc.nasa.gov/parameters/>`_
|
|
100
|
+
.. [4] `NASA POWER corrected wind speed parameters
|
|
101
|
+
<https://power.larc.nasa.gov/docs/methodology/meteorology/wind/>`_
|
|
102
|
+
"""
|
|
103
|
+
start = pd.Timestamp(start)
|
|
104
|
+
end = pd.Timestamp(end)
|
|
105
|
+
|
|
106
|
+
# allow the use of pvlib parameter names
|
|
107
|
+
parameter_dict = {v: k for k, v in VARIABLE_MAP.items()}
|
|
108
|
+
parameters = [parameter_dict.get(p, p) for p in parameters]
|
|
109
|
+
|
|
110
|
+
params = {
|
|
111
|
+
'latitude': latitude,
|
|
112
|
+
'longitude': longitude,
|
|
113
|
+
'start': start.strftime('%Y%m%d'),
|
|
114
|
+
'end': end.strftime('%Y%m%d'),
|
|
115
|
+
'community': community,
|
|
116
|
+
'parameters': ','.join(parameters), # make parameters in a string
|
|
117
|
+
'format': 'json',
|
|
118
|
+
'user': None,
|
|
119
|
+
'header': True,
|
|
120
|
+
'time-standard': 'utc',
|
|
121
|
+
'site-elevation': elevation,
|
|
122
|
+
'wind-elevation': wind_height,
|
|
123
|
+
'wind-surface': wind_surface,
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
response = requests.get(url, params=params)
|
|
127
|
+
if not response.ok:
|
|
128
|
+
# response.raise_for_status() does not give a useful error message
|
|
129
|
+
raise requests.HTTPError(response.json())
|
|
130
|
+
|
|
131
|
+
# Parse the data to dataframe
|
|
132
|
+
data = response.json()
|
|
133
|
+
hourly_data = data['properties']['parameter']
|
|
134
|
+
df = pd.DataFrame(hourly_data)
|
|
135
|
+
df.index = pd.to_datetime(df.index, format='%Y%m%d%H').tz_localize('UTC')
|
|
136
|
+
|
|
137
|
+
# Create metadata dictionary
|
|
138
|
+
meta = data['header']
|
|
139
|
+
meta['times'] = data['times']
|
|
140
|
+
meta['parameters'] = data['parameters']
|
|
141
|
+
|
|
142
|
+
meta['longitude'] = data['geometry']['coordinates'][0]
|
|
143
|
+
meta['latitude'] = data['geometry']['coordinates'][1]
|
|
144
|
+
meta['altitude'] = data['geometry']['coordinates'][2]
|
|
145
|
+
|
|
146
|
+
# Replace NaN values
|
|
147
|
+
df = df.replace(meta['fill_value'], np.nan)
|
|
148
|
+
|
|
149
|
+
# Rename according to pvlib convention
|
|
150
|
+
if map_variables:
|
|
151
|
+
df = df.rename(columns=VARIABLE_MAP)
|
|
152
|
+
|
|
153
|
+
return df, meta
|
pvlib/iotools/pvgis.py
CHANGED
|
@@ -202,7 +202,7 @@ def get_pvgis_hourly(latitude, longitude, start=None, end=None,
|
|
|
202
202
|
.. [2] `PVGIS Hourly Radiation
|
|
203
203
|
<https://ec.europa.eu/jrc/en/PVGIS/tools/hourly-radiation>`_
|
|
204
204
|
.. [3] `PVGIS Non-interactive service
|
|
205
|
-
<https://ec.europa.eu/
|
|
205
|
+
<https://joint-research-centre.ec.europa.eu/photovoltaic-geographical-information-system-pvgis/getting-started-pvgis/api-non-interactive-service_en>`_
|
|
206
206
|
.. [4] `PVGIS horizon profile tool
|
|
207
207
|
<https://ec.europa.eu/jrc/en/PVGIS/tools/horizon>`_
|
|
208
208
|
""" # noqa: E501
|
pvlib/iotools/tmy.py
CHANGED
|
@@ -4,6 +4,8 @@ import datetime
|
|
|
4
4
|
import re
|
|
5
5
|
import pandas as pd
|
|
6
6
|
|
|
7
|
+
from pvlib.tools import _file_context_manager
|
|
8
|
+
|
|
7
9
|
# Dictionary mapping TMY3 names to pvlib names
|
|
8
10
|
VARIABLE_MAP = {
|
|
9
11
|
'GHI (W/m^2)': 'ghi',
|
|
@@ -35,7 +37,7 @@ def read_tmy3(filename, coerce_year=None, map_variables=True, encoding=None):
|
|
|
35
37
|
|
|
36
38
|
Parameters
|
|
37
39
|
----------
|
|
38
|
-
filename : str
|
|
40
|
+
filename : str, Path, or file-like object
|
|
39
41
|
A relative file path or absolute file path.
|
|
40
42
|
coerce_year : int, optional
|
|
41
43
|
If supplied, the year of the index will be set to ``coerce_year``, except
|
|
@@ -186,7 +188,7 @@ def read_tmy3(filename, coerce_year=None, map_variables=True, encoding=None):
|
|
|
186
188
|
""" # noqa: E501
|
|
187
189
|
head = ['USAF', 'Name', 'State', 'TZ', 'latitude', 'longitude', 'altitude']
|
|
188
190
|
|
|
189
|
-
with
|
|
191
|
+
with _file_context_manager(filename, mode="r", encoding=encoding) as fbuf:
|
|
190
192
|
# header information on the 1st line (0 indexing)
|
|
191
193
|
firstline = fbuf.readline()
|
|
192
194
|
# use pandas to read the csv file buffer
|