def read_fwd_curve(): fwd_periods = [] fwd_prices = [] fwd_row = 0 while fwd_input_sheet[fwd_row, 0].value != '': fwd_periods.append( pd.Period(fwd_input_sheet[fwd_row, 0].value, freq=freq)) fwd_prices.append(fwd_input_sheet[fwd_row, 1].value) fwd_row += 1 if smooth_curve_wgt.value: p1, p2 = itertools.tee(fwd_periods) next(p2, None) contracts = [] for start, end, price in zip(p1, p2, fwd_prices): contracts.append((start, end - 1, price)) weekend_adjust = None if apply_wkend_shaping_wgt.value: wkend_factor = wkend_factor_wgt.value weekend_adjust = adjustments.dayofweek(default=1.0, saturday=wkend_factor, sunday=wkend_factor) return max_smooth_interp(contracts, freq=freq, mult_season_adjust=weekend_adjust) else: return pd.Series( fwd_prices, pd.PeriodIndex(fwd_periods)).resample(freq).fillna('pad')
def test_max_smooth_interp_add_season_adjust_called_as_expected(self): adjust_arg_values = [] def add_season_adjust(period): adjust_arg_values.append(period) return 1.0 curve = max_smooth_interp(self.daily_contracts, freq='D', add_season_adjust=add_season_adjust) expected_first_arg = pd.Period('2019-5-14', freq='D') expected_arg_values = [expected_first_arg + i for i in range(0, 5)] * 2 self.assertListEqual(expected_arg_values, adjust_arg_values)
def test_max_smooth_interp_average_weight_called_as_expected(self): weight_arg_values = [] def average_weight(period): weight_arg_values.append(period) return 1.0 curve = max_smooth_interp(self.daily_contracts, freq='D', average_weight=average_weight) expected_first_arg = pd.Period('2019-5-14', freq='D') expected_arg_values = [expected_first_arg + i for i in range(0, 5)] self.assertListEqual(expected_arg_values, weight_arg_values)
def test_max_smooth_interp_averages_back_to_inputs(self): for test_data in self.test_case_data: interp_curve = max_smooth_interp(**test_data) average_weight = test_data[ 'average_weight'] if 'average_weight' in test_data else lambda x: 1.0 test_contracts = test_data['contracts'] if isinstance(test_contracts, pd.Series): for period, contract_price in test_contracts.items(): curve_average_price = weighted_average_slice_curve( interp_curve, test_data['freq'], period, average_weight) self.assertAlmostEqual(curve_average_price, contract_price, delta=1E-10) else: for contract in test_contracts: (period, contract_price) = deconstruct_contract(contract) curve_average_price = weighted_average_slice_curve( interp_curve, test_data['freq'], period, average_weight) self.assertAlmostEqual(curve_average_price, contract_price, delta=1E-10)