Панды интерполируют возвращаемые NaN

#python-2.7 #pandas #time-series #interpolation

#python-2.7 #панды #временные ряды #интерполяция

Вопрос:

Я пытаюсь выполнить базовую интерполяцию данных о местоположении с интервалами 60 Гц (~ 16 мс). Когда я пытаюсь использовать интерполяцию pandas 0.14 по фрейму данных, он сообщает мне, что у меня есть только NaNs в моем наборе данных (неверно). Когда я пытаюсь запустить его по отдельным сериям, извлеченным из фрейма данных, он возвращает ту же серию без заполнения NANS. Я пробовал устанавливать индексы в целые числа, используя разные методы, играя с параметрами оси и ограничения функции интерполяции — без кубиков. Что я делаю не так?

 df.head(5) : 
         x        y        ms
0  20.5815  14.1821  333.3333
1      NaN      NaN       350
2  20.6112  14.2013  366.6667
3      NaN      NaN  383.3333
4  20.5349  14.2232       400


df = df.set_index(df.ms) # set indices to milliseconds
  

Когда я пытаюсь запустить

 df.interpolate(method='values')
  

Я получаю эту ошибку:

 ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-462-cb0f1f01eb84> in <module>()
     12 
     13 
---> 14 df.interpolate(method='values')
     15 
     16 

/Users/jsb/anaconda/lib/python2.7/site-packages/pandas/core/generic.pyc in interpolate(self, method, axis, limit, inplace, downcast, **kwargs)
   2511 
   2512         if self._data.get_dtype_counts().get('object') == len(self.T):
-> 2513             raise TypeError("Cannot interpolate with all NaNs.")
   2514 
   2515         # create/use the index

TypeError: Cannot interpolate with all NaNs.
  

Я также пробовал запускать отдельные серии, которые возвращают только то, что я вставил:

 temp = df.x
temp.interpolate(method='values')

333.333333    20.5815
350.000000        NaN
366.666667    20.6112
383.333333        NaN
400.000000    20.5349 Name: x, dtype: object
  

Редактировать :

Спасибо Джеффу за вдохновляющее решение.

Добавление:

 df[['x','y','ms']] = df[['x','y','ms']].astype(float)
  

перед

 df.interpolate(method='values')
  

интерполяция сделала свое дело.

Комментарии:

1. можете ли вы показать df.info (); у prob есть типы объектов

2. df0.info () DataFrame’> Float64Index: 100 записей, от 0.0 до 1650.0 столбцов данных (всего 3 столбца): x 46 ненулевых объектов y 46 ненулевых объектов ms 100 ненулевых объектов dtypes: object(3)

3. это типы объектов — должны ли они быть преобразованы во что-то?

4. object dtypes не очень хороши. только строковый тип должен быть object dtype. как вы их сгенерировали / прочитали?

5. они только что были загружены с помощью ванильного pd.csv_read. Единственное, что я сделал, это удалил дополнительную строку заголовка df = df[1:].reset_index(drop=True) и переименовал столбцы df.rename(columns={'X center':'x', 'Y center': 'y'},inplace=True) . Что-нибудь я делаю не так?

Ответ №1:

На основе вашего редактирования с реквизитами Джеффу за вдохновляющее решение.

Добавление:

 df = df.astype(float)
  

перед

 df.interpolate(method='values')
  

интерполяция тоже помогла мне. Если вы не выбираете набор столбцов, вам не нужно указывать столбцы.

Ответ №2:

Я не могу воспроизвести ошибку (см. Ниже Пример с возможностью копирования / вставки), можете ли вы убедиться, что данные, которые вы показываете, действительно отражают ваши данные?

 In [137]: from StringIO import StringIO

In [138]: df = pd.read_csv(StringIO("""         x        y        ms
     ...: 0  20.5815  14.1821  333.3333
     ...: 1      NaN      NaN       350
     ...: 2  20.6112  14.2013  366.6667
     ...: 3      NaN      NaN  383.3333
     ...: 4  20.5349  14.2232       400"""), delim_whitespace=True)

In [140]: df = df.set_index(df.ms)

In [142]: df.interpolate(method='values')
Out[142]: 
                 x         y        ms
ms                                    
333.3333  20.58150  14.18210  333.3333
350.0000  20.59635  14.19170  350.0000
366.6667  20.61120  14.20130  366.6667
383.3333  20.57305  14.21225  383.3333
400.0000  20.53490  14.22320  400.0000
  

Комментарии:

1. Я запустил ваш, и он также воспроизвел. Я также сделал следующее, чтобы добавить строки NaN: df = df.reindex(pd.Series(arange(0,hz2ms(60)*100,hz2ms(60)))) , где hz2ms — вспомогательная функция, которая возвращает 1000 / Гц