Skip to content

Print world examples

print_world_examples(world)

Print examples of the created world to help users understand the data.

Parameters:

Name Type Description Default
world

World object containing geography, population, and venues

required
Source code in may/stats/print_world_examples.py
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
def print_world_examples(world):
    """
    Print examples of the created world to help users understand the data.

    Args:
        world: World object containing geography, population, and venues
    """
    geo = world.geography
    venues = world.venues
    population = world.population
    logger.info("")
    logger.info("=" * 60)
    logger.info("EXAMPLES")
    logger.info("=" * 60)

    # Example 1: Show geographical hierarchy
    logger.info("")
    logger.info("1. Geographical Hierarchy:")
    all_units = geo.get_all_units_list()
    if all_units:
        # Get an example SGU
        sgu_units = [u for u in all_units if u.level == "SGU"]
        if sgu_units:
            example_sgu = sgu_units[0]
            logger.info(f"   SGU Example: {example_sgu}")
            logger.info(f"   - Coordinates: {example_sgu.coordinates}")
            if example_sgu.parent:
                logger.info(f"   - Parent MGU: {example_sgu.parent.name}")
                if example_sgu.parent.parent:
                    logger.info(f"   - Parent LGU: {example_sgu.parent.parent.name}")

        # Get an example MGU with venues
        mgu_with_venues = [u for u in all_units if u.level == "MGU" and len(u.venues) > 0]
        if mgu_with_venues:
            example_mgu = mgu_with_venues[0]
            logger.info("")
            logger.info(f"   MGU Example: {example_mgu}")
            logger.info(f"   - Has {len(example_mgu.children)} SGU children")
            logger.info(f"   - Has {len(example_mgu.venues)} venues")

    # Example 2: Show venues
    logger.info("")
    logger.info("2. Venue Examples:")
    try:
        venue_types = venues.get_venue_types()
        for vtype in sorted(venue_types):  # Show all types
            venues_of_type = venues.get_venues_by_type(vtype)
            if venues_of_type:
                example_venue = random.choice(venues_of_type)
                logger.info(f"   {vtype.capitalize()}: {example_venue.name}")
                logger.info(f"   - Located in: {example_venue.geographical_unit.name} ({example_venue.geographical_unit.level})")
                if example_venue.coordinates:
                    logger.info(f"   - Coordinates: {example_venue.coordinates}")
                if example_venue.properties:
                    # Show first 2 properties
                    props = list(example_venue.properties.items())
                    for key, value in props:
                        logger.info(f"   - {key}: {value}")
                # Show membership
                if example_venue.subsets:
                    for key, value in example_venue.subsets.items():
                        logger.info(f"   - Number of assigned {key} =  {value.num_members}")
    except:
        logger.info("Failed: Could not print venue examples")

    # Example 3: Show how to query
    logger.info("")
    logger.info("3. Population Examples:")
    try:
        stats = population.get_statistics()
        if stats:
            logger.info(f"   Total population: {stats['total_population']:,}")
            logger.info(f"   Mean age: {stats['mean_age']:.1f} years")
            logger.info(f"   Median age: {stats['median_age']:.1f} years")
            logger.info(f"   Sex distribution:")
            for sex, count in stats['sex_distribution'].items():
                pct = 100 * count / stats['total_population']
                logger.info(f"     - {sex}: {count:,} ({pct:.1f}%)")
            logger.info(f"   Activity distribution:")
            for activity, count in sorted(stats['activity_counts'].items()):
                logger.info(f"     - {activity}: {count:,}")

            # Show example people
            logger.info("")
            logger.info("   Example people:")
            for person in random.choices(population.get_all_people(), k=5):
                logger.info(f"   {person}")
                logger.info(f"    - Activities: {', '.join(person.activities)}")
                logger.info(f"    - Activity map:")
                for activity, place in person.activity_map.items():
                    logger.info(f"        ~ {activity} : {place} ")
                logger.info(f"    - Properties:")                
                for prop, propy in person.properties.items():
                    logger.info(f"        ~ {prop} : {propy} ")
    except:
        logger.info("Failed: Could not print population statistics")

    logger.info("")
    logger.info("4. Household Examples:")
    try:
        venue_stats = StatMakerVenues(venues)
        venue_stats.print_lots_of_stats('household')
        venue_stats.print_examples('household')
        venue_stats.print_extremes('household')

        number_of_empty_houses = 0
        for v in venues.get_venues_by_type('household'):
            if v.num_members == 0:
                number_of_empty_houses += 1
        logger.info(f"Number of empty houses = {number_of_empty_houses} out of {len(venues.get_venues_by_type('household'))}")

        # if world.households and world.households.households:
        #     logger.info(f"   Total households: {len(world.households.households)}")
        #     logger.info(f"   Allocation rate: {len(world.households.allocated_people) / max(sum(len(p) for p in world.households.person_pool_by_area.values()), 1) * 100:.1f}%")
        #     logger.info("")
        #     logger.info("   Example households:")
        #     for household in random.choices(world.households.households, k=5):
        #         composition = household.get_composition()
        #         logger.info(f"   Household {household.id} in {household.geographical_unit.name}")
        #         logger.info(f"     - Size: {household.size()} people")
        #         logger.info(f"     - Composition: {composition}")
        #         if household.properties.get('original_pattern'):
        #             logger.info(f"     - Pattern: {household.properties['original_pattern']}")
    except:
        logger.info("Failed: could not print household examples")


    try:    
        logger.info("")
        logger.info("5. Query Examples:")
        for key in venues.get_venue_types():
            logger.info("")
            logger.info("   # Get all {}s".format(key))
            all_venues = venues.get_venues_by_type(key)
            logger.info(f"   venues.get_venues_by_type({key}) -> {len(all_venues)} {key}s")

        logger.info("")
        logger.info("   # Get venues in a specific area")
        mgu_with_venues = [u for u in all_units if u.level == "MGU" and len(u.venues) > 0]
        if mgu_with_venues:
            unit_venues = mgu_with_venues[0].venues
            logger.info(f"   geo.get_unit('{mgu_with_venues[0].name}').venues -> {len(unit_venues)} venues")
            if unit_venues:
                logger.info(f"      e.g., {unit_venues[0].name} ({unit_venues[0].type})")

        logger.info("")
        logger.info("   # Get people by activity")
        workers = population.get_people_by_activity("work")
        logger.info(f"   population.get_people_by_activity('work') -> {len(workers)} people")

        logger.info("")
        logger.info("   # Get people by housed or not")
        n=0
        for p in population.get_people_by_activity("home"):
            if p.activity_map['home']:
                n+=1
        logger.info(f"   population.get_people_by_activity('home') -> {n} people out of {len(population)} with 'home' activity set")
    except:
        logger.info("Failed: Could not do query examples")

    # logger.info("")
    # logger.info("   # Get person's household")
    # if world.households and world.households.allocated_people:
    #     example_person_id = next(iter(world.households.allocated_people))
    #     example_person = next((p for p in population.get_all_people() if p.id == example_person_id), None)
    #     if example_person and hasattr(example_person, 'residence') and example_person.residence:
    #         logger.info(f"   person.residence -> Household {example_person.residence.id}")
    #         logger.info(f"      Size: {example_person.residence.size()}, Composition: {example_person.residence.get_composition()}")

    logger.info("")
    logger.info("=" * 60)