Какая операция вычитания выполняется здесь? - PullRequest
0 голосов
/ 30 июня 2018

У меня есть DataFrame с количеством столбцов и Series. Оба имеют одинаковые DateTimeIndex.

DataFrame:

>>> print(df)

                 AAPL      GOOG       MSFT         AMZN        FB
2018-01-01        NaN       NaN        NaN          NaN       NaN
2018-01-02  -0.667375 -1.567656  -1.161474    -0.674142 -1.886490
2018-01-03   2.004473 -2.802214 -24.084166    -2.447172  2.346972
2018-01-04  -4.261619 -1.471697  -0.027939    -1.753661 -1.835053
2018-01-05  -1.008718 -2.816736  -1.524315    -1.001672  0.080345
2018-01-06 -30.325012 -1.056776  -1.190017  2319.212083 -1.847443
2018-01-07   0.497589  8.588272  -2.434537    -0.793424 -1.194649
2018-01-08  -1.650655 -0.583868 -10.141386     2.704900  7.449458
2018-01-09   1.821119 -6.742207  -0.710584    -0.003800 -1.535461
2018-01-10  -0.624853  0.030330   0.405643    -0.513841 -0.775323

Series:

>>> print(ser)

2018-01-01           NaN
2018-01-02     -1.191427
2018-01-03     -4.996421
2018-01-04     -1.869994
2018-01-05     -1.254219
2018-01-06    456.958567
2018-01-07      0.932650
2018-01-08     -0.444310
2018-01-09     -1.434187
2018-01-10     -0.295609

Если я попытаюсь вычесть ряд из кадра данных, я получу следующий результат:

>>> df - ser

            2018-01-01 00:00:00  2018-01-02 00:00:00  2018-01-03 00:00:00  \
2018-01-01                  NaN                  NaN                  NaN   
2018-01-02                  NaN                  NaN                  NaN   
2018-01-03                  NaN                  NaN                  NaN   
2018-01-04                  NaN                  NaN                  NaN   
2018-01-05                  NaN                  NaN                  NaN   
2018-01-06                  NaN                  NaN                  NaN   
2018-01-07                  NaN                  NaN                  NaN   
2018-01-08                  NaN                  NaN                  NaN   
2018-01-09                  NaN                  NaN                  NaN   
2018-01-10                  NaN                  NaN                  NaN   

            2018-01-04 00:00:00  2018-01-05 00:00:00  2018-01-06 00:00:00  \
2018-01-01                  NaN                  NaN                  NaN   
2018-01-02                  NaN                  NaN                  NaN   
2018-01-03                  NaN                  NaN                  NaN   
2018-01-04                  NaN                  NaN                  NaN   
2018-01-05                  NaN                  NaN                  NaN   
2018-01-06                  NaN                  NaN                  NaN   
2018-01-07                  NaN                  NaN                  NaN   
2018-01-08                  NaN                  NaN                  NaN   
2018-01-09                  NaN                  NaN                  NaN   
2018-01-10                  NaN                  NaN                  NaN   

            2018-01-07 00:00:00  2018-01-08 00:00:00  2018-01-09 00:00:00  \
2018-01-01                  NaN                  NaN                  NaN   
2018-01-02                  NaN                  NaN                  NaN   
2018-01-03                  NaN                  NaN                  NaN   
2018-01-04                  NaN                  NaN                  NaN   
2018-01-05                  NaN                  NaN                  NaN   
2018-01-06                  NaN                  NaN                  NaN   
2018-01-07                  NaN                  NaN                  NaN   
2018-01-08                  NaN                  NaN                  NaN   
2018-01-09                  NaN                  NaN                  NaN   
2018-01-10                  NaN                  NaN                  NaN   

            2018-01-10 00:00:00  AAPL  GOOG  MSFT  AMZN  FB  
2018-01-01                  NaN   NaN   NaN   NaN   NaN NaN  
2018-01-02                  NaN   NaN   NaN   NaN   NaN NaN  
2018-01-03                  NaN   NaN   NaN   NaN   NaN NaN  
2018-01-04                  NaN   NaN   NaN   NaN   NaN NaN  
2018-01-05                  NaN   NaN   NaN   NaN   NaN NaN  
2018-01-06                  NaN   NaN   NaN   NaN   NaN NaN  
2018-01-07                  NaN   NaN   NaN   NaN   NaN NaN  
2018-01-08                  NaN   NaN   NaN   NaN   NaN NaN  
2018-01-09                  NaN   NaN   NaN   NaN   NaN NaN  
2018-01-10                  NaN   NaN   NaN   NaN   NaN NaN  

Я также получаю следующее предупреждение:

RuntimeWarning: Cannot compare type 'Timestamp' with type 'str', sort order is
undefined for incomparable objects
  return this.join(other, how=how, return_indexers=return_indexers)

Я знаю, что могу добиться поэлементного вычитания, используя DataFrame.sub

>>> res = df.sub(ser, axis=0)
>>> print(res)

                  AAPL        GOOG        MSFT         AMZN          FB
2018-01-01         NaN         NaN         NaN          NaN         NaN
2018-01-02    0.524052   -0.376229    0.029954     0.517286   -0.695062
2018-01-03    7.000894    2.194208  -19.087745     2.549249    7.343393
2018-01-04   -2.391625    0.398297    1.842054     0.116333    0.034941
2018-01-05    0.245501   -1.562517   -0.270096     0.252547    1.334565
2018-01-06 -487.283579 -458.015343 -458.148584  1862.253516 -458.806010
2018-01-07   -0.435061    7.655622   -3.367187    -1.726074   -2.127300
2018-01-08   -1.206344   -0.139558   -9.697076     3.149210    7.893768
2018-01-09    3.255306   -5.308020    0.723603     1.430386   -0.101274
2018-01-10   -0.329244    0.325939    0.701251    -0.218232   -0.479714

Однако я не знаю:

  • Какая операция выполняется с использованием Dataframe.__sub__?

  • Кроме того, мне кажется очень нелогичным, что вычитание Series из DataFrame с соответствующими Index типами / содержимым, не делает поэлементно вычитание. В чем причина не делать этого?

1 Ответ

0 голосов
/ 01 июля 2018

Читая документы, с которыми вы так хорошо связаны, мы находим следующее:

ось: {0, 1, «индекс», «столбцы»}

Для ввода серий: ось, совпадающая с индексом серии на

И значением по умолчанию является 'columns'. Это дает нам подсказку о том, что происходит, когда вы делаете вычитание, т. Е .:

df.sub(s) # by not specifying axis you are passing axis=1 / 'columns'

или

df - s

Ничто из этого не будет работать так, как вы хотите. Теперь давайте вернемся к желтому полю. Другая альтернатива - 'index', и мы соответствовали бы индексу (который звучит в точности так, как вы ожидаете), то есть: * 10101 *

df.sub(s, axis=0) # or 'index' <-- note that you pass a param here

или

(df.T - s).T  #swap columns and rows and swap back again (transpose)

Почему? Это вопрос дизайна. Разработчики могли бы также установить 'index' по умолчанию, но по неизвестным причинам (и, вероятно, потому, что он используется чаще, и что базовый пакет за пандами, numpy, работает таким образом), они выбрали columns. Поведение numpy легко проверяется следующим образом: df.values - s.values, который действительно работает со столбцами, где вас интересуют строки (индекс).

Коротко почему: numpy работает так.


Наиболее элегантным решением для этого является использование .sub() и указание axis='index'. (или 0, но индекс может быть более читабельным в этом случае)

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