Skip to content

Commit febc343

Browse files
adriessewholmgren
authored andcommitted
Put SAM product renaming code in a separate function, simplify, add warning. (#753)
* Put product renaming code in a separate function, simplify, add warning. * Add test and pacify stickler somewhat. * Add one comment * u -> o
1 parent e326fa5 commit febc343

File tree

2 files changed

+54
-17
lines changed

2 files changed

+54
-17
lines changed

pvlib/pvsystem.py

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1537,26 +1537,41 @@ def retrieve_sam(name=None, path=None):
15371537
return _parse_raw_sam_df(csvdata)
15381538

15391539

1540+
def _normalize_sam_product_names(names):
1541+
'''
1542+
Replace special characters within the product names to make them more
1543+
suitable for use as Dataframe column names.
1544+
'''
1545+
# Contributed by Anton Driesse (@adriesse), PV Performance Labs. July, 2019
1546+
1547+
import warnings
1548+
1549+
BAD_CHARS = ' -.()[]:+/",'
1550+
GOOD_CHARS = '____________'
1551+
1552+
mapping = str.maketrans(BAD_CHARS, GOOD_CHARS)
1553+
names = pd.Series(data=names)
1554+
norm_names = names.str.translate(mapping)
1555+
1556+
n_duplicates = names.duplicated().sum()
1557+
if n_duplicates > 0:
1558+
warnings.warn('Original names contain %d duplicate(s).' % n_duplicates)
1559+
1560+
n_duplicates = norm_names.duplicated().sum()
1561+
if n_duplicates > 0:
1562+
warnings.warn('Normalized names contain %d duplicate(s).' % n_duplicates)
1563+
1564+
return norm_names.values
1565+
1566+
15401567
def _parse_raw_sam_df(csvdata):
1568+
15411569
df = pd.read_csv(csvdata, index_col=0, skiprows=[1, 2])
1542-
colnames = df.columns.values.tolist()
1543-
parsedcolnames = []
1544-
for cn in colnames:
1545-
parsedcolnames.append(cn.replace(' ', '_'))
1546-
1547-
df.columns = parsedcolnames
1548-
1549-
parsedindex = []
1550-
for index in df.index:
1551-
parsedindex.append(index.replace(' ', '_').replace('-', '_')
1552-
.replace('.', '_').replace('(', '_')
1553-
.replace(')', '_').replace('[', '_')
1554-
.replace(']', '_').replace(':', '_')
1555-
.replace('+', '_').replace('/', '_')
1556-
.replace('"', '_').replace(',', '_'))
1557-
1558-
df.index = parsedindex
1570+
1571+
df.columns = df.columns.str.replace(' ', '_')
1572+
df.index = _normalize_sam_product_names(df.index)
15591573
df = df.transpose()
1574+
15601575
if 'ADRCoefficients' in df.index:
15611576
ad_ce = 'ADRCoefficients'
15621577
# for each inverter, parses a string of coefficients like

pvlib/test/test_pvsystem.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,28 @@ def test_PVSystem_get_iam_interp(sapm_module_params, mocker):
107107
with pytest.raises(ValueError):
108108
system.get_iam(45, iam_model='interp')
109109

110+
def test__normalize_sam_product_names():
111+
112+
BAD_NAMES = [' -.()[]:+/",', 'Module[1]']
113+
NORM_NAMES = ['____________', 'Module_1_']
114+
115+
norm_names = pvsystem._normalize_sam_product_names(BAD_NAMES)
116+
assert list(norm_names) == NORM_NAMES
117+
118+
BAD_NAMES = ['Module[1]', 'Module(1)']
119+
NORM_NAMES = ['Module_1_', 'Module_1_']
120+
121+
with pytest.warns(UserWarning):
122+
norm_names = pvsystem._normalize_sam_product_names(BAD_NAMES)
123+
assert list(norm_names) == NORM_NAMES
124+
125+
BAD_NAMES = ['Module[1]', 'Module[1]']
126+
NORM_NAMES = ['Module_1_', 'Module_1_']
127+
128+
with pytest.warns(UserWarning):
129+
norm_names = pvsystem._normalize_sam_product_names(BAD_NAMES)
130+
assert list(norm_names) == NORM_NAMES
131+
110132

111133
def test_PVSystem_get_iam_invalid(sapm_module_params, mocker):
112134
system = pvsystem.PVSystem(module_parameters=sapm_module_params)

0 commit comments

Comments
 (0)