Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
results.loc[filt, 'run_slope_low'] = 0
results.loc[filt, 'run_slope_high'] = 0
results.loc[filt, 'valid'] = False
# Calculate the next inferred start loss from next valid interval
results['next_inferred_start_loss'] = np.clip(
results[results.valid].inferred_start_loss.shift(-1),
0, 1)
# Calculate the inferred recovery at the end of each interval
results['inferred_recovery'] = np.clip(
results.next_inferred_start_loss - results.inferred_end_loss,
0, 1)
# Don't consider data outside of first and last valid interverals
if len(results[results.valid]) == 0:
raise NoValidIntervalError('No valid soiling intervals were found')
new_start = results[results.valid].start.iloc[0]
new_end = results[results.valid].end.iloc[-1]
pm_frame_out = daily_df[new_start:new_end]
pm_frame_out = pm_frame_out.reset_index() \
.merge(results, how='left', on='run') \
.set_index('date')
pm_frame_out['loss_perfect_clean'] = np.nan
pm_frame_out['loss_inferred_clean'] = np.nan
pm_frame_out['days_since_clean'] = \
(pm_frame_out.index - pm_frame_out.start).dt.days
# Calculate the daily derate
pm_frame_out['loss_perfect_clean'] = \
pm_frame_out.start_loss + \
pm_frame_out.days_since_clean * pm_frame_out.run_slope
}
if len(run) > 2 and run.pi_norm.sum() > 0:
fit = theilslopes(run.pi_norm, run.day)
fit_poly = np.poly1d(fit[0:2])
result_dict['run_slope'] = fit[0]
result_dict['run_slope_low'] = fit[2]
result_dict['run_slope_high'] = min([0.0, fit[3]])
result_dict['inferred_start_loss'] = fit_poly(start_day)
result_dict['inferred_end_loss'] = fit_poly(end_day)
result_dict['valid'] = True
result_list.append(result_dict)
results = pd.DataFrame(result_list)
if results.empty:
raise NoValidIntervalError('No valid soiling intervals were found')
# Filter results for each interval,
# setting invalid interval to slope of 0
results['slope_err'] = (results.run_slope_high-results.run_slope_low) \
/ abs(results.run_slope)
# critera for exclusions
filt = (
(results.run_slope > 0) |
(results.slope_err >= max_relative_slope_error / 100.0) |
(results.max_neg_step <= -1.0 * max_negative_step)
)
results.loc[filt, 'run_slope'] = 0
results.loc[filt, 'run_slope_low'] = 0
results.loc[filt, 'run_slope_high'] = 0
results.loc[filt, 'valid'] = False