Esempio n. 1
0
    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")))
Esempio n. 2
0
    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)]
Esempio n. 4
0
    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)
Esempio n. 5
0
    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)
Esempio n. 6
0
    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)
Esempio n. 7
0
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)
Esempio n. 8
0
    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)
Esempio n. 9
0
    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)