Quellcode durchsuchen

company total profits and profit ranks, mat/universe profit

raylu vor 1 Monat
Ursprung
Commit
57f8f38c1b
3 geänderte Dateien mit 25 neuen und 10 gelöschten Zeilen
  1. 23 8
      py/prepare.py
  2. 1 1
      py/prepare_from_csv.py
  3. 1 1
      py/prepare_from_sqlite.py

+ 23 - 8
py/prepare.py

@@ -33,12 +33,6 @@ def get_prices(month: str) -> typing.Mapping[str, float]:
 	prices.update(hardcoded_prices)
 	return prices
 
-def add_company_ranks(totals: typing.Mapping[str, CompanyTotals]) -> typing.Mapping[str, CompanyTotals]:
-	ranked = sorted(totals.items(), key=lambda item: item[1]['volume'], reverse=True)
-	for rank, (company_id, company_totals) in enumerate(ranked, start=1):
-		company_totals['volumeRank'] = rank
-	return totals
-
 def calc_consumption_profit(month: str, prices: typing.Mapping[str, float],
 		prod_data: typing.Mapping[str, ProdData], company_data: CompanyData) -> None:
 	consumption_ratios = get_consumption_ratios(month)
@@ -90,7 +84,9 @@ def calc_consumption_profit(month: str, prices: typing.Mapping[str, float],
 	}
 
 	universe_consumption: dict[str, float] = collections.defaultdict(float)
-	for co_data in company_data['individual'].values():
+	universe_profit: dict[str, float] = collections.defaultdict(float)
+	for co_id, co_data in company_data['individual'].items():
+		co_profit = 0.0
 		for mat, mat_data in co_data.items():
 			if (cost := extraction_cost.get(mat)) is not None:
 				total_cost = mat_data['amount'] * cost
@@ -103,9 +99,17 @@ def calc_consumption_profit(month: str, prices: typing.Mapping[str, float],
 					unit_cost += ratio * prices[consumed_mat]
 					universe_consumption[consumed_mat] += ratio * mat_data['amount']
 				mat_data['profit'] = mat_data['volume'] - unit_cost * mat_data['amount']
+			else:
+				raise AssertionError('no cost for producing ' + mat)
+			co_profit += mat_data['profit']
+			universe_profit[mat] += mat_data['profit']
+		company_data['totals'][co_id]['profit'] = co_profit
+
+	add_company_ranks(company_data['totals'])
 
 	for mat, mat_data in prod_data.items():
 		mat_data['consumed'] = universe_consumption.get(mat, 0.0)
+		mat_data['profit'] = universe_profit.get(mat, 0.0)
 
 def get_consumption_ratios(month: str) -> typing.Mapping[str, typing.Mapping[str, float]]:
 	with open(f'rawData/{month}-recipes.json', 'r') as f:
@@ -159,6 +163,14 @@ def consumption_ratio_for_recipe(recipe: Recipe, output: RecipeMat, buildings: d
 			ratios[mat] = ratios.get(mat, 0) + consumed_per_unit_output
 	return ratios
 
+def add_company_ranks(totals: typing.Mapping[str, CompanyTotals]) -> None:
+	ranked = sorted(totals.items(), key=lambda item: item[1]['volume'], reverse=True)
+	for rank, (company_id, company_totals) in enumerate(ranked, start=1):
+		company_totals['volumeRank'] = rank
+	ranked = sorted(totals.items(), key=lambda item: item[1]['profit'], reverse=True) # pyright: ignore[reportTypedDictNotRequiredAccess]
+	for rank, (company_id, company_totals) in enumerate(ranked, start=1):
+		company_totals['profitRank'] = rank
+
 def write_data(month: str, data: dict[str, list[Row]],
 		prod_data: typing.Mapping[str, ProdData], company_data: CompanyData) -> None:
 	with open(f'www/data/prod-data-{month}.json', 'w') as f:
@@ -180,7 +192,7 @@ def write_data(month: str, data: dict[str, list[Row]],
 		universe_data = json.load(f)
 		universe_data[month] = {
 			'volume': sum(mat['volume'] for mat in prod_data.values()),
-			'profit': None,
+			'profit': sum(mat['profit'] for mat in prod_data.values()), # pyright: ignore[reportTypedDictNotRequiredAccess]
 			'bases': sum(co['bases'] for co in bases_data.values()),
 			'companies': len(company_data['totals']),
 		}
@@ -220,6 +232,7 @@ class ProdData(typing.TypedDict):
 	amount: float
 	volume: float
 	consumed: typing.NotRequired[float]
+	profit: typing.NotRequired[float]
 
 class CompanyData(typing.TypedDict):
 	totals: typing.Mapping[str, CompanyTotals]
@@ -233,4 +246,6 @@ class CompanyTickerData(typing.TypedDict):
 
 class CompanyTotals(typing.TypedDict):
 	volume: float
+	profit: typing.NotRequired[float]
 	volumeRank: typing.NotRequired[int]
+	profitRank: typing.NotRequired[int]

+ 1 - 1
py/prepare_from_csv.py

@@ -41,7 +41,7 @@ def get_prod_and_company_data(data: dict[str, list[prepare.Row]], prices: typing
 			individual[row.company_id][ticker] = co_data
 			totals[row.company_id]['volume'] += volume
 
-	company_data: prepare.CompanyData = {'totals': prepare.add_company_ranks(totals), 'individual': dict(individual)}
+	company_data: prepare.CompanyData = {'totals': totals, 'individual': dict(individual)}
 	return prod, company_data
 
 def get_production_ticker(section: str) -> str | None:

+ 1 - 1
py/prepare_from_sqlite.py

@@ -58,7 +58,7 @@ def get_prod_and_company_data(db: sqlite3.Connection, run_id: int, prices: typin
 		amount = total_score / 30
 		prod[ticker] = {'amount': amount, 'volume': amount * prices[ticker]}
 
-	company_data: prepare.CompanyData = {'totals': prepare.add_company_ranks(company_totals), 'individual': dict(individual)}
+	company_data: prepare.CompanyData = {'totals': company_totals, 'individual': dict(individual)}
 	return prod, company_data
 
 if __name__ == '__main__':