How to reprogram python pandas TimeSeries containing dytpe decimal values?

I have a pandas Series object populated with decimal dtype Decimal numbers. I would like to use the new pandas 0.8 function to reselect decimal time series as follows:

 resampled = ts.resample('D', how = 'mean') 

When I try this, I get the error "GroupByError: No numbereric to aggregate". I assume the problem is that np.mean is used internaly to re-configure the values, and np.mean is expecting a float instead of Decimals.

Thanks to the help of this forum, I was able to solve a similar question using groupBy and the apply function, but I would also like to use the cool resample function.

How to use middle method for pandas TimeSeries values ​​with decimal type?

Any idea how to solve this?

Here is the full ipython session generating the error:

 In [37]: from decimal import Decimal In [38]: from pandas import * In [39]: rng = date_range('1.1.2012',periods=48, freq='H') In [40]: rnd = np.random.randn(len(rng)) In [41]: rnd_dec = [Decimal(x) for x in rnd] In [42]: ts = Series(rnd_dec, index=rng) In [43]: ts[0:3] Out[43]: 2012-01-01 00:00:00 -0.1020591335576267189022559023214853368699550628 2012-01-01 01:00:00 0.99245713975437366283216533702216111123561859130 2012-01-01 02:00:00 1.80080710727195758558139004890108481049537658691 Freq: H In [44]: type(ts[0]) Out[44]: decimal.Decimal In [45]: ts.resample('D', how = 'mean') --------------------------------------------------------------------------- GroupByError Traceback (most recent call last) C:\Users\THM\Documents\Python\<ipython-input-45-09c898403ddd> in <module>() ----> 1 ts.resample('D', how = 'mean') C:\Python27\lib\site-packages\pandas\core\generic.pyc in resample(self, rule, how, axis, fill_method, closed, label, convention, kind, loffset, l imit, base) 187 fill_method=fill_method, convention=convention, 188 limit=limit, base=base) --> 189 return sampler.resample(self) 190 191 def first(self, offset): C:\Python27\lib\site-packages\pandas\tseries\resample.pyc in resample(self, obj) 65 66 if isinstance(axis, DatetimeIndex): ---> 67 rs = self._resample_timestamps(obj) 68 elif isinstance(axis, PeriodIndex): 69 offset = to_offset(self.freq) C:\Python27\lib\site-packages\pandas\tseries\resample.pyc in _resample_timestamps(self, obj) 184 if len(grouper.binlabels) < len(axlabels) or self.how is not None: 185 grouped = obj.groupby(grouper, axis=self.axis) --> 186 result = grouped.aggregate(self._agg_method) 187 else: 188 # upsampling shortcut C:\Python27\lib\site-packages\pandas\core\groupby.pyc in aggregate(self, func_or_funcs, *args, **kwargs) 1215 """ 1216 if isinstance(func_or_funcs, basestring): -> 1217 return getattr(self, func_or_funcs)(*args, **kwargs) 1218 1219 if hasattr(func_or_funcs,'__iter__'): C:\Python27\lib\site-packages\pandas\core\groupby.pyc in mean(self) 290 """ 291 try: --> 292 return self._cython_agg_general('mean') 293 except GroupByError: 294 raise C:\Python27\lib\site-packages\pandas\core\groupby.pyc in _cython_agg_general(self, how) 376 377 if len(output) == 0: --> 378 raise GroupByError('No numeric types to aggregate') 379 380 return self._wrap_aggregated_output(output, names) GroupByError: No numeric types to aggregate 

Any help is appreciated. Thanks Thomas

+6
source share
2 answers

I found the answer myself. You can provide the function with an β€œlike” argument to reselect:

 f = lambda x: Decimal(np.mean(x)) ts.resample('D', how = f) 
+7
source

I get an error for object type columns in a DataFrame. I went around it using

df.resample('D', method='ffill', how=lambda c: c[-1]) >

0
source

Source: https://habr.com/ru/post/921856/


All Articles