Применение функций numpy к объектам pandas.Series, которые работают со всеми значениями - PullRequest
0 голосов
/ 26 февраля 2019

Я хочу использовать функцию numpy.unwrap для объекта pandas.Series, но не могу понять, как его применить:

>>> import numpy as np
>>> import pandas as pd
>>>
>>> t = np.arange(0,1,0.05)
>>> ang = pd.Series((15*t)%(2*np.pi), t)
>>> np.unwrap(ang)
array([  0.  ,   0.75,   1.5 ,   2.25,   3.  ,   3.75,   4.5 ,   5.25,
         6.  ,   6.75,   7.5 ,   8.25,   9.  ,   9.75,  10.5 ,  11.25,
        12.  ,  12.75,  13.5 ,  14.25])
# this produces an np.array with the correct result, but not a Series
>>> ang.apply(np.unwrap)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\app\python\anaconda\2\lib\site-packages\pandas\core\series.py", line 3192, in apply
    mapped = lib.map_infer(values, f, convert=convert_dtype)
  File "pandas/_libs/src\inference.pyx", line 1472, in pandas._libs.lib.map_infer
  File "c:\app\python\anaconda\2\lib\site-packages\numpy\lib\function_base.py", line 1795, in unwrap
    dd = diff(p, axis=axis)
  File "c:\app\python\anaconda\2\lib\site-packages\numpy\lib\function_base.py", line 1571, in diff
    slice1[axis] = slice(1, None)
IndexError: list assignment index out of range
>>> ang.map(np.unwrap)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "c:\app\python\anaconda\2\lib\site-packages\pandas\core\series.py", line 2996, in map
    arg, na_action=na_action)
  File "c:\app\python\anaconda\2\lib\site-packages\pandas\core\base.py", line 1004, in _map_values
    new_values = map_f(values, mapper)
  File "pandas/_libs/src\inference.pyx", line 1472, in pandas._libs.lib.map_infer
  File "c:\app\python\anaconda\2\lib\site-packages\numpy\lib\function_base.py", line 1795, in unwrap
    dd = diff(p, axis=axis)
  File "c:\app\python\anaconda\2\lib\site-packages\numpy\lib\function_base.py", line 1571, in diff
    slice1[axis] = slice(1, None)
IndexError: list assignment index out of range

Я могу использовать явную конструкцию новой Серии:

pd.Series(np.unwrap(ang), ang.index)

, но это кажется непонятным.Есть ли способ лучше?Я полагаю, я всегда мог создать его, но это также кажется неудовлетворительным:

def map_values(series, func):
    return pd.Series(func(series.values), series.index)
map_values(ang, np.unwrap)

1 Ответ

0 голосов
/ 26 февраля 2019

Вы можете использовать transform , но, как ни странно, он не работает прямо из коробки.Я получил это, чтобы возвратить Серию как это:

import numpy as np
import pandas as pd

t = np.arange(0, 1, 0.05)
ang = pd.Series((15 * t) % (2 * np.pi), t)

result = ang.to_frame().transform(np.unwrap).squeeze()

Выполнение result = ang.transform(np.unwrap) напрямую возвращает пустой массив, это не то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...