Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Error in trackpy.emsd() function: TypeError: mean() got an unexpected keyword argument 'level' #757

Closed
Jelle111 opened this issue Mar 7, 2024 · 5 comments

Comments

@Jelle111
Copy link

Jelle111 commented Mar 7, 2024

I encountered an error while using the trackpy.emsd() function in the trackpy library. When calling trackpy.emsd() with my trajectory data;

em = tp.emsd(tm, 100/117., 20)

I received the following error:

TypeError: mean() got an unexpected keyword argument 'level'

Steps to Reproduce:

Execute the walkthrough tutorial with own Tif file
Call the trackpy.emsd() function with the trajectory data.
Expected Behavior:
I expected the trackpy.emsd() function to compute the ensemble mean squared displacement (EMSD) without encountering any errors.

Actual Behavior:
Instead, I received a TypeError indicating that the mean() function received an unexpected keyword argument 'level'.

Additional Information:

Version of trackpy library: 0.6.2
Operating System: MacOS Sonoma 14.2.1 with Apple M2 chip
Python version: 3.11.5

@b-grimaud
Copy link

Can you post the full trace ?
Which version of pandas are you using ?

@xyc2718
Copy link

xyc2718 commented Mar 9, 2024

Due to changes in pandas version 2.0 and later, df.sum(level=1) is replaced by df.groupby(level=1).sum(), causing the emsd() function to be unavailable. I hope the author can update it as soon as possible.

hz-xiaxz pushed a commit to hz-xiaxz/trackpy that referenced this issue Mar 9, 2024
@hz-xiaxz hz-xiaxz mentioned this issue Mar 9, 2024
@Jelle111
Copy link
Author

Can you post the full trace ? Which version of pandas are you using ?

Full trace:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[65], line 2
      1 #error: mean() got an unexpected keyword argument 'level'
----> 2 em = tp.emsd(tm, 100/117., 20)

File /Applications/anaconda3/lib/python3.11/site-packages/trackpy/motion.py:235, in emsd(traj, mpp, fps, max_lagtime, detail, pos_columns)
    233     ids.append(pid)
    234 msds = pandas_concat(msds, keys=ids, names=['particle', 'frame'])
--> 235 results = msds.mul(msds['N'], axis=0).mean(level=1)  # weighted average
    236 results = results.div(msds['N'].mean(level=1), axis=0)  # weights normalized
    237 # Above, lagt is lumped in with the rest for simplicity and speed.
    238 # Here, rebuild it from the frame index.

File /Applications/anaconda3/lib/python3.11/site-packages/pandas/core/frame.py:11335, in DataFrame.mean(self, axis, skipna, numeric_only, **kwargs)
  11327 @doc(make_doc("mean", ndim=2))
  11328 def mean(
  11329     self,
   (...)
  11333     **kwargs,
  11334 ):
> 11335     result = super().mean(axis, skipna, numeric_only, **kwargs)
  11336     if isinstance(result, Series):
  11337         result = result.__finalize__(self, method="mean")

File /Applications/anaconda3/lib/python3.11/site-packages/pandas/core/generic.py:11992, in NDFrame.mean(self, axis, skipna, numeric_only, **kwargs)
  11985 def mean(
  11986     self,
  11987     axis: Axis | None = 0,
   (...)
  11990     **kwargs,
  11991 ) -> Series | float:
> 11992     return self._stat_function(
  11993         "mean", nanops.nanmean, axis, skipna, numeric_only, **kwargs
  11994     )

File /Applications/anaconda3/lib/python3.11/site-packages/pandas/core/generic.py:11945, in NDFrame._stat_function(self, name, func, axis, skipna, numeric_only, **kwargs)
  11934 @final
  11935 def _stat_function(
  11936     self,
   (...)
  11942     **kwargs,
  11943 ):
  11944     assert name in ["median", "mean", "min", "max", "kurt", "skew"], name
> 11945     nv.validate_func(name, (), kwargs)
  11947     validate_bool_kwarg(skipna, "skipna", none_allowed=False)
  11949     return self._reduce(
  11950         func, name=name, axis=axis, skipna=skipna, numeric_only=numeric_only
  11951     )

File /Applications/anaconda3/lib/python3.11/site-packages/pandas/compat/numpy/function.py:416, in validate_func(fname, args, kwargs)
    413     return validate_stat_func(args, kwargs, fname=fname)
    415 validation_func = _validation_funcs[fname]
--> 416 return validation_func(args, kwargs)

File /Applications/anaconda3/lib/python3.11/site-packages/pandas/compat/numpy/function.py:88, in CompatValidator.__call__(self, args, kwargs, fname, max_fname_arg_count, method)
     86     validate_kwargs(fname, kwargs, self.defaults)
     87 elif method == "both":
---> 88     validate_args_and_kwargs(
     89         fname, args, kwargs, max_fname_arg_count, self.defaults
     90     )
     91 else:
     92     raise ValueError(f"invalid validation method '{method}'")

File /Applications/anaconda3/lib/python3.11/site-packages/pandas/util/_validators.py:223, in validate_args_and_kwargs(fname, args, kwargs, max_fname_arg_count, compat_args)
    218         raise TypeError(
    219             f"{fname}() got multiple values for keyword argument '{key}'"
    220         )
    222 kwargs.update(args_dict)
--> 223 validate_kwargs(fname, kwargs, compat_args)

File /Applications/anaconda3/lib/python3.11/site-packages/pandas/util/_validators.py:164, in validate_kwargs(fname, kwargs, compat_args)
    142 """
    143 Checks whether parameters passed to the **kwargs argument in a
    144 function `fname` are valid parameters as specified in `*compat_args`
   (...)
    161 map to the default values specified in `compat_args`
    162 """
    163 kwds = kwargs.copy()
--> 164 _check_for_invalid_keys(fname, kwargs, compat_args)
    165 _check_for_default_values(fname, kwds, compat_args)

File /Applications/anaconda3/lib/python3.11/site-packages/pandas/util/_validators.py:138, in _check_for_invalid_keys(fname, kwargs, compat_args)
    136 if diff:
    137     bad_arg = next(iter(diff))
--> 138     raise TypeError(f"{fname}() got an unexpected keyword argument '{bad_arg}'")

TypeError: mean() got an unexpected keyword argument 'level'

Pandas version: 2.1.4

@hz-xiaxz
Copy link

Just found this issue is duplicated with #750

nkeim added a commit that referenced this issue May 30, 2024
@nkeim
Copy link
Contributor

nkeim commented May 30, 2024

Closed for good (hopefully) by #758

@nkeim nkeim closed this as completed May 30, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants