Ad

The Code section has some functions to build some data.

The Test Cases describe the requirements.

The requirements are, fill out the four functions described in the Code section such that the Test Cases pass. For reference, the four functions are:

  • find_furthest_west()
  • get_latest_snapshot()
  • get_counts()
  • calculate_speeds()

There is no right or wrong. Don't spend too long. You don't need to make the tests pass if you don't want to spend much time. You can use pseudocode instead. It's a springboard for discussion, nothing more or less. We might not even have time to go through code together anyway.

"""Test equipment positions."""
from __future__ import annotations
from collections import Counter, defaultdict
import datetime as dt
import math
import numpy as np
import pandas as pd
from typing import Any


def data_dict() -> defaultdict[str, Any]:
    """Return all equipment positions."""
    d = defaultdict(list)
    d['T123'].append({'position': {'x': 42, 'y': 24, 'z': 0.42}, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)})
    d['T456'].append({'position': {'x': 21.0, 'y': 34, 'z': 0.289}, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)})
    d['T789'].append({'position': {'x': 17, 'y': 39, 'z': 0.789}, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)})
    d['T456'].append({'position': {'x': 91.0, 'y': 114, 'z': 0.489}, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=3)})
    d['T123'].append({'position': {'x': 43, 'y': 25, 'z': 0.43}, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=1)})
    d['T789'].append({'position': {'x': 19., 'y': 79, 'z': 0.991}, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=6)})
    d['T123'].append({'position': {'x': 46, 'y': 29, 'z': 0.44}, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=2)})
    d['T456'].append({'position': {'x': 24.0, 'y': 37, 'z': 0.297}, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=4)})
    d['T123'].append({'position': {'x': 49.0, 'y': 32, 'z': 0.451}, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=3)})
    d['T789'].append({'position': {'x': 23., 'y': 81, 'z': 1.103}, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=7)})
    return d


def latest_snapshot() -> dict[str, Any]:
    """Return a snapshot of latest equipment."""
    return {
        'T123': {'position': {'x': 49.0, 'y': 32, 'z': 0.451}, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=3)},
        'T456': {'position': {'x': 24.0, 'y': 37, 'z': 0.297}, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=4)},
        'T789': {'position': {'x': 23.0, 'y': 81, 'z': 1.103}, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=7)},
    }


def counts() -> dict[str, int]:
    """Return counts per equipment."""
    return {
        'T123': 4,
        'T456': 3,
        'T789': 3
    }


def speeds() -> defaultdict[str, Any]:
    """Return speeds of equipment."""
    d = defaultdict(list)
    d['T123'].append({'speed': 4.242654947082074, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=3)})
    d['T123'].append({'speed': 5.00000999999, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=2)})
    d['T123'].append({'speed': 1.4142489172702237, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=1)})
    d['T123'].append({'speed': None, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)})
    d['T456'].append({'speed': 102.0687849638664, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=4)})
    d['T456'].append({'speed': 35.43388209045123, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=3)})
    d['T456'].append({'speed': None, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)})
    d['T789'].append({'speed': 4.473538196997986, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=7)})
    d['T789'].append({'speed': 6.6750796998987205, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=6)})
    d['T789'].append({'speed': None, 'timestamp': dt.datetime(2022, 1, 1, hour=12, minute=0, second=0)})
    return d

  
def find_furthest_west(d: defaultdict) -> str:
    """
    Find the name of the truck that is furthest west. That is,
    the truck with the smallest easting position component.
    """
    return ''

def get_latest_snapshot(d: defaultdict) -> dict[str, Any]:
    """
    Return a snapshot of the latest positional updates for the
    equipment.
    """
    return {}

def get_counts(d: defaultdict) -> dict[str, int]:
    """Return a dict of trucks and the times they have provided updates."""
    return {}

  
def calculate_speeds(d: defaultdict) -> defaultdict[str, Any]:
    """Return a dict of equipment and the speeds they are travelling at."""
    return defaultdict(list)