Панды get_indexer возвращает все -1 за один интервал - PullRequest
0 голосов
/ 07 ноября 2018

Я не могу понять, почему этот поиск интервалов не дает мне того, что я ожидал, так как индекс 0 соответствует всем точкам данных в следующем примере:

import pandas  

dfLbl  = pandas.DataFrame( { 'Started':[554235706.051] , 'Stopped':[554240454.867] , 'Label':['LblVal'] } )
dfData = pandas.DataFrame( {'Angle': [-89.460618, -90.053987, -89.735639, -179.248331, 90.405555, 0.541808, 1.257457, 0.16111] ,
                            'time_s':[554237043.713062, 554238249.989954, 554235853.912149, 554237638.876251, 554237007.218903, 554239665.777394, 554238786.764156, 554239549.519223] })

print( "dfData\n{}".format( dfData ))
print( "\ndfLbl\n{}".format( dfLbl ))

lbl_intervals = pandas.IntervalIndex.from_arrays( dfLbl['Started'] , dfLbl['Stopped'] , closed='neither' )
lbl_indexes   = lbl_intervals.get_indexer( dfData['time_s'] )

print( "\nlbl_intervals\n{}".format( lbl_intervals ))
print( "\nlbl_indexes\n{}".format( lbl_indexes ))

print( "\n{}".format( pandas.DataFrame( { 'a <= x':  dfLbl.loc[0,'Started'] <= dfData['time_s'] , 'x < b' : dfData['time_s'] < dfLbl.loc[0,'Stopped']} )  ))
print(  "\nIntervalWidth={}".format( dfLbl['Stopped'] - dfLbl['Started'] ))

Что дает следующий вывод консоли

dfData
        Angle        time_s
0  -89.460618  5.542370e+08
1  -90.053987  5.542382e+08
2  -89.735639  5.542359e+08
3 -179.248331  5.542376e+08
4   90.405555  5.542370e+08
5    0.541808  5.542397e+08
6    1.257457  5.542388e+08
7    0.161110  5.542395e+08

dfLbl
    Label       Started       Stopped
0  LblVal  5.542357e+08  5.542405e+08

lbl_intervals
IntervalIndex([(554235706.051, 554240454.867)]
              closed='neither',
              dtype='interval[float64]')

lbl_indexes
[-1 -1 -1 -1 -1 -1 -1 -1]

   a <= x   x < b
0    True    True
1    True    True
2    True    True
3    True    True
4    True    True
5    True    True
6    True    True
7    True    True

IntervalWidth=0    4748.816
dtype: float64

Я полностью сбит с толку, поскольку, когда я вручную делаю неравенство, как вы видите в столбцах a <= x и x < b, это показывает, что данные time_s находятся в границах. Я проверил ширину индексатора не каким-то необоснованно небольшим числом. Что еще может быть не так? Есть ли что-то ошибочное в использовании одного интервала для такой операции? Приводит ли панда значение к какому-либо другому типу, который что-то ломает?

1 Ответ

0 голосов
/ 07 ноября 2018

Похоже, это была ошибка в версии панд, которую я использовал. Я просмотрел страницу GitHub Что нового и нашел несколько исправлений ошибок, связанных с индексацией. Итак, я обновился ...

$ pip install --upgrade pandas
...
Installing collected packages: pandas
  Found existing installation: pandas 0.22.0
    Uninstalling pandas-0.22.0:
      Successfully uninstalled pandas-0.22.0
Successfully installed pandas-0.23.4

И перезапустил скрипт и обнаружил, что вывод консоли теперь дает то, что ожидается ...

dfData
        Angle        time_s
0  -89.460618  5.542370e+08
1  -90.053987  5.542382e+08
2  -89.735639  5.542359e+08
3 -179.248331  5.542376e+08
4   90.405555  5.542370e+08
5    0.541808  5.542397e+08
6    1.257457  5.542388e+08
7    0.161110  5.542395e+08

dfLbl
    Label       Started       Stopped
0  LblVal  5.542357e+08  5.542405e+08

lbl_intervals
IntervalIndex([(554235706.051, 554240454.867)]
              closed='neither',
              dtype='interval[float64]')

lbl_indexes
[0 0 0 0 0 0 0 0] <--------- ALL ZEROS

   a <= x   x<b
0    True  True
1    True  True
2    True  True
3    True  True
4    True  True
5    True  True
6    True  True
7    True  True

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