1+ from typing import Any
2+
13import pandas as pd
24from requests .exceptions import HTTPError
35
1416
1517
1618class PoEAPIDataTransformerBase :
17- def __init__ (self ) -> None :
19+ def __init__ (
20+ self ,
21+ leagues : list [dict [str , Any ]],
22+ ) -> None :
1823 logger .debug ("Initializing PoEAPIDataTransformer" )
1924
2025 self .base_url = settings .BACKEND_BASE_URL
2126 self .pom_auth_headers = get_superuser_token_headers (self .base_url )
2227 self .roll_processor = RollProcessor ()
2328
29+ self .league_to_id = {league ["name" ]: league ["leagueId" ] for league in leagues }
30+
2431 logger .debug ("Initializing PoEAPIDataTransformer done." )
2532
26- def _create_item_table (self , df : pd .DataFrame , current_hour : int ) -> pd .DataFrame :
33+ def _create_item_table (self , df : pd .DataFrame ) -> pd .DataFrame :
2734 """
2835 Creates the basis of the `item` table.
2936 """
3037 self .item_columns = [
3138 "itemId" ,
3239 "id" ,
3340 "name" ,
34- "leagueId " ,
41+ "league " ,
3542 "baseType" ,
3643 "typeLine" ,
3744 "ilvl" ,
@@ -61,11 +68,12 @@ def _create_item_table(self, df: pd.DataFrame, current_hour: int) -> pd.DataFram
6168 :, [column for column in self .item_columns if column in df .columns ]
6269 ] # Can't guarantee all columns are present
6370
64- item_df ["createdHoursSinceLaunch" ] = current_hour
6571 return item_df
6672
6773 def _find_not_too_highly_priced_item_mask (
68- self , currency_df : pd .DataFrame , item_currency_merged_df : pd .DataFrame
74+ self ,
75+ currency_df : pd .DataFrame ,
76+ item_currency_merged_df : pd .DataFrame ,
6977 ) -> pd .Series :
7078 """
7179 Some items are too highly priced to be legitimate. A boundary of the price equivelant to
@@ -91,6 +99,7 @@ def _transform_item_table(
9199 item_df : pd .DataFrame ,
92100 currency_df : pd .DataFrame ,
93101 item_base_types : dict [str , int ],
102+ current_hours : dict [int , int ],
94103 ) -> pd .DataFrame :
95104 """
96105 The `item` table requires a foreign key to the `currency` table.
@@ -126,6 +135,9 @@ def transform_influences(row: pd.DataFrame, influence_columns: list[str]):
126135 ] = True
127136 return influence_dict
128137
138+ item_df ["leagueId" ] = item_df ["league" ].map (self .league_to_id )
139+ item_df ["createdHoursSinceLaunch" ] = item_df ["leagueId" ].map (current_hours )
140+
129141 base_type_series = item_df ["baseType" ]
130142 item_df ["itemBaseTypeId" ] = base_type_series .apply (transform_base_types )
131143
@@ -259,13 +271,15 @@ def _process_item_table(
259271 df : pd .DataFrame ,
260272 currency_df : pd .DataFrame ,
261273 item_base_types : dict [str , int ],
262- current_hour : int ,
274+ current_hours : dict [ int , int ] ,
263275 ) -> pd .Series :
264276 """
265277 Needs to return item ids, as it is used to connect the item modifiers
266278 """
267- item_df = self ._create_item_table (df , current_hour = current_hour )
268- item_df = self ._transform_item_table (item_df , currency_df , item_base_types )
279+ item_df = self ._create_item_table (df )
280+ item_df = self ._transform_item_table (
281+ item_df , currency_df , item_base_types , current_hours = current_hours
282+ )
269283 item_df = self ._clean_item_table (item_df )
270284 insert_data (
271285 item_df ,
@@ -284,11 +298,14 @@ def _transform_unidentified_item_table(
284298 item_df : pd .DataFrame ,
285299 currency_df : pd .DataFrame ,
286300 item_base_types : dict [str , int ],
301+ current_hours : dict [int , int ],
287302 ) -> pd .DataFrame :
288303 """
289304 For convenience, all unid items are stored in divine prices
290305 """
291- item_df = self ._transform_item_table (item_df , currency_df , item_base_types )
306+ item_df = self ._transform_item_table (
307+ item_df , currency_df , item_base_types , current_hours = current_hours
308+ )
292309
293310 item_df ["chaos_value" ] = (
294311 item_df ["currencyAmount" ].astype (float ) * item_df ["valueInChaos" ]
@@ -401,11 +418,11 @@ def _process_unidentified_item_table(
401418 df : pd .DataFrame ,
402419 currency_df : pd .DataFrame ,
403420 item_base_types : dict [str , int ],
404- current_hour : int ,
421+ current_hours : dict [ int , int ] ,
405422 ) -> None :
406- item_df = self ._create_item_table (df , current_hour = current_hour )
423+ item_df = self ._create_item_table (df )
407424 item_df = self ._transform_unidentified_item_table (
408- item_df , currency_df , item_base_types
425+ item_df , currency_df , item_base_types , current_hours = current_hours
409426 )
410427 item_df = self ._clean_unidentified_item_table (item_df )
411428 insert_data (
@@ -417,7 +434,7 @@ def _process_unidentified_item_table(
417434 )
418435
419436 def _create_item_modifier_table (
420- self , df : pd .DataFrame , * , item_id : pd .Series , current_hour : int
437+ self , df : pd .DataFrame , * , item_id : pd .Series
421438 ) -> pd .DataFrame :
422439 """
423440 The `item_modifier` table heavily relies on what type of item the modifiers
@@ -428,6 +445,7 @@ def _create_item_modifier_table(
428445 def _transform_item_modifier_table (
429446 self ,
430447 item_modifier_df : pd .DataFrame ,
448+ current_hours : dict [int , int ],
431449 ) -> pd .DataFrame :
432450 """
433451 The `item_modifier` table heavily relies on what type of item the modifiers
@@ -450,14 +468,13 @@ def _process_item_modifier_table(
450468 self ,
451469 df : pd .DataFrame ,
452470 item_id : pd .Series ,
453- current_hour : int ,
471+ current_hours : dict [ int , int ] ,
454472 ) -> None :
455473 item_modifier_df = self ._create_item_modifier_table (
456- df , item_id = item_id , current_hour = current_hour
474+ df , item_id = item_id , current_hours = current_hours
457475 )
458476 item_modifier_df = self ._transform_item_modifier_table (item_modifier_df )
459477 item_modifier_df = self ._clean_item_modifier_table (item_modifier_df )
460-
461478 insert_data (
462479 item_modifier_df ,
463480 url = self .base_url ,
@@ -472,7 +489,7 @@ def transform_into_tables(
472489 modifier_df : pd .DataFrame ,
473490 currency_df : pd .DataFrame ,
474491 item_base_types : dict [str , int ],
475- current_hour : int ,
492+ current_hours : dict [ int , int ] ,
476493 ) -> None :
477494 self .roll_processor .add_modifier_df (modifier_df )
478495 try :
@@ -482,18 +499,18 @@ def transform_into_tables(
482499 df .copy (deep = True ),
483500 currency_df = currency_df ,
484501 item_base_types = item_base_types ,
485- current_hour = current_hour ,
502+ current_hours = current_hours ,
486503 )
487504 self ._process_unidentified_item_table (
488505 df .copy (deep = True ),
489506 currency_df = currency_df ,
490507 item_base_types = item_base_types ,
491- current_hour = current_hour ,
508+ current_hours = current_hours ,
492509 )
493510 self ._process_item_modifier_table (
494511 df .copy (deep = True ),
495512 item_id = item_id ,
496- current_hour = current_hour ,
513+ current_hours = current_hours ,
497514 )
498515 logger .debug ("Successfully transformed data into tables." )
499516
@@ -508,13 +525,17 @@ def end_of_hour_cleanup(self):
508525class UniquePoEAPIDataTransformer (PoEAPIDataTransformerBase ):
509526 @sync_timing_tracker
510527 def _create_item_modifier_table (
511- self , df : pd .DataFrame , * , item_id : pd .Series , current_hour : int
528+ self ,
529+ df : pd .DataFrame ,
530+ * ,
531+ item_id : pd .Series ,
532+ current_hours : dict [int , int ],
512533 ) -> pd .DataFrame :
513534 """
514535 A similiar process to creating the item table, only this time the
515536 relevant column contains a list and not a JSON-object
516537 """
517- item_modifier_columns = ["name" , "explicitMods" ]
538+ item_modifier_columns = ["name" , "explicitMods" , "league" ]
518539 item_modifier_df = df .loc [
519540 self .price_found_mask ,
520541 item_modifier_columns ,
@@ -525,19 +546,23 @@ def _create_item_modifier_table(
525546 ].reset_index ()
526547
527548 item_modifier_df ["itemId" ] = item_id
549+ item_modifier_df ["leagueId" ] = item_modifier_df ["league" ].map (self .league_to_id )
550+ item_modifier_df ["createdHoursSinceLaunch" ] = item_modifier_df ["leagueId" ].map (
551+ current_hours
552+ )
528553 item_modifier_df = item_modifier_df .explode ("explicitMods" , ignore_index = True )
529554
530555 item_modifier_df .rename ({"explicitMods" : "modifier" }, axis = 1 , inplace = True )
531556
532- item_modifier_df ["createdHoursSinceLaunch" ] = current_hour
533-
534557 return item_modifier_df
535558
536559 @sync_timing_tracker
537560 def _transform_item_modifier_table (
538- self , item_modifier_df : pd .DataFrame
561+ self ,
562+ item_modifier_df : pd .DataFrame ,
539563 ) -> pd .DataFrame :
540564 item_modifier_df = self .roll_processor .add_rolls (df = item_modifier_df )
565+
541566 return item_modifier_df
542567
543568 @property
0 commit comments