#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 / Гц