From eca27b31401ec81109d8693a6714115e5635322e Mon Sep 17 00:00:00 2001 From: MuslemRahimi Date: Mon, 21 Oct 2024 18:02:19 +0200 Subject: [PATCH] update metrics --- app/cron_business_metrics.py | 53 ++++++++++++-- app/test.py | 136 ++++++++++++++++++++++++----------- 2 files changed, 140 insertions(+), 49 deletions(-) diff --git a/app/cron_business_metrics.py b/app/cron_business_metrics.py index b7ad4e1..315d0eb 100644 --- a/app/cron_business_metrics.py +++ b/app/cron_business_metrics.py @@ -150,6 +150,40 @@ def compute_q4_results(dataset): def generate_revenue_dataset(dataset): + # Find all unique names and dates + all_dates = sorted(set(item['date'] for item in dataset)) + all_names = sorted(set(item['name'] for item in dataset)) + + # Check and fill missing combinations at the beginning + name_date_map = defaultdict(lambda: defaultdict(lambda: None)) + for item in dataset: + name_date_map[item['name']][item['date']] = item['value'] + + # Ensure all names have entries for all dates + for name in all_names: + for date in all_dates: + if date not in name_date_map[name]: + dataset.append({'name': name, 'date': date, 'value': None}) + + # Clean and process the dataset values + processed_dataset = [] + for item in dataset: + if item['value'] not in (None, '', 0): + processed_dataset.append({ + 'name': item['name'], + 'date': item['date'], + 'value': int(float(item['value'])) + }) + else: + processed_dataset.append({ + 'name': item['name'], + 'date': item['date'], + 'value': None + }) + + dataset = processed_dataset + + name_replacements = { "datacenter": "Data Center", "professionalvisualization": "Visualization", @@ -169,8 +203,13 @@ def generate_revenue_dataset(dataset): "servicesandother": "Services & Other", "automotiveregulatorycredits": "Regulatory Credits", "intelligentcloud": "Intelligent Cloud", - "productivityandbusinessprocesses": "Productivity & Business" + "productivityandbusinessprocesses": "Productivity & Business", + "searchandnewsadvertising": "Advertising", + "linkedincorporation": "LinkedIn", + "morepersonalcomputing": "More Personal Computing", + "serviceother": "Service Other", } + # Filter out unwanted categories excluded_names = {'automotiveleasing ','officeproductsandcloudservices','serverproductsandcloudservices','automotiverevenues','automotive','computeandnetworking','graphics','gpu','automotivesegment','energygenerationandstoragesales','energygenerationandstorage','automotivesaleswithoutresalevalueguarantee','salesandservices','compute', 'networking', 'cloudserviceagreements', 'digital', 'allother', 'preownedvideogameproducts'} dataset = [revenue for revenue in dataset if revenue['name'].lower() not in excluded_names] @@ -189,7 +228,7 @@ def generate_revenue_dataset(dataset): # Group by name and calculate total value name_totals = defaultdict(int) for item in dataset: - name_totals[item['name']] += item['value'] + name_totals[item['name']] += item['value'] if item['value'] != None else 0 # Sort names by total value and get top 5, ensuring excluded names are not considered top_names = sorted( @@ -203,7 +242,8 @@ def generate_revenue_dataset(dataset): dataset = [item for item in dataset if item['name'] in top_names] # Sort the dataset - dataset.sort(key=lambda item: (datetime.strptime(item['date'], '%Y-%m-%d'), item['value']), reverse=True) + dataset.sort(key=lambda item: (datetime.strptime(item['date'], '%Y-%m-%d'), item['value'] if item['value'] != None else 0), reverse=True) + # Process the data into the required format result = {} @@ -216,7 +256,7 @@ def generate_revenue_dataset(dataset): # Convert the result dictionary to a list res_list = list(result.values()) - + print(res_list) # Add value growth (assuming add_value_growth function exists) res_list = add_value_growth(res_list) @@ -362,9 +402,8 @@ def run(symbol): for old, new in replacements.items(): name = name.replace(old, new) - print(name,column_name) # Determine the target list and the name transformation logic - if symbol in ['META','NVDA','AAPL','GME']: + if symbol in ['MSFT','META','NVDA','AAPL','GME']: column_list = ["srt:ProductOrServiceAxis"] else: column_list = ["srt:ProductOrServiceAxis", "us-gaap:StatementBusinessSegmentsAxis"] @@ -397,6 +436,6 @@ if __name__ == "__main__": run('GME', custom_order) ''' - for symbol in ['META']: #['TSLA','NVDA','AAPL','GME']: + for symbol in ['MSFT']: #['TSLA','NVDA','AAPL','GME']: run(symbol) diff --git a/app/test.py b/app/test.py index 4dbf7cf..da766d9 100644 --- a/app/test.py +++ b/app/test.py @@ -134,70 +134,122 @@ def compute_q4_results(dataset): return dataset -revenue_sources = [{'name': 'DataCenter', 'value': '26272000000', 'date': '2024-07-28'}, {'name': 'Compute', 'value': '22604000000', 'date': '2024-07-28'}, {'name': 'Networking', 'value': '3668000000', 'date': '2024-07-28'}, {'name': 'Gaming', 'value': '2880000000', 'date': '2024-07-28'}, {'name': 'ProfessionalVisualization', 'value': '454000000', 'date': '2024-07-28'}, {'name': 'Automotive', 'value': '346000000', 'date': '2024-07-28'}, {'name': 'OEMAndOther', 'value': '88000000', 'date': '2024-07-28'}, {'name': 'DataCenter', 'value': '22563000000', 'date': '2024-04-28'}, {'name': 'Compute', 'value': '19392000000', 'date': '2024-04-28'}, {'name': 'Networking', 'value': '3171000000', 'date': '2024-04-28'}, {'name': 'Gaming', 'value': '2647000000', 'date': '2024-04-28'}, {'name': 'ProfessionalVisualization', 'value': '427000000', 'date': '2024-04-28'}, {'name': 'Automotive', 'value': '329000000', 'date': '2024-04-28'}, {'name': 'OEMAndOther', 'value': '78000000', 'date': '2024-04-28'}, {'name': 'DataCenter', 'value': '47525000000', 'date': '2024-01-28'}, {'name': 'Gaming', 'value': '10447000000', 'date': '2024-01-28'}, {'name': 'ProfessionalVisualization', 'value': '1553000000', 'date': '2024-01-28'}, {'name': 'Automotive', 'value': '1091000000', 'date': '2024-01-28'}, {'name': 'OEMAndOther', 'value': '306000000', 'date': '2024-01-28'}, {'name': 'DataCenter', 'value': '14514000000', 'date': '2023-10-29'}, {'name': 'Gaming', 'value': '2856000000', 'date': '2023-10-29'}, {'name': 'ProfessionalVisualization', 'value': '416000000', 'date': '2023-10-29'}, {'name': 'Automotive', 'value': '261000000', 'date': '2023-10-29'}, {'name': 'OEMAndOther', 'value': '73000000', 'date': '2023-10-29'}, {'name': 'DataCenter', 'value': '10323000000', 'date': '2023-07-30'}, {'name': 'Gaming', 'value': '2486000000', 'date': '2023-07-30'}, {'name': 'ProfessionalVisualization', 'value': '379000000', 'date': '2023-07-30'}, {'name': 'Automotive', 'value': '253000000', 'date': '2023-07-30'}, {'name': 'OEMAndOther', 'value': '66000000', 'date': '2023-07-30'}, {'name': 'CloudServiceAgreements', 'value': '2430000000', 'date': '2023-04-30'}, {'name': 'DataCenter', 'value': '4284000000', 'date': '2023-04-30'}, {'name': 'Gaming', 'value': '2240000000', 'date': '2023-04-30'}, {'name': 'ProfessionalVisualization', 'value': '295000000', 'date': '2023-04-30'}, {'name': 'Automotive', 'value': '296000000', 'date': '2023-04-30'}, {'name': 'OEMAndOther', 'value': '77000000', 'date': '2023-04-30'}, {'name': 'DataCenter', 'value': '15005000000', 'date': '2023-01-29'}, {'name': 'Gaming', 'value': '9067000000', 'date': '2023-01-29'}, {'name': 'ProfessionalVisualization', 'value': '1544000000', 'date': '2023-01-29'}, {'name': 'Automotive', 'value': '903000000', 'date': '2023-01-29'}, {'name': 'OEMAndOther', 'value': '455000000', 'date': '2023-01-29'}, {'name': 'DataCenter', 'value': '3833000000', 'date': '2022-10-30'}, {'name': 'Gaming', 'value': '1574000000', 'date': '2022-10-30'}, {'name': 'ProfessionalVisualization', 'value': '200000000', 'date': '2022-10-30'}, {'name': 'Automotive', 'value': '251000000', 'date': '2022-10-30'}, {'name': 'OEMAndOther', 'value': '73000000', 'date': '2022-10-30'}, {'name': 'Gaming', 'value': '2042000000', 'date': '2022-07-31'}, {'name': 'DataCenter', 'value': '3806000000', 'date': '2022-07-31'}, {'name': 'ProfessionalVisualization', 'value': '496000000', 'date': '2022-07-31'}, {'name': 'Automotive', 'value': '220000000', 'date': '2022-07-31'}, {'name': 'OEMAndOther', 'value': '140000000', 'date': '2022-07-31'}, {'name': 'Gaming', 'value': '3620000000', 'date': '2022-05-01'}, {'name': 'DataCenter', 'value': '3750000000', 'date': '2022-05-01'}, {'name': 'ProfessionalVisualization', 'value': '622000000', 'date': '2022-05-01'}, {'name': 'Automotive', 'value': '138000000', 'date': '2022-05-01'}, {'name': 'OEMAndOther', 'value': '158000000', 'date': '2022-05-01'}, {'name': 'Gaming', 'value': '12462000000', 'date': '2022-01-30'}, {'name': 'DataCenter', 'value': '10613000000', 'date': '2022-01-30'}, {'name': 'ProfessionalVisualization', 'value': '2111000000', 'date': '2022-01-30'}, {'name': 'Automotive', 'value': '566000000', 'date': '2022-01-30'}, {'name': 'OEMAndOther', 'value': '1162000000', 'date': '2022-01-30'}, {'name': 'Gaming', 'value': '3221000000', 'date': '2021-10-31'}, {'name': 'DataCenter', 'value': '2936000000', 'date': '2021-10-31'}, {'name': 'ProfessionalVisualization', 'value': '577000000', 'date': '2021-10-31'}, {'name': 'Automotive', 'value': '135000000', 'date': '2021-10-31'}, {'name': 'OEMAndOther', 'value': '234000000', 'date': '2021-10-31'}, {'name': 'Gaming', 'value': '3061000000', 'date': '2021-08-01'}, {'name': 'DataCenter', 'value': '2366000000', 'date': '2021-08-01'}, {'name': 'ProfessionalVisualization', 'value': '519000000', 'date': '2021-08-01'}, {'name': 'Automotive', 'value': '152000000', 'date': '2021-08-01'}, {'name': 'OEMAndOther', 'value': '409000000', 'date': '2021-08-01'}, {'name': 'Gaming', 'value': '2760000000', 'date': '2021-05-02'}, {'name': 'DataCenter', 'value': '2048000000', 'date': '2021-05-02'}, {'name': 'ProfessionalVisualization', 'value': '372000000', 'date': '2021-05-02'}, {'name': 'Automotive', 'value': '154000000', 'date': '2021-05-02'}, {'name': 'OEMAndOther', 'value': '327000000', 'date': '2021-05-02'}, {'name': 'Gaming', 'value': '7759000000', 'date': '2021-01-31'}, {'name': 'ProfessionalVisualization', 'value': '1053000000', 'date': '2021-01-31'}, {'name': 'DataCenter', 'value': '6696000000', 'date': '2021-01-31'}, {'name': 'Automotive', 'value': '536000000', 'date': '2021-01-31'}, {'name': 'OEMAndOther', 'value': '631000000', 'date': '2021-01-31'}, {'name': 'Gaming', 'value': '2271000000', 'date': '2020-10-25'}, {'name': 'ProfessionalVisualization', 'value': '236000000', 'date': '2020-10-25'}, {'name': 'DataCenter', 'value': '1900000000', 'date': '2020-10-25'}, {'name': 'Automotive', 'value': '125000000', 'date': '2020-10-25'}, {'name': 'OEMAndOther', 'value': '194000000', 'date': '2020-10-25'}, {'name': 'Gaming', 'value': '1654000000', 'date': '2020-07-26'}, {'name': 'ProfessionalVisualization', 'value': '203000000', 'date': '2020-07-26'}, {'name': 'DataCenter', 'value': '1752000000', 'date': '2020-07-26'}, {'name': 'Automotive', 'value': '111000000', 'date': '2020-07-26'}, {'name': 'OEMAndOther', 'value': '146000000', 'date': '2020-07-26'}] -geographic_sources = [{'name': 'country:US', 'value': '13022000000', 'date': '2024-07-28'}, {'name': 'country:TW', 'value': '5740000000', 'date': '2024-07-28'}, {'name': 'country:SG', 'value': '5622000000', 'date': '2024-07-28'}, {'name': 'ChinaIncludingHongKong', 'value': '3667000000', 'date': '2024-07-28'}, {'name': 'AllOtherCountriesNotSeparatelyDisclosed', 'value': '1989000000', 'date': '2024-07-28'}, {'name': 'country:US', 'value': '13496000000', 'date': '2024-04-28'}, {'name': 'country:TW', 'value': '4373000000', 'date': '2024-04-28'}, {'name': 'country:SG', 'value': '4037000000', 'date': '2024-04-28'}, {'name': 'ChinaIncludingHongKong', 'value': '2491000000', 'date': '2024-04-28'}, {'name': 'AllOtherCountriesNotSeparatelyDisclosed', 'value': '1647000000', 'date': '2024-04-28'}, {'name': 'country:IL', 'value': '1100000000', 'date': '2024-01-28'}, {'name': 'country:GB', 'value': '250000000', 'date': '2024-01-28'}, {'name': 'country:US', 'value': '26966000000', 'date': '2024-01-28'}, {'name': 'country:TW', 'value': '13405000000', 'date': '2024-01-28'}, {'name': 'ChinaIncludingHongKong', 'value': '10306000000', 'date': '2024-01-28'}, {'name': 'OtherCountries', 'value': '10245000000', 'date': '2024-01-28'}, {'name': 'country:IL', 'value': '325000000', 'date': '2024-01-28'}, {'name': 'country:US', 'value': '6302000000', 'date': '2023-10-29'}, {'name': 'country:TW', 'value': '4333000000', 'date': '2023-10-29'}, {'name': 'ChinaIncludingHongKong', 'value': '4030000000', 'date': '2023-10-29'}, {'name': 'country:SG', 'value': '2702000000', 'date': '2023-10-29'}, {'name': 'AllOtherCountriesNotSeparatelyDisclosed', 'value': '753000000', 'date': '2023-10-29'}, {'name': 'country:US', 'value': '6043000000', 'date': '2023-07-30'}, {'name': 'country:TW', 'value': '2839000000', 'date': '2023-07-30'}, {'name': 'ChinaIncludingHongKong', 'value': '2740000000', 'date': '2023-07-30'}, {'name': 'AllOtherCountriesNotSeparatelyDisclosed', 'value': '1885000000', 'date': '2023-07-30'}, {'name': 'country:US', 'value': '2385000000', 'date': '2023-04-30'}, {'name': 'country:TW', 'value': '1796000000', 'date': '2023-04-30'}, {'name': 'ChinaIncludingHongKong', 'value': '1590000000', 'date': '2023-04-30'}, {'name': 'country:SG', 'value': '762000000', 'date': '2023-04-30'}, {'name': 'AllOtherCountriesNotSeparatelyDisclosed', 'value': '659000000', 'date': '2023-04-30'}, {'name': 'country:IL', 'value': '1050000000.00', 'date': '2023-01-29'}, {'name': 'country:GB', 'value': '245000000', 'date': '2023-01-29'}, {'name': 'country:US', 'value': '8292000000', 'date': '2023-01-29'}, {'name': 'country:TW', 'value': '6986000000', 'date': '2023-01-29'}, {'name': 'ChinaIncludingHongKong', 'value': '5785000000', 'date': '2023-01-29'}, {'name': 'OtherCountries', 'value': '5911000000', 'date': '2023-01-29'}, {'name': 'country:IL', 'value': '283000000', 'date': '2023-01-29'}, {'name': 'country:US', 'value': '2148000000', 'date': '2022-10-30'}, {'name': 'country:TW', 'value': '1153000000', 'date': '2022-10-30'}, {'name': 'ChinaIncludingHongKong', 'value': '1148000000', 'date': '2022-10-30'}, {'name': 'AllOtherCountriesNotSeparatelyDisclosed', 'value': '1482000000', 'date': '2022-10-30'}, {'name': 'country:US', 'value': '1988000000', 'date': '2022-07-31'}, {'name': 'ChinaIncludingHongKong', 'value': '1602000000', 'date': '2022-07-31'}, {'name': 'country:TW', 'value': '1204000000', 'date': '2022-07-31'}, {'name': 'AllOtherCountriesNotSeparatelyDisclosed', 'value': '1910000000', 'date': '2022-07-31'}, {'name': 'country:TW', 'value': '2777000000', 'date': '2022-05-01'}, {'name': 'ChinaIncludingHongKong', 'value': '2081000000', 'date': '2022-05-01'}, {'name': 'country:US', 'value': '1932000000', 'date': '2022-05-01'}, {'name': 'AllOtherCountriesNotSeparatelyDisclosed', 'value': '1498000000', 'date': '2022-05-01'}, {'name': 'country:IL', 'value': '1050000000.00', 'date': '2022-01-30'}, {'name': 'country:GB', 'value': '232000000', 'date': '2022-01-30'}, {'name': 'country:TW', 'value': '8544000000', 'date': '2022-01-30'}, {'name': 'country:CN', 'value': '7111000000', 'date': '2022-01-30'}, {'name': 'country:US', 'value': '4349000000', 'date': '2022-01-30'}, {'name': 'OtherCountries', 'value': '6910000000', 'date': '2022-01-30'}, {'name': 'country:IL', 'value': '185000000', 'date': '2022-01-30'}, {'name': 'country:IL', 'value': '1700000000', 'date': '2021-10-31'}, {'name': 'country:GB', 'value': '231000000', 'date': '2021-10-31'}, {'name': 'country:TW', 'value': '2187000000', 'date': '2021-10-31'}, {'name': 'ChinaIncludingHongKong', 'value': '2017000000', 'date': '2021-10-31'}, {'name': 'OtherAsiaPacific', 'value': '1067000000', 'date': '2021-10-31'}, {'name': 'country:US', 'value': '1126000000', 'date': '2021-10-31'}, {'name': 'AllOtherCountriesNotSeparatelyDisclosed', 'value': '366000000', 'date': '2021-10-31'}, {'name': 'country:IL', 'value': '1600000000', 'date': '2021-08-01'}, {'name': 'country:GB', 'value': '231000000', 'date': '2021-08-01'}, {'name': 'country:TW', 'value': '1961000000', 'date': '2021-08-01'}, {'name': 'ChinaIncludingHongKong', 'value': '1720000000', 'date': '2021-08-01'}, {'name': 'OtherAsiaPacific', 'value': '1047000000', 'date': '2021-08-01'}, {'name': 'country:US', 'value': '996000000', 'date': '2021-08-01'}, {'name': 'AllOtherCountriesNotSeparatelyDisclosed', 'value': '354000000', 'date': '2021-08-01'}, {'name': 'country:TW', 'value': '1784000000', 'date': '2021-05-02'}, {'name': 'ChinaIncludingHongKong', 'value': '1391000000', 'date': '2021-05-02'}, {'name': 'OtherAsiaPacific', 'value': '1001000000', 'date': '2021-05-02'}, {'name': 'country:US', 'value': '768000000', 'date': '2021-05-02'}, {'name': 'AllOtherCountriesNotSeparatelyDisclosed', 'value': '336000000', 'date': '2021-05-02'}, {'name': 'country:TW', 'value': '4531000000', 'date': '2021-01-31'}, {'name': 'country:CN', 'value': '3886000000', 'date': '2021-01-31'}, {'name': 'country:US', 'value': '3214000000', 'date': '2021-01-31'}, {'name': 'OtherAsiaPacific', 'value': '3093000000', 'date': '2021-01-31'}, {'name': 'OtherCountries', 'value': '833000000', 'date': '2021-01-31'}, {'name': 'country:IL', 'value': '147000000', 'date': '2021-01-31'}, {'name': 'country:IN', 'value': '64000000', 'date': '2021-01-31'}, {'name': 'country:TW', 'value': '1296000000', 'date': '2020-10-25'}, {'name': 'ChinaIncludingHongKong', 'value': '1113000000', 'date': '2020-10-25'}, {'name': 'OtherAsiaPacific', 'value': '955000000', 'date': '2020-10-25'}, {'name': 'country:US', 'value': '890000000', 'date': '2020-10-25'}, {'name': 'AllOtherCountriesNotSeparatelyDisclosed', 'value': '225000000', 'date': '2020-10-25'}, {'name': 'country:TW', 'value': '954000000', 'date': '2020-07-26'}, {'name': 'country:US', 'value': '944000000', 'date': '2020-07-26'}, {'name': 'ChinaIncludingHongKong', 'value': '855000000', 'date': '2020-07-26'}, {'name': 'OtherAsiaPacific', 'value': '698000000', 'date': '2020-07-26'}, {'name': 'AllOtherCountriesNotSeparatelyDisclosed', 'value': '175000000', 'date': '2020-07-26'}] - +revenue_sources = [{'name': 'Product', 'value': '17080000000', 'date': '2024-03-31'}, {'name': 'ServiceOther', 'value': '44778000000', 'date': '2024-03-31'}, {'name': 'ServerProductsAndCloudServices', 'value': '24832000000', 'date': '2024-03-31'}, {'name': 'OfficeProductsAndCloudServices', 'value': '13911000000', 'date': '2024-03-31'}, {'name': 'Windows', 'value': '5929000000', 'date': '2024-03-31'}, {'name': 'Gaming', 'value': '5451000000', 'date': '2024-03-31'}, {'name': 'LinkedInCorporation', 'value': '4013000000', 'date': '2024-03-31'}, {'name': 'SearchAndNewsAdvertising', 'value': '3134000000', 'date': '2024-03-31'}, {'name': 'EnterpriseAndPartnerServices', 'value': '1861000000', 'date': '2024-03-31'}, {'name': 'DynamicsProductsAndCloudServices', 'value': '1646000000', 'date': '2024-03-31'}, {'name': 'Devices', 'value': '1067000000', 'date': '2024-03-31'}, {'name': 'OtherProductsAndServices', 'value': '14000000', 'date': '2024-03-31'}, {'name': 'Product', 'value': '18941000000', 'date': '2023-12-31'}, {'name': 'ServiceOther', 'value': '43079000000', 'date': '2023-12-31'}, {'name': 'ServerProductsAndCloudServices', 'value': '23953000000', 'date': '2023-12-31'}, {'name': 'OfficeProductsAndCloudServices', 'value': '13477000000', 'date': '2023-12-31'}, {'name': 'Gaming', 'value': '7111000000', 'date': '2023-12-31'}, {'name': 'Windows', 'value': '5262000000', 'date': '2023-12-31'}, {'name': 'LinkedInCorporation', 'value': '4195000000', 'date': '2023-12-31'}, {'name': 'SearchAndNewsAdvertising', 'value': '3220000000', 'date': '2023-12-31'}, {'name': 'EnterpriseAndPartnerServices', 'value': '1917000000', 'date': '2023-12-31'}, {'name': 'DynamicsProductsAndCloudServices', 'value': '1576000000', 'date': '2023-12-31'}, {'name': 'Devices', 'value': '1298000000', 'date': '2023-12-31'}, {'name': 'OtherProductsAndServices', 'value': '11000000', 'date': '2023-12-31'}, {'name': 'Product', 'value': '15535000000', 'date': '2023-09-30'}, {'name': 'ServiceOther', 'value': '40982000000', 'date': '2023-09-30'}, {'name': 'ServerProductsAndCloudServices', 'value': '22308000000', 'date': '2023-09-30'}, {'name': 'OfficeProductsAndCloudServices', 'value': '13140000000', 'date': '2023-09-30'}, {'name': 'Windows', 'value': '5567000000', 'date': '2023-09-30'}, {'name': 'Gaming', 'value': '3919000000', 'date': '2023-09-30'}, {'name': 'LinkedInCorporation', 'value': '3913000000', 'date': '2023-09-30'}, {'name': 'SearchAndNewsAdvertising', 'value': '3053000000', 'date': '2023-09-30'}, {'name': 'EnterpriseAndPartnerServices', 'value': '1944000000', 'date': '2023-09-30'}, {'name': 'Dynamics', 'value': '1540000000', 'date': '2023-09-30'}, {'name': 'Devices', 'value': '1125000000', 'date': '2023-09-30'}, {'name': 'OtherProductsAndServices', 'value': '8000000', 'date': '2023-09-30'}, {'name': 'Product', 'value': '15588000000', 'date': '2023-03-31'}, {'name': 'ServiceOther', 'value': '37269000000', 'date': '2023-03-31'}, {'name': 'ServerProductsAndCloudServices', 'value': '20025000000', 'date': '2023-03-31'}, {'name': 'OfficeProductsAndCloudServices', 'value': '12438000000', 'date': '2023-03-31'}, {'name': 'Windows', 'value': '5328000000', 'date': '2023-03-31'}, {'name': 'Gaming', 'value': '3607000000', 'date': '2023-03-31'}, {'name': 'LinkedInCorporation', 'value': '3697000000', 'date': '2023-03-31'}, {'name': 'SearchAndNewsAdvertising', 'value': '3045000000', 'date': '2023-03-31'}, {'name': 'EnterpriseServices', 'value': '2007000000', 'date': '2023-03-31'}, {'name': 'Devices', 'value': '1282000000', 'date': '2023-03-31'}, {'name': 'OtherProductsAndServices', 'value': '1428000000', 'date': '2023-03-31'}, {'name': 'Product', 'value': '16517000000', 'date': '2022-12-31'}, {'name': 'ServiceOther', 'value': '36230000000', 'date': '2022-12-31'}, {'name': 'ServerProductsAndCloudServices', 'value': '19594000000', 'date': '2022-12-31'}, {'name': 'OfficeProductsAndCloudServices', 'value': '11837000000', 'date': '2022-12-31'}, {'name': 'Windows', 'value': '4808000000', 'date': '2022-12-31'}, {'name': 'Gaming', 'value': '4758000000', 'date': '2022-12-31'}, {'name': 'LinkedInCorporation', 'value': '3876000000', 'date': '2022-12-31'}, {'name': 'SearchAndNewsAdvertising', 'value': '3223000000', 'date': '2022-12-31'}, {'name': 'EnterpriseServices', 'value': '1862000000', 'date': '2022-12-31'}, {'name': 'Devices', 'value': '1430000000', 'date': '2022-12-31'}, {'name': 'OtherProductsAndServices', 'value': '1359000000', 'date': '2022-12-31'}, {'name': 'Product', 'value': '15741000000', 'date': '2022-09-30'}, {'name': 'ServiceOther', 'value': '34381000000', 'date': '2022-09-30'}, {'name': 'ServerProductsAndCloudServices', 'value': '18388000000', 'date': '2022-09-30'}, {'name': 'OfficeProductsAndCloudServices', 'value': '11548000000', 'date': '2022-09-30'}, {'name': 'Windows', 'value': '5313000000', 'date': '2022-09-30'}, {'name': 'LinkedInCorporation', 'value': '3663000000', 'date': '2022-09-30'}, {'name': 'Gaming', 'value': '3610000000', 'date': '2022-09-30'}, {'name': 'SearchAndNewsAdvertising', 'value': '2928000000', 'date': '2022-09-30'}, {'name': 'EnterpriseServices', 'value': '1876000000', 'date': '2022-09-30'}, {'name': 'Devices', 'value': '1448000000', 'date': '2022-09-30'}, {'name': 'OtherProductsAndServices', 'value': '1348000000', 'date': '2022-09-30'}, {'name': 'Product', 'value': '17366000000', 'date': '2022-03-31'}, {'name': 'ServiceOther', 'value': '31994000000', 'date': '2022-03-31'}, {'name': 'ServerProductsAndCloudServices', 'value': '17038000000', 'date': '2022-03-31'}, {'name': 'OfficeProductsAndCloudServices', 'value': '11164000000', 'date': '2022-03-31'}, {'name': 'Windows', 'value': '6077000000', 'date': '2022-03-31'}, {'name': 'Gaming', 'value': '3740000000', 'date': '2022-03-31'}, {'name': 'LinkedInCorporation', 'value': '3437000000', 'date': '2022-03-31'}, {'name': 'SearchAndNewsAdvertising', 'value': '2945000000', 'date': '2022-03-31'}, {'name': 'EnterpriseServices', 'value': '1891000000', 'date': '2022-03-31'}, {'name': 'Devices', 'value': '1764000000', 'date': '2022-03-31'}, {'name': 'OtherProductsAndServices', 'value': '1304000000', 'date': '2022-03-31'}, {'name': 'Product', 'value': '20779000000', 'date': '2021-12-31'}, {'name': 'ServiceOther', 'value': '30949000000', 'date': '2021-12-31'}, {'name': 'ServerProductsAndCloudServices', 'value': '16375000000', 'date': '2021-12-31'}, {'name': 'OfficeProductsAndCloudServices', 'value': '11251000000', 'date': '2021-12-31'}, {'name': 'Windows', 'value': '6600000000', 'date': '2021-12-31'}, {'name': 'Gaming', 'value': '5442000000', 'date': '2021-12-31'}, {'name': 'LinkedInCorporation', 'value': '3531000000', 'date': '2021-12-31'}, {'name': 'SearchAndNewsAdvertising', 'value': '3064000000', 'date': '2021-12-31'}, {'name': 'Devices', 'value': '2285000000', 'date': '2021-12-31'}, {'name': 'EnterpriseServices', 'value': '1823000000', 'date': '2021-12-31'}, {'name': 'OtherProductsAndServices', 'value': '1357000000', 'date': '2021-12-31'}, {'name': 'Product', 'value': '16631000000', 'date': '2021-09-30'}, {'name': 'ServiceOther', 'value': '28686000000', 'date': '2021-09-30'}, {'name': 'ServerProductsAndCloudServices', 'value': '15069000000', 'date': '2021-09-30'}, {'name': 'OfficeProductsAndCloudServices', 'value': '10808000000', 'date': '2021-09-30'}, {'name': 'Windows', 'value': '5676000000', 'date': '2021-09-30'}, {'name': 'Gaming', 'value': '3593000000', 'date': '2021-09-30'}, {'name': 'LinkedInCorporation', 'value': '3136000000', 'date': '2021-09-30'}, {'name': 'SearchAndNewsAdvertising', 'value': '2656000000', 'date': '2021-09-30'}, {'name': 'EnterpriseServices', 'value': '1791000000', 'date': '2021-09-30'}, {'name': 'Devices', 'value': '1361000000', 'date': '2021-09-30'}, {'name': 'OtherProductsAndServices', 'value': '1227000000', 'date': '2021-09-30'}, {'name': 'Product', 'value': '16873000000', 'date': '2021-03-31'}, {'name': 'ServiceOther', 'value': '24833000000', 'date': '2021-03-31'}, {'name': 'ServerProductsAndCloudServices', 'value': '13204000000', 'date': '2021-03-31'}, {'name': 'OfficeProductsAndCloudServices', 'value': '10016000000', 'date': '2021-03-31'}, {'name': 'Windows', 'value': '5646000000', 'date': '2021-03-31'}, {'name': 'Gaming', 'value': '3533000000', 'date': '2021-03-31'}, {'name': 'LinkedInCorporation', 'value': '2562000000', 'date': '2021-03-31'}, {'name': 'SearchAdvertising', 'value': '2218000000', 'date': '2021-03-31'}, {'name': 'Devices', 'value': '1599000000', 'date': '2021-03-31'}, {'name': 'EnterpriseServices', 'value': '1803000000', 'date': '2021-03-31'}, {'name': 'OtherProductsAndServices', 'value': '1125000000', 'date': '2021-03-31'}, {'name': 'Product', 'value': '19460000000', 'date': '2020-12-31'}, {'name': 'ServiceOther', 'value': '23616000000', 'date': '2020-12-31'}, {'name': 'ServerProductsAndCloudServices', 'value': '12729000000', 'date': '2020-12-31'}, {'name': 'OfficeProductsAndCloudServices', 'value': '9881000000', 'date': '2020-12-31'}, {'name': 'Windows', 'value': '5716000000', 'date': '2020-12-31'}, {'name': 'Gaming', 'value': '5031000000', 'date': '2020-12-31'}, {'name': 'LinkedInCorporation', 'value': '2577000000', 'date': '2020-12-31'}, {'name': 'SearchAdvertising', 'value': '2184000000', 'date': '2020-12-31'}, {'name': 'Devices', 'value': '2120000000', 'date': '2020-12-31'}, {'name': 'EnterpriseServices', 'value': '1695000000', 'date': '2020-12-31'}, {'name': 'OtherProductsAndServices', 'value': '1143000000', 'date': '2020-12-31'}, {'name': 'Product', 'value': '15803000000', 'date': '2020-09-30'}, {'name': 'ServiceOther', 'value': '21351000000', 'date': '2020-09-30'}, {'name': 'ServerProductsAndCloudServices', 'value': '11195000000', 'date': '2020-09-30'}, {'name': 'OfficeProductsAndCloudServices', 'value': '9278000000', 'date': '2020-09-30'}, {'name': 'Windows', 'value': '5305000000', 'date': '2020-09-30'}, {'name': 'Gaming', 'value': '3092000000', 'date': '2020-09-30'}, {'name': 'LinkedInCorporation', 'value': '2206000000', 'date': '2020-09-30'}, {'name': 'SearchAdvertising', 'value': '1789000000', 'date': '2020-09-30'}, {'name': 'EnterpriseServices', 'value': '1637000000', 'date': '2020-09-30'}, {'name': 'Devices', 'value': '1620000000', 'date': '2020-09-30'}, {'name': 'OtherProductsAndServices', 'value': '1032000000', 'date': '2020-09-30'}, {'name': 'Product', 'value': '15871000000', 'date': '2020-03-31'}, {'name': 'ServiceOther', 'value': '19150000000', 'date': '2020-03-31'}, {'name': 'ServerProductsAndCloudServices', 'value': '10490000000', 'date': '2020-03-31'}, {'name': 'OfficeProductsAndCloudServices', 'value': '8920000000', 'date': '2020-03-31'}, {'name': 'Windows', 'value': '5220000000', 'date': '2020-03-31'}, {'name': 'Gaming', 'value': '2349000000', 'date': '2020-03-31'}, {'name': 'SearchAdvertising', 'value': '1986000000', 'date': '2020-03-31'}, {'name': 'LinkedInCorporation', 'value': '2050000000', 'date': '2020-03-31'}, {'name': 'EnterpriseServices', 'value': '1633000000', 'date': '2020-03-31'}, {'name': 'Devices', 'value': '1412000000', 'date': '2020-03-31'}, {'name': 'OtherProductsAndServices', 'value': '961000000', 'date': '2020-03-31'}, {'name': 'Product', 'value': '18255000000', 'date': '2019-12-31'}, {'name': 'ServiceOther', 'value': '18651000000', 'date': '2019-12-31'}, {'name': 'ServerProductsAndCloudServices', 'value': '10119000000', 'date': '2019-12-31'}, {'name': 'OfficeProductsAndCloudServices', 'value': '8983000000', 'date': '2019-12-31'}, {'name': 'Windows', 'value': '5593000000', 'date': '2019-12-31'}, {'name': 'Gaming', 'value': '3327000000', 'date': '2019-12-31'}, {'name': 'SearchAdvertising', 'value': '2163000000', 'date': '2019-12-31'}, {'name': 'LinkedInCorporation', 'value': '2102000000', 'date': '2019-12-31'}, {'name': 'Devices', 'value': '2048000000', 'date': '2019-12-31'}, {'name': 'EnterpriseServices', 'value': '1612000000', 'date': '2019-12-31'}, {'name': 'OtherProductsAndServices', 'value': '959000000', 'date': '2019-12-31'}, {'name': 'Product', 'value': '15768000000', 'date': '2019-09-30'}, {'name': 'ServiceOther', 'value': '17287000000', 'date': '2019-09-30'}, {'name': 'ServerProductsAndCloudServices', 'value': '9192000000', 'date': '2019-09-30'}, {'name': 'OfficeProductsAndCloudServices', 'value': '8466000000', 'date': '2019-09-30'}, {'name': 'Windows', 'value': '5353000000', 'date': '2019-09-30'}, {'name': 'Gaming', 'value': '2542000000', 'date': '2019-09-30'}, {'name': 'SearchAdvertising', 'value': '1991000000', 'date': '2019-09-30'}, {'name': 'LinkedInCorporation', 'value': '1909000000', 'date': '2019-09-30'}, {'name': 'EnterpriseServices', 'value': '1545000000', 'date': '2019-09-30'}, {'name': 'Devices', 'value': '1202000000', 'date': '2019-09-30'}, {'name': 'OtherProductsAndServices', 'value': '855000000', 'date': '2019-09-30'}, {'name': 'Product', 'value': '15448000000', 'date': '2019-03-31'}, {'name': 'ServiceOther', 'value': '15123000000', 'date': '2019-03-31'}, {'name': 'OfficeProductsAndCloudServices', 'value': '7889000000', 'date': '2019-03-31'}, {'name': 'ServerProductsAndCloudServices', 'value': '8053000000', 'date': '2019-03-31'}, {'name': 'Windows', 'value': '4944000000', 'date': '2019-03-31'}, {'name': 'Gaming', 'value': '2363000000', 'date': '2019-03-31'}, {'name': 'SearchAdvertising', 'value': '1911000000', 'date': '2019-03-31'}, {'name': 'LinkedInCorporation', 'value': '1696000000', 'date': '2019-03-31'}, {'name': 'Devices', 'value': '1423000000', 'date': '2019-03-31'}, {'name': 'EnterpriseServices', 'value': '1542000000', 'date': '2019-03-31'}, {'name': 'OtherProductsAndServices', 'value': '750000000', 'date': '2019-03-31'}, {'name': 'Product', 'value': '16219000000', 'date': '2018-12-31'}, {'name': 'ServiceOther', 'value': '16252000000', 'date': '2018-12-31'}, {'name': 'OfficeProductsAndCloudServices', 'value': '7747000000', 'date': '2018-12-31'}, {'name': 'ServerProductsAndCloudServices', 'value': '7791000000', 'date': '2018-12-31'}, {'name': 'Windows', 'value': '4758000000', 'date': '2018-12-31'}, {'name': 'Gaming', 'value': '4232000000', 'date': '2018-12-31'}, {'name': 'SearchAdvertising', 'value': '1976000000', 'date': '2018-12-31'}, {'name': 'LinkedInCorporation', 'value': '1693000000', 'date': '2018-12-31'}, {'name': 'Devices', 'value': '1948000000', 'date': '2018-12-31'}, {'name': 'EnterpriseServices', 'value': '1521000000', 'date': '2018-12-31'}, {'name': 'OtherProductsAndServices', 'value': '805000000', 'date': '2018-12-31'}] def generate_revenue_dataset(dataset): + # Find all unique names and dates + all_dates = sorted(set(item['date'] for item in dataset)) + all_names = sorted(set(item['name'] for item in dataset)) + + # Check and fill missing combinations at the beginning + name_date_map = defaultdict(lambda: defaultdict(lambda: None)) + for item in dataset: + name_date_map[item['name']][item['date']] = item['value'] + + # Ensure all names have entries for all dates + for name in all_names: + for date in all_dates: + if date not in name_date_map[name]: + dataset.append({'name': name, 'date': date, 'value': None}) + + # Clean and process the dataset values + processed_dataset = [] + for item in dataset: + if item['value'] not in (None, '', 0): + processed_dataset.append({ + 'name': item['name'], + 'date': item['date'], + 'value': int(float(item['value'])) + }) + else: + processed_dataset.append({ + 'name': item['name'], + 'date': item['date'], + 'value': None + }) + + dataset = processed_dataset + + name_replacements = { "datacenter": "Data Center", - "professionalvisualization": "Professional Visualization", - "oemandother": "OEM and Other", - "automotive": "Automotive and Robotics", - "oemip": "OEM and Other", - "gaming": "Gaming" + "professionalvisualization": "Visualization", + "oemandother": "OEM & Other", + "automotive": "Automotive", + "oemip": "OEM & Other", + "gaming": "Gaming", + "mac": "Mac", + "iphone": "IPhone", + "ipad": "IPad", + "wearableshomeandaccessories": "Wearables", + "hardwareandaccessories": "Hardware & Accessories", + "software": "Software", + "collectibles": "Collectibles", + "automotivesales": "Auto", + "energygenerationandstoragesegment": "Energy and Storage", + "servicesandother": "Services & Other", + "automotiveregulatorycredits": "Regulatory Credits", + "intelligentcloud": "Intelligent Cloud", + "productivityandbusinessprocesses": "Productivity & Business", + "searchandnewsadvertising": "Advertising", + "linkedincorporation": "LinkedIn", + "morepersonalcomputing": "More Personal Computing", + "serviceother": "Service Other", } - dataset = [revenue for revenue in dataset if revenue['name'] not in ['Compute', 'Networking']] + # Filter out unwanted categories + excluded_names = {'automotiveleasing ','officeproductsandcloudservices','serverproductsandcloudservices','automotiverevenues','automotive','computeandnetworking','graphics','gpu','automotivesegment','energygenerationandstoragesales','energygenerationandstorage','automotivesaleswithoutresalevalueguarantee','salesandservices','compute', 'networking', 'cloudserviceagreements', 'digital', 'allother', 'preownedvideogameproducts'} + dataset = [revenue for revenue in dataset if revenue['name'].lower() not in excluded_names] + # Process and clean the dataset for item in dataset: - item['date'] = closest_quarter_end(item['date']) - - name = item.get('name').lower() - value = int(item.get('value')) - if name in name_replacements: - item['name'] = name_replacements[name] - item['value'] = int(value) + try: + name = item.get('name').lower() + value = int(float(item.get('value'))) + if name in name_replacements: + item['name'] = name_replacements[name] + item['value'] = value + except: + pass - # Custom order for specific countries - custom_order = { - 'Data Center': 4, - 'Gaming': 3, - 'Professional Visualization': 2, - 'Automotive and Robotics': 1, - 'OEM and Other': 0 - } - - dataset = sorted( - dataset, - key=lambda item: (datetime.strptime(item['date'], '%Y-%m-%d'), custom_order.get(item['name'], 4)), - reverse = True - ) + # Group by name and calculate total value + name_totals = defaultdict(int) + for item in dataset: + name_totals[item['name']] += item['value'] if item['value'] != None else 0 - dataset = compute_q4_results(dataset) + # Sort names by total value and get top 5, ensuring excluded names are not considered + top_names = sorted( + [(name, total) for name, total in name_totals.items() if name.lower() not in excluded_names], + key=lambda x: x[1], + reverse=True + )[:5] + top_names = [name for name, _ in top_names] + # Filter dataset to include only top 5 names + dataset = [item for item in dataset if item['name'] in top_names] + + # Sort the dataset + dataset.sort(key=lambda item: (datetime.strptime(item['date'], '%Y-%m-%d'), item['value'] if item['value'] != None else 0), reverse=True) + + + # Process the data into the required format result = {} - - # Iterate through the original data for item in dataset: - # Get the date and value date = item['date'] value = item['value'] - - # Initialize the dictionary for the date if not already done if date not in result: result[date] = {'date': date, 'value': []} - - # Append the value to the list result[date]['value'].append(value) # Convert the result dictionary to a list - final_result = list(result.values()) + res_list = list(result.values()) + print(res_list) + # Add value growth (assuming add_value_growth function exists) + res_list = add_value_growth(res_list) - # Print the final result - final_result = add_value_growth(final_result) - print(final_result) + final_result = {'names': top_names, 'history': res_list} + return final_result def generate_geography_dataset(dataset):