|
@@ -33,12 +33,6 @@ def get_prices(month: str) -> typing.Mapping[str, float]:
|
|
|
prices.update(hardcoded_prices)
|
|
prices.update(hardcoded_prices)
|
|
|
return 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],
|
|
def calc_consumption_profit(month: str, prices: typing.Mapping[str, float],
|
|
|
prod_data: typing.Mapping[str, ProdData], company_data: CompanyData) -> None:
|
|
prod_data: typing.Mapping[str, ProdData], company_data: CompanyData) -> None:
|
|
|
consumption_ratios = get_consumption_ratios(month)
|
|
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)
|
|
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():
|
|
for mat, mat_data in co_data.items():
|
|
|
if (cost := extraction_cost.get(mat)) is not None:
|
|
if (cost := extraction_cost.get(mat)) is not None:
|
|
|
total_cost = mat_data['amount'] * cost
|
|
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]
|
|
unit_cost += ratio * prices[consumed_mat]
|
|
|
universe_consumption[consumed_mat] += ratio * mat_data['amount']
|
|
universe_consumption[consumed_mat] += ratio * mat_data['amount']
|
|
|
mat_data['profit'] = mat_data['volume'] - unit_cost * 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():
|
|
for mat, mat_data in prod_data.items():
|
|
|
mat_data['consumed'] = universe_consumption.get(mat, 0.0)
|
|
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]]:
|
|
def get_consumption_ratios(month: str) -> typing.Mapping[str, typing.Mapping[str, float]]:
|
|
|
with open(f'rawData/{month}-recipes.json', 'r') as f:
|
|
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
|
|
ratios[mat] = ratios.get(mat, 0) + consumed_per_unit_output
|
|
|
return ratios
|
|
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]],
|
|
def write_data(month: str, data: dict[str, list[Row]],
|
|
|
prod_data: typing.Mapping[str, ProdData], company_data: CompanyData) -> None:
|
|
prod_data: typing.Mapping[str, ProdData], company_data: CompanyData) -> None:
|
|
|
with open(f'www/data/prod-data-{month}.json', 'w') as f:
|
|
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 = json.load(f)
|
|
|
universe_data[month] = {
|
|
universe_data[month] = {
|
|
|
'volume': sum(mat['volume'] for mat in prod_data.values()),
|
|
'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()),
|
|
'bases': sum(co['bases'] for co in bases_data.values()),
|
|
|
'companies': len(company_data['totals']),
|
|
'companies': len(company_data['totals']),
|
|
|
}
|
|
}
|
|
@@ -220,6 +232,7 @@ class ProdData(typing.TypedDict):
|
|
|
amount: float
|
|
amount: float
|
|
|
volume: float
|
|
volume: float
|
|
|
consumed: typing.NotRequired[float]
|
|
consumed: typing.NotRequired[float]
|
|
|
|
|
+ profit: typing.NotRequired[float]
|
|
|
|
|
|
|
|
class CompanyData(typing.TypedDict):
|
|
class CompanyData(typing.TypedDict):
|
|
|
totals: typing.Mapping[str, CompanyTotals]
|
|
totals: typing.Mapping[str, CompanyTotals]
|
|
@@ -233,4 +246,6 @@ class CompanyTickerData(typing.TypedDict):
|
|
|
|
|
|
|
|
class CompanyTotals(typing.TypedDict):
|
|
class CompanyTotals(typing.TypedDict):
|
|
|
volume: float
|
|
volume: float
|
|
|
|
|
+ profit: typing.NotRequired[float]
|
|
|
volumeRank: typing.NotRequired[int]
|
|
volumeRank: typing.NotRequired[int]
|
|
|
|
|
+ profitRank: typing.NotRequired[int]
|