def test_min_value_quantities(self): rule = Rule.objects.create(name='min_str_rule', data_type=Rule.TYPE_EUI, min=10, max=100, units='kBtu/ft**2/year') self.assertTrue(rule.minimum_valid(15)) self.assertTrue(rule.minimum_valid('15')) self.assertTrue(rule.maximum_valid(15)) self.assertTrue(rule.maximum_valid('15')) self.assertFalse(rule.minimum_valid(5)) self.assertFalse(rule.minimum_valid('5')) self.assertFalse(rule.maximum_valid(150)) self.assertFalse(rule.maximum_valid('150')) # All of these should value since they are less than 10 (e.g. 5 kbtu/m2/year =~ 0.5 kbtu/ft2/year) # different units on check data self.assertFalse(rule.minimum_valid(ureg.Quantity(5, "kBtu/ft**2/year"))) self.assertFalse(rule.minimum_valid(ureg.Quantity(5, "kBtu/m**2/year"))) # ~ 0.5 kbtu/ft2/year self.assertFalse(rule.maximum_valid(ureg.Quantity(110, "kBtu/ft**2/year"))) self.assertFalse(rule.maximum_valid(ureg.Quantity(1100, "kBtu/m**2/year"))) # ~ 102.2 kbtu/ft2/year # these should all pass self.assertTrue(rule.minimum_valid(ureg.Quantity(10, "kBtu/ft**2/year"))) self.assertTrue(rule.minimum_valid(ureg.Quantity(110, "kBtu/m**2/year"))) # 10.22 kbtu/ft2/year # test the rule with different units rule = Rule.objects.create(name='min_str_rule', data_type=Rule.TYPE_EUI, min=10, max=100, units='kBtu/m**2/year') self.assertFalse(rule.minimum_valid(ureg.Quantity(0.05, "kBtu/ft**2/year"))) # ~ 0.538 kbtu/m2/year self.assertFalse(rule.maximum_valid(ureg.Quantity(15, "kBtu/ft**2/year"))) # ~ 161 kbtu/m2/year self.assertFalse(rule.minimum_valid(ureg.Quantity(5, "kBtu/m**2/year"))) self.assertFalse(rule.maximum_valid(ureg.Quantity(110, "kBtu/m**2/year")))
def test_incorrect_pint_unit_conversions(self): rule = Rule.objects.create(name='min_str_rule', data_type=Rule.TYPE_EUI, min=10, max=100, units='ft**2') # this should error out nicely with self.assertRaises(UnitMismatchError): self.assertFalse(rule.minimum_valid(ureg.Quantity(5, "kBtu/ft**2/year"))) with self.assertRaises(UnitMismatchError): self.assertFalse(rule.maximum_valid(ureg.Quantity(5, "kBtu/ft**2/year")))
def setUp(self): user_details = { 'username': '******', 'password': '******', 'email': '*****@*****.**', 'first_name': 'Test', 'last_name': 'User', } self.user = User.objects.create_user(**user_details) self.org_a, _, _ = create_organization(self.user) self.org_b, _, _ = create_organization(self.user) cycle_a = FakeCycleFactory(organization=self.org_a, user=self.user).get_cycle(name="Cycle Org A") cycle_b = FakeCycleFactory(organization=self.org_b, user=self.user).get_cycle(name="Cycle Org B") self.analysis_a = ( FakeAnalysisFactory(organization=self.org_a, user=self.user).get_analysis( name='Quite neat', service=Analysis.BSYNCR, ) ) view_factory_a = FakePropertyViewFactory(cycle=cycle_a, organization=self.org_a, user=self.user) self.property_views_a = [ view_factory_a.get_property_view( # override unitted fields so that hashes are correct site_eui=ureg.Quantity( float(view_factory_a.fake.random_int(min=50, max=600)), "kilobtu / foot ** 2 / year" ), gross_floor_area=ureg.Quantity( float(view_factory_a.fake.random_number(digits=6)), "foot ** 2" ), ) for i in range(2)] view_factory_b = FakePropertyViewFactory(cycle=cycle_b, organization=self.org_b, user=self.user) self.property_views_b = [ view_factory_b.get_property_view( # override unitted fields so that hashes are correct site_eui=ureg.Quantity( float(view_factory_b.fake.random_int(min=50, max=600)), "kilobtu / foot ** 2 / year" ), gross_floor_area=ureg.Quantity( float(view_factory_b.fake.random_number(digits=6)), "foot ** 2" ), ) for i in range(2)]
def test_rename_quantity_field_to_another_quantity_field_unsuccessful( self): # This should be unsuccessful because conversions don't exist between certain column units expected_data = [] original_column_count = Column.objects.count() new_col_name = 'site_eui' for i in range(1, 5): area = i * 100.5 self.property_state_factory.get_property_state( data_state=DATA_STATE_MATCHING, gross_floor_area=area) # Capture these pre-rename-attempt values expected_data.append(ureg.Quantity(area, "foot ** 2")) old_column = Column.objects.filter( column_name='gross_floor_area').first() result = old_column.rename_column(new_col_name, force=True) self.assertEqual(result, [ False, "The column data can't be converted to the new column due to conversion contraints (e.g., converting square feet to kBtu etc.)." ]) new_column_count = Column.objects.count() self.assertEqual(original_column_count, new_column_count) # check that the states' gross_floor_area values were unchanged results = list( PropertyState.objects.filter( organization=self.org).order_by('id').values_list( 'gross_floor_area', flat=True)) self.assertListEqual(results, expected_data)
def test_rename_quantity_field_to_another_quantity_field_success(self): expected_data = [] new_col_name = 'occupied_floor_area' for i in range(1, 5): area = i * 100.5 self.property_state_factory.get_property_state( data_state=DATA_STATE_MATCHING, gross_floor_area=area) # Capture the magnitude with default occupied_floor_area units expected_data.append(ureg.Quantity(area, "foot ** 2")) old_column = Column.objects.filter( column_name='gross_floor_area').first() result = old_column.rename_column(new_col_name, force=True) self.assertTrue(result) results = list( PropertyState.objects.filter( organization=self.org).order_by('id').values_list(new_col_name, flat=True)) self.assertListEqual(results, expected_data) # Check that gross_floor_areas were cleared for p in PropertyState.objects.all(): self.assertIsNone(p.gross_floor_area)
def test_rename_extra_data_field_to_quantity_field_unsuccessful(self): expected_data = [] original_column_count = Column.objects.count() new_col_name = 'gross_floor_area' for i in range(0, 2): # add a valid and invalid area area = (100 if i == 0 else "not a number") state = self.property_state_factory.get_property_state( data_state=DATA_STATE_MATCHING, extra_data={self.extra_data_column.column_name: area}) # Capture default gross_floor_areas expected_data.append( ureg.Quantity(state.gross_floor_area, "foot ** 2")) result = self.extra_data_column.rename_column(new_col_name, force=True) self.assertEqual(result, [ False, "The column data aren't formatted properly for the new column due to type constraints (e.g., Datatime, Quantities, etc.)." ]) new_column_count = Column.objects.count() self.assertEqual(original_column_count, new_column_count) # check that the states' gross_floor_area values were unchanged results = list( PropertyState.objects.filter( organization=self.org).order_by('id').values_list( 'gross_floor_area', flat=True)) self.assertListEqual(results, expected_data)
def create_travel_distances(new=False): # run to create travel details for the divisions if new: TravelDetails.objects.all().delete() for division_a in CountryDivision.objects.all(): for division_b in CountryDivision.objects.all().annotate( _distance=Distance(Centroid('geom'), Centroid( division_a.geom))): d = ureg.Quantity(division_b._distance.mi * ureg.mi) td = TravelDetails(distance=d, destination=division_a) td.save() division_b.distances.add(td) division_b.save() print(td)
def test_rename_extra_data_field_to_quantity_field_success(self): expected_data = [] new_col_name = 'gross_floor_area' for i in range(1, 5): area = i * 100.5 self.property_state_factory.get_property_state( data_state=DATA_STATE_MATCHING, extra_data={self.extra_data_column.column_name: area}) expected_data.append(ureg.Quantity(area, "foot ** 2")) result = self.extra_data_column.rename_column(new_col_name, force=True) self.assertTrue(result) results = list( PropertyState.objects.filter( organization=self.org).order_by('id').values_list( 'gross_floor_area', flat=True)) self.assertListEqual(results, expected_data)
def setUp(self): user_details = { 'username': '******', 'password': '******', 'email': '*****@*****.**', 'first_name': 'Test', 'last_name': 'User', } self.user = User.objects.create_user(**user_details) self.org, _, _ = create_organization(self.user) property_state = ( FakePropertyStateFactory(organization=self.org).get_property_state( # fields required for analysis latitude=39.76550841416409, longitude=-104.97855661401148)) self.analysis_property_view = ( FakeAnalysisPropertyViewFactory( organization=self.org, user=self.user).get_analysis_property_view( property_state=property_state, # analysis args name='Quite neat', service=Analysis.BSYNCR, )) self.meter = Meter.objects.create( property=self.analysis_property_view.property, source=Meter.PORTFOLIO_MANAGER, source_id="Source ID", type=Meter.ELECTRICITY_GRID, ) tz_obj = timezone(TIME_ZONE) self.meter_reading = MeterReading.objects.create( meter=self.meter, start_time=make_aware(datetime(2018, 1, 1, 0, 0, 0), timezone=tz_obj), end_time=make_aware(datetime(2018, 1, 2, 0, 0, 0), timezone=tz_obj), reading=12345, source_unit='kWh', conversion_factor=1.00) # # Setup more properties with linked meters with 12 valid meter readings. # These properties, unmodified, should successfully run thorugh the bsyncr pipeline # property_view_factory = FakePropertyViewFactory(organization=self.org) self.good_property_views = [] self.num_good_property_views = 3 for i in range(self.num_good_property_views): pv = property_view_factory.get_property_view( # fields required for analysis latitude=39.76550841416409, longitude=-104.97855661401148, # override unitted fields so that hashes are correct site_eui=ureg.Quantity( float( property_view_factory.fake.random_int(min=50, max=600)), "kilobtu / foot ** 2 / year"), gross_floor_area=ureg.Quantity( float(property_view_factory.fake.random_number(digits=6)), "foot ** 2"), ) self.good_property_views.append(pv) self.analysis_b = (FakeAnalysisFactory(organization=self.org, user=self.user).get_analysis( name='Good Analysis', service=Analysis.BSYNCR)) self.good_meters = [] for i in range(self.num_good_property_views): self.good_meters.append( Meter.objects.create( property=self.good_property_views[i].property, source=Meter.PORTFOLIO_MANAGER, source_id="Source ID", type=Meter.ELECTRICITY_GRID, )) tz_obj = timezone(TIME_ZONE) for j in range(1, 13): MeterReading.objects.create( meter=self.good_meters[i], start_time=make_aware(datetime(2019, j, 1, 0, 0, 0), timezone=tz_obj), end_time=make_aware(datetime(2019, j, 28, 0, 0, 0), timezone=tz_obj), reading=12345, source_unit='kWh', conversion_factor=1.00)