From 79c824ac8a379822b31a8ef237759632f181bc83 Mon Sep 17 00:00:00 2001 From: Ashly Date: Mon, 1 Dec 2025 15:46:40 +0200 Subject: [PATCH] I tried --- .vscode/settings.json | 11 +++++ __pycache__/analytics.cpython-313.pyc | Bin 0 -> 5904 bytes __pycache__/test_analytics.cpython-313.pyc | Bin 0 -> 9535 bytes analytics.py | 55 ++++++++++++++++++--- 4 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 .vscode/settings.json create mode 100644 __pycache__/analytics.cpython-313.pyc create mode 100644 __pycache__/test_analytics.cpython-313.pyc diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..f0064cb --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,11 @@ +{ + "python.testing.unittestArgs": [ + "-v", + "-s", + ".", + "-p", + "*test*.py" + ], + "python.testing.pytestEnabled": false, + "python.testing.unittestEnabled": true +} \ No newline at end of file diff --git a/__pycache__/analytics.cpython-313.pyc b/__pycache__/analytics.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3226b1d5e5ecb39413b0e5237aee69d2ef208121 GIT binary patch literal 5904 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 U<9AQ4bf@X|CoYQKtNrNz0moP!jQ{`u literal 0 HcmV?d00001 diff --git a/analytics.py b/analytics.py index 8acadc8..179a525 100644 --- a/analytics.py +++ b/analytics.py @@ -1,3 +1,4 @@ +import statistics # ========================================== # SECTION A: LIST PROCESSING # ========================================== @@ -17,9 +18,12 @@ def filter_sales_above_threshold(sales: list, threshold: int): - Use a loop or list comprehension """ # TODO: Write your code here - pass - - + new_list = [] + for i in sales: + if i >= threshold: + new_list.append(i) + return new_list +# print(filter_sales_above_threshold([100, 250, 75, 300], 150)) def count_product_codes(codes: list, prefix: str): """ QUESTION 2 @@ -33,7 +37,13 @@ def count_product_codes(codes: list, prefix: str): - Return 0 if no matches found """ # TODO: Write your code here - pass + count = 0 + for code in codes: + code = str(code) + if code.startswith(prefix): + count += 1 + return count +# print(count_product_codes(["PROD-001", "PROD-002", "SERV-001"], "PROD")) def calculate_moving_average(numbers: list, window_size: int): @@ -51,7 +61,13 @@ def calculate_moving_average(numbers: list, window_size: int): - Return 0.0 for empty list """ # TODO: Write your code here - pass + if numbers == []: + return float(0) + + new = numbers[-window_size:] + + return float(statistics.mean(new)) +# print(calculate_moving_average([], 3)) # ========================================== @@ -72,8 +88,25 @@ def get_top_seller(sales_data: dict): - If there's a tie, return the name that appears first alphabetically """ # TODO: Write your code here - pass + if sales_data == {}: + return "No Data" + sales = [] + length = len(sales_data.keys()) + sales =(sorted(sales_data.values())) + print(sales) + names = sorted(sales_data.keys()) + if len(names) == 1: + return names[0] + if sales[0] == sales[1]: + return names[0] + for name, sale in sales_data.items(): + if sale == sales[-1]: + return name + return name + + +print(get_top_seller({"Alice": 5000, "Bob": 7500, "Carol": 6000})) def merge_inventory(warehouse_a: dict, warehouse_b: dict): """ @@ -93,7 +126,15 @@ def merge_inventory(warehouse_a: dict, warehouse_b: dict): - Do NOT modify the original dictionaries """ # TODO: Write your code here - pass + new = {} + for key, value in warehouse_a.items(): + for key1, value1 in warehouse_b.items(): + if key == key1: + nv = value+ value1 + return new[k] +warehouse_a = {"PROD-001": 50, "PROD-002": 30} +warehouse_b = {"PROD-002": 20, "PROD-003": 40} +print(merge_inventory(warehouse_a,warehouse_b)) # ==========================================