← Back to Projects
DATA / DATABASES / INTERACTIVE DASHBOARD

Animal Rescue Dashboard

An interactive data dashboard built for the fictional animal rescue organization Grazioso Salvare, combining MongoDB-backed animal records, dynamic filtering, visual analytics, and geographic mapping to support rescue-specific decision making.

Python MongoDB PyMongo Pandas Dash Plotly Express Dash Leaflet Data Visualization
ORGANIZATION Grazioso Salvare
DATA LAYER MongoDB / PyMongo
INTERFACE Dash + Plotly + Leaflet

Turning shelter data into an operational dashboard.

This application was developed for Grazioso Salvare, an animal rescue organization focused on identifying animals suited for Water Rescue, Mountain or Wilderness Rescue, and Disaster or Individual Tracking.

Rather than presenting shelter records as a static dataset, the dashboard turns those records into an interactive interface where users can filter animals according to rescue requirements and inspect the resulting data through several synchronized views.

The core design problem was not simply displaying data. It was making the same underlying dataset useful through filtering, tabular exploration, visualization, and geography at the same time.

MongoDB provides the data-storage layer, while Python, Pandas, Dash, Plotly Express, and Dash Leaflet form the application and visualization layers.

Designing the interface around real filtering goals.

The dashboard is organized around three rescue categories, each representing a different operational need.

WATER RESCUE

Filters the available animal records according to characteristics relevant to water-rescue work.

MOUNTAIN / WILDERNESS

Produces a dataset targeted toward animals suited for wilderness-oriented rescue operations.

DISASTER / TRACKING

Supports exploration of animals associated with disaster-response or individual-tracking requirements.

RESET

Restores the unfiltered dataset so users can return to the full collection without reloading the application.

Connecting persisted data to multiple interactive views.

The application follows a simple data pipeline where shelter records move from source data into MongoDB and are then transformed for use by the dashboard.

SHELTER DATASET Animal records begin as structured shelter outcome data.
PANDAS Python prepares records for transformation and application use.
MONGODB Animal records are stored in a flexible NoSQL collection.
DASH CALLBACK User-selected filters determine which records should be shown.
TABLE + CHART + MAP The filtered dataset drives all major dashboard components.

Moving structured shelter records into MongoDB.

Pandas was used to read the animal shelter dataset and transform its rows into dictionary-style records that could be inserted into MongoDB.

DATA LOADING PYTHON / PANDAS
df = pd.read_csv("aac_shelter_outcomes.csv")

data_dict = df.to_dict("records")

collection.insert_many(data_dict)

This approach provided a clear transition from tabular CSV data to document-based database records.

The project also required working with missing values and standardizing location information so downstream dashboard components could operate on reliable data.

Using a flexible document model for animal records.

MongoDB served as the primary persistence layer for the rescue records. Its document model provided a practical fit for animal data containing attributes such as breed, name, rescue-related characteristics, and location coordinates.

PyMongo provided the connection between the Python application and MongoDB, allowing the project to work with the dataset through database operations rather than treating the CSV file as the final application data source.

CREATE

Import animal records into the MongoDB collection.

READ

Retrieve records used by the dashboard and rescue filters.

UPDATE

Work with stored records through database-backed operations.

DELETE

Support the full set of CRUD concepts required for managing persistent records.

Giving users several ways to understand the same data.

The dashboard presents animal information through multiple coordinated components rather than relying on a single visualization.

RESCUE FILTERS

Radio controls let users switch between rescue categories or reset the dashboard.

DATA TABLE

A paginated and sortable table supports detailed inspection of individual animal records.

PIE CHART

Breed distribution is summarized visually for the active result set.

GEOLOCATION MAP

Animal coordinates are translated into map markers with contextual information.

Synchronizing multiple outputs from one user action.

Dash callbacks form the connection between user interaction and dashboard state.

When a user selects a rescue category, the callback determines which dataset should be active and uses that result to rebuild the table, chart, and map.

DASHBOARD CALLBACK DASH
@app.callback(
  [Output('datatable-id', 'data'),
   Output('graph-id', 'figure'),
   Output('map-id', 'children')],
  [Input('filter-type', 'value')]
)
def update_dashboard(filter_type):
    if filter_type == 'reset':
        data = df
    else:
        data = get_filtered_data(filter_type)

    fig = px.pie(
        data,
        names='breed',
        title='Preferred Animals'
    )

    markers = [
        dl.Marker(
            position=[
                row['location_lat'],
                row['location_long']
            ],
            children=[
                dl.Tooltip(row['breed']),
                dl.Popup(row['name'])
            ]
        )
        for _, row in data.iterrows()
    ]

    return data.to_dict('records'), fig, markers

