@@ -32,8 +32,13 @@ def __init__(self, df):
3232 self .df = df
3333 self .aliases = {}
3434 self .alias_dtypes = {} # Optional output types for each alias
35+ self .constant_aliases = set () # Optional set of constants that should not be materialized
3536
36- def add_alias (self , name , expression , dtype = None ):
37+ def add_alias (self , name , expression , dtype = None , is_constant = False ):
38+ """
39+ Add an alias expression to the DataFrame.
40+ Optionally specify output dtype and whether it's a constant (scalar-only).
41+ """
3742 try :
3843 dummy_env = {k : 1 for k in list (self .df .columns ) + list (self .aliases .keys ())}
3944 dummy_env .update (self ._default_functions ())
@@ -43,6 +48,10 @@ def add_alias(self, name, expression, dtype=None):
4348 self .aliases [name ] = expression
4449 if dtype is not None :
4550 self .alias_dtypes [name ] = dtype
51+ if is_constant :
52+ if name in self ._resolve_dependencies () and self ._resolve_dependencies ()[name ]:
53+ print (f"[Alias warning] '{ name } ' marked as constant but has dependencies." )
54+ self .constant_aliases .add (name )
4655
4756 def _default_functions (self ):
4857 import math
@@ -137,7 +146,8 @@ def materialize_alias0(self, name, dtype=None):
137146 result_dtype = dtype or self .alias_dtypes .get (name )
138147 if result_dtype is not None :
139148 result = result .astype (result_dtype )
140- self .df [name ] = result
149+ if name not in self .constant_aliases :
150+ self .df [name ] = result
141151
142152 def materialize_alias (self , name , cleanTemporary = False , dtype = None ):
143153 if name not in self .aliases :
@@ -160,6 +170,8 @@ def visit(n):
160170 original_columns = set (self .df .columns )
161171
162172 for alias in to_materialize :
173+ if alias in self .constant_aliases :
174+ continue
163175 local_env = {col : self .df [col ] for col in self .df .columns }
164176 local_env .update ({k : self .df [k ] for k in self .aliases if k in self .df })
165177 try :
@@ -179,6 +191,8 @@ def visit(n):
179191 def materialize_all (self , dtype = None ):
180192 order = self ._topological_sort ()
181193 for name in order :
194+ if name in self .constant_aliases :
195+ continue
182196 try :
183197 local_env = {col : self .df [col ] for col in self .df .columns }
184198 local_env .update ({k : self .df [k ] for k in self .df .columns if k in self .aliases })
0 commit comments