Ad
Code
Diff
  • from timeit import timeit
    from math import floor
    
    # 1. Can you implement another optimised function (sum_even_numbers2) using purely native python?
    #    Can you timeit to show it's faster and describe why it is.
    #    Can you also state if there are any pros or cons to how it is implemented?
    
    # 2. Can you implement another optimised function (sum_even_numbers3) using third party packages?
    #    Can you timeit to show it's faster and describe why it is.
    #    Can you also state if there are any pros or cons to how it is implemented?
    
    def sum_even_numbers1(numbers: list[int]) -> int:
        total = 0
        for num in numbers:
            if floor(num/2) == num/2:
                total += num
        return total
    
    # Floating point calculation is not required
    # Only one division required
    # float required 32byte, memory heavy
    def sum_even_numbers2(numbers: list[int]) -> int:
        total = 0
        for num in numbers:
            if num%2 == 0:
                total += num
        return total
    
    # needs to call that function from memory
    def sum_even_numbers3(numbers: list[int]) -> int:
        return sum(filter(lambda x: x > 0 and x%2 == 0, numbers))
        
    • from timeit import timeit
    • from math import floor
    • # 1. Can you implement another optimised function (sum_even_numbers2) using purely native python?
    • # Can you timeit to show it's faster and describe why it is.
    • # Can you also state if there are any pros or cons to how it is implemented?
    • # 2. Can you implement another optimised function (sum_even_numbers3) using third party packages?
    • # Can you timeit to show it's faster and describe why it is.
    • # Can you also state if there are any pros or cons to how it is implemented?
    • def sum_even_numbers1(numbers: list[int]) -> int:
    • total = 0
    • for num in numbers:
    • if floor(num/2) == num/2:
    • total += num
    • return total
    • # Floating point calculation is not required
    • # Only one division required
    • # float required 32byte, memory heavy
    • def sum_even_numbers2(numbers: list[int]) -> int:
    • total = 0
    • for num in numbers:
    • if num%2 == 0:
    • total += num
    • return total
    • # needs to call that function from memory
    • def sum_even_numbers3(numbers: list[int]) -> int:
    • return sum(filter(lambda x: x > 0 and x%2 == 0, numbers))
Code
Diff
  • """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.
        """
        latest = get_latest_snapshot(d)
        truck_furthest_west = ""
        x = latest[list(latest.keys())[0]]['position']['x']
        for item in latest:
            if latest[item]['position']['x'] < x:
                x = latest[item]['position']['x']
                truck_furthest_west = item
        return truck_furthest_west
    
    def get_latest_snapshot(d: defaultdict) -> dict[str, Any]:
        """
        Return a snapshot of the latest positional updates for the
        equipment.
        """
        temp = defaultdict(list)
        
        for item in d:
            df = pd.DataFrame(d[item])
            temp[item] = df.iloc[-1].to_dict()
        return temp
    
    def get_counts(d: defaultdict) -> dict[str, int]:
        """Return a dict of trucks and the times they have provided updates."""
        temp = defaultdict(list)
        for item in d:
            temp[item] = len(d[item])
        return temp
    
    def calculate_speeds(d: defaultdict) -> defaultdict[str, Any]:
        """Return a dict of equipment and the speeds they are travelling at."""
        df = pd.json_normalize(d, sep='_')
        temp = defaultdict(list)
        for item in d:
            df = pd.json_normalize(d[item], sep='_')
            diff = df.diff()
            coords = [c for c in df.columns if not 'timestamp' in c]
            df['speed'] = np.linalg.norm(diff[coords], axis=1)/diff['timestamp'].dt.seconds
            temp[item] = df[['timestamp', 'speed']]
        print(temp)
        pass
    
    
    
    • """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.
    • """
    • pass
    • latest = get_latest_snapshot(d)
    • truck_furthest_west = ""
    • x = latest[list(latest.keys())[0]]['position']['x']
    • for item in latest:
    • if latest[item]['position']['x'] < x:
    • x = latest[item]['position']['x']
    • truck_furthest_west = item
    • return truck_furthest_west
    • def get_latest_snapshot(d: defaultdict) -> dict[str, Any]:
    • """
    • Return a snapshot of the latest positional updates for the
    • equipment.
    • """
    • pass
    • temp = defaultdict(list)
    • for item in d:
    • df = pd.DataFrame(d[item])
    • temp[item] = df.iloc[-1].to_dict()
    • return temp
    • def get_counts(d: defaultdict) -> dict[str, int]:
    • """Return a dict of trucks and the times they have provided updates."""
    • pass
    • temp = defaultdict(list)
    • for item in d:
    • temp[item] = len(d[item])
    • return temp
    • def calculate_speeds(d: defaultdict) -> defaultdict[str, Any]:
    • """Return a dict of equipment and the speeds they are travelling at."""
    • df = pd.json_normalize(d, sep='_')
    • temp = defaultdict(list)
    • for item in d:
    • df = pd.json_normalize(d[item], sep='_')
    • diff = df.diff()
    • coords = [c for c in df.columns if not 'timestamp' in c]
    • df['speed'] = np.linalg.norm(diff[coords], axis=1)/diff['timestamp'].dt.seconds
    • temp[item] = df[['timestamp', 'speed']]
    • print(temp)
    • pass