The important architectural idea is that the three visual components do not maintain independent filter states. They are all derived from the same filtered dataset.

Preserving access to the underlying records.

Charts provide summaries, but operational users may still need the actual records behind those summaries.

The interactive data table provides that detailed view while supporting pagination and sorting. This lets the dashboard balance high-level visual analysis with record-level inspection.

A useful dashboard should not force users to choose between seeing patterns and seeing the data that produced them.

Summarizing breed distribution within filtered results.

Plotly Express is used to create a pie chart from the currently active dataset.

Because the chart is generated from filtered records rather than a static copy of the original data, its distribution changes when the user selects a different rescue category.

That makes the visualization useful as a comparative tool: the user can see how the breed composition differs across operational rescue requirements.

Adding geography as another dimension of the dataset.

Dash Leaflet translates latitude and longitude values into geographic markers so users can inspect where filtered animal records are located.

Each generated marker includes contextual information through tooltips and popups, including details such as breed and animal name.

FILTER RECORDS Select only animals relevant to the current rescue mode.
READ COORDINATES Use stored latitude and longitude values for each row.
CREATE MARKERS Convert each valid location into a Leaflet map marker.
ATTACH CONTEXT Add tooltips and popups so markers remain informative.

Keeping the dataset clean enough for every component to trust it.

One challenge was that several downstream features depended on consistent data.

Missing values or inconsistent location information could affect the table, visualization, or map differently. Cleaning and standardizing the data therefore became an important part of making the overall interface reliable.

MISSING VALUES

Incomplete data needed to be handled before it reached visualization logic.

LOCATION FIELDS

Geographic values needed sufficient consistency for map markers.

FILTER OUTPUT

Rescue filters needed to produce predictable subsets of the dataset.

COMPONENT SYNC

Every visual component needed to represent the same active filter state.

Seeing the dashboard change across rescue modes.

These views show the interface in its default state and after applying each rescue-specific filter.

INITIAL DASHBOARD
Initial animal rescue dashboard data table
Initial dashboard state showing the broader animal dataset.
Initial animal rescue dashboard graph and map
Initial visualization and geographic map before rescue-specific filtering.
WATER RESCUE
Water Rescue filtered animal dashboard
Animal records after applying the Water Rescue filter.
Water Rescue dashboard graph and map
Breed distribution and geographic results for Water Rescue.
MOUNTAIN / WILDERNESS RESCUE
Mountain and Wilderness Rescue filtered animal dashboard
Animal records after applying the Mountain/Wilderness filter.
Mountain and Wilderness Rescue dashboard graph and map
Visualization and geographic results for wilderness-oriented rescue operations.
DISASTER / INDIVIDUAL TRACKING
Disaster and Individual Tracking filtered animal dashboard
Animal records after applying the Disaster/Individual Tracking filter.
Disaster and Individual Tracking dashboard graph and map
Visualization and geographic results for disaster or tracking operations.

Designing data tools for users who should not need to understand the database.

One of the important lessons from this project was that the technical structure of a data application should remain largely invisible to the person using it.

A user should not need to understand MongoDB queries, Pandas transformations, or callback mechanics to answer a practical question about the rescue dataset.

The interface becomes useful when complex data operations are reduced to understandable actions: choose a rescue type, inspect the records, compare the distribution, and explore the locations.

Connecting database development, data processing, and interface design.

This project strengthened my understanding of how data moves through an application from storage to presentation.

MongoDB provided persistence, Pandas supported data transformation, Dash connected user interaction to application state, Plotly summarized the active data visually, and Leaflet added geographic context.

Working across those layers reinforced the importance of keeping the data consistent throughout the application. A filter was not complete simply because the table changed; every dependent visualization had to update from the same source of truth.

A complete data-driven interface built around operational questions.

The finished dashboard combines persistence, querying, transformation, visualization, mapping, and interactive UI behavior into one application.

Imported shelter outcome data into MongoDB.
Used Pandas to prepare and transform application data.
Worked with MongoDB through PyMongo.
Applied CRUD concepts to persistent animal records.
Built an interactive Dash application.
Added rescue-specific filtering controls.
Created a sortable and paginated data table.
Visualized breed distribution with Plotly Express.
Mapped animal locations using Dash Leaflet.
Synchronized multiple UI components through callbacks.
Addressed missing and inconsistent data.
Designed the dashboard with non-technical users in mind.

The project gave me practical experience building an application in which database decisions, data quality, backend logic, visualization, and user experience all affect one another.

ANIMAL RESCUE DASHBOARD / DATA • MAPPING • INTERACTION