Thanks, understood. I wanted to be able to use symbols like "variables" 
and, at some point, allow transformations via SymPy. As a terrible example: 
z = x * log(y)
smart_func(df, z)
print(df[z])
That's not terribly important, however, mostly just convenience.

I submitted an issue here, maybe it will prove a simple fix: 
https://github.com/pandas-dev/pandas/issues/19654


On Saturday, February 10, 2018 at 1:18:10 AM UTC+3, Aaron Meurer wrote:
>
> Symbol objects being callable is something that we've wanted to remove 
> for some time, but I don't know if it will happen any time soon. 
> https://github.com/sympy/sympy/issues/3539 
>
> I don't know of any simple workarounds. My first thought was to use a 
> subclass, but I can't figure out how to make a subclass of a 
> callable() class not callable(). And you can't del Symbol.__call__ 
> because it uses __slots__. 
>
> The only thing I can recommend is to use any other kind of expression 
> than Symbol. Even Function('f')(x) isn't callable. 
>
> It would be nice if pandas had some way to indicate that an object 
> shouldn't be considered callable. I looked at the source and it 
> doesn't like there is one (it just checks callable(), 
>
> https://github.com/pandas-dev/pandas/blob/6485a36483884fb817800a8380a4a4197d6df4ad/pandas/core/common.py#L470).
>  
>
> Perhaps you should open a pandas issue about it. 
>
> Aaron Meurer 
>
> On Fri, Feb 9, 2018 at 10:53 AM, 'Nowan Ilfideme' via sympy 
> <sy...@googlegroups.com <javascript:>> wrote: 
> > Hi, I ran into problems while trying to use Symbols as columns for a 
> > pandas.DataFrame *. 
> > This is probably not relevant to SymPy development itself, but rather 
> just 
> > use. 
> > This seems to be a problem with both frameworks treating callable() 
> objects 
> > specially: 
> > 
> >>>> import pandas as pd 
> >>>> from sympy.abc import x, y 
> > 
> >>>> gg = pd.DataFrame([[1,2],[3,3],[4,5]], columns=[x,y]) 
> > 
> >>>> print(gg[[x]]) # works fine, but returns a DataFrame 
> >    x 
> > 0  1 
> > 1  3 
> > 2  4 
> >>>> print(gg[x]) 
> > Traceback (most recent call last): 
> >   File "<stdin>", line 1, in <module> 
> >   File "...\pandas\core\frame.py", line 1941, in __getitem__ 
> >     key = com._apply_if_callable(key, self) 
> >   File "...\pandas\core\common.py", line 441, in _apply_if_callable 
> >     return maybe_callable(obj, **kwargs) 
> >   File "...sympy\core\symbol.py", line 158, in __call__ 
> >     return Function(self.name)(*args) 
> >   File "...\sympy\core\function.py", line 761, in __new__ 
> >     obj = super(AppliedUndef, cls).__new__(cls, *args, **options) 
> >   File "...\sympy\core\function.py", line 431, in __new__ 
> >     pr = max(cls._should_evalf(a) for a in result.args) 
> >   File "...\sympy\core\function.py", line 431, in <genexpr> 
> >     pr = max(cls._should_evalf(a) for a in result.args) 
> >   File "...\sympy\core\function.py", line 449, in _should_evalf 
> >     if arg.is_Float: 
> >   File "...\pandas\core\generic.py", line 3081, in __getattr__ 
> >     return object.__getattribute__(self, name) 
> > AttributeError: 'DataFrame' object has no attribute 'is_Float' 
> > 
> > The way to get a pd.Series would be: 
> >>>> gg[[x]].iloc[:,0] # super uncomfortable... 
> > 0    1 
> > 1    3 
> > 2    4 
> > Name: x, dtype: int64 
> > 
> > 
> > Is there any reasonable way this interaction could be worked around? It 
> > seems like a problem on the Pandas end, or maybe even designed 
> > functionality, since functions work the same way (but fail faster): 
> > 
> >>>> fg = pd.DataFrame([[1,2],[3,3],[4,5]], columns=[f,g]) 
> >>>> fg[[f]] 
> >    <function f at 0x000000000F79BEB8> 
> > 0                                   1 
> > 1                                   3 
> > 2                                   4 
> >>>> fg[f] 
> > Traceback (most recent call last): 
> >   File "<stdin>", line 1, in <module> 
> >   File "...\pandas\core\frame.py", line 1941, in __getitem__ 
> >     key = com._apply_if_callable(key, self) 
> >   File "...\pandas\core\common.py", line 441, in _apply_if_callable 
> >     return maybe_callable(obj, **kwargs) 
> > TypeError: f() takes no arguments (1 given) 
> > 
> > But is there any way I can check whether the inputs are Symbols and 
> "freeze" 
> > them so that they become uncallable? Maybe some other workaround? Thanks 
> in 
> > advance. 
> > 
> > 
> > 
> > * Why am I doing this? Partially due to curiosity, and partially because 
> my 
> > users might end up doing the same. It turns out that using Symbols as 
> > variable placeholders in a data science workflow might be useful. 
> > 
> > -- 
> > You received this message because you are subscribed to the Google 
> Groups 
> > "sympy" group. 
> > To unsubscribe from this group and stop receiving emails from it, send 
> an 
> > email to sympy+un...@googlegroups.com <javascript:>. 
> > To post to this group, send email to sy...@googlegroups.com 
> <javascript:>. 
> > Visit this group at https://groups.google.com/group/sympy. 
> > To view this discussion on the web visit 
> > 
> https://groups.google.com/d/msgid/sympy/1f26bab1-a623-4054-b392-c1e78f0ac9a7%40googlegroups.com.
>  
>
> > For more options, visit https://groups.google.com/d/optout. 
>

-- 
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sympy+unsubscr...@googlegroups.com.
To post to this group, send email to sympy@googlegroups.com.
Visit this group at https://groups.google.com/group/sympy.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sympy/8e939cf3-78cc-463d-9af3-6abb53126db6%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to