Панды .corr (), возвращающие "__" - PullRequest
0 голосов
/ 20 марта 2019

Работало отлично, пока не получилось, и понятия не имею, что я делаю не так.Я сократил его до очень простого набора данных t:

    1   2   3   4   5   6   7   8
0   3   16  3   2   17  2   3   2
1   3   16  3   2   19  4   3   2
2   3   16  3   2   9   2   3   2
3   3   16  3   2   19  1   3   2
4   3   16  3   2   17  2   3   1
5   3   16  3   2   17  1   17  1
6   3   16  3   2   19  1   17  2
7   3   16  3   2   19  4   3   1
8   3   16  3   2   19  1   3   2
9   3   16  3   2   7   2   17  1




corr = t.corr()
corr

возвращает "__"

и

sns.heatmap (corr)

выдает следующую ошибку «массив нулевого размера к минимуму операции сокращения, у которого нет идентификатора»

Понятия не имею, что не так?Я попробовал это с большим количеством строк и т. Д., И дважды проверил, что у меня нет пропущенных значений ... что происходит?У меня раньше была такая симпатичная карта тепла, я пытался

1 Ответ

1 голос
/ 07 апреля 2019

Проблема здесь не в самом кадре данных, а в его происхождении. Я обнаружил ту же проблему, используя drop или iloc в кадре данных. Ключ - это глобальный тип, который имеет датафрейм. Допустим, у нас есть следующий фрейм данных:

list_ex = [[1.1,2.1,3.1,4,5,6,7,8],[1.2,2.2,3.3,4.1,5.5,6,7,8], 
[1.3,2.3,3,4,5,6.2,7,8],[1.4,2.4,3,4,5,6.2,7.3,8.1]]
list_ex_new=pd.DataFrame(list_ex)

Вы можете без проблем вычислить list_ex_new.corr (). Если вы проверите аргументы фрейма данных с помощью vars (list_ex_new), вы получите:

{'_is_copy': None, '_data': BlockManager
 Items: RangeIndex(start=0, stop=8, step=1)
 Axis 1: RangeIndex(start=0, stop=4, step=1)
 FloatBlock: slice(0, 8, 1), 8 x 4, dtype: float64, '_item_cache': {}}

где dtype равно float64.

Новый фрейм данных можно определить с помощью list_new_new = list_ex_new.iloc [1:,:], и корреляции можно успешно оценить. Проверка атрибутов dataframe показывает: {'_is_copy':, '_data': BlockManager Элементы: RangeIndex (начало = 0, остановка = 8, шаг = 1) Ось 1: RangeIndex (начало = 1, остановка = 4, шаг = 1) FloatBlock: срез (0, 8, 1), 8 x 3, dtype: float64, '_item_cache': {}}

где dtype все еще float64.

Третий кадр данных может быть определен:

list_ex_w = [['a','a','a','a','a','a','a','a'],[1.1,2.1,3.1,4,5,6,7,8], 
[1.2,2.2,3.3,4.1,5.5,6,7,8],[1.3,2.3,3,4,5,6.2,7,8], 
[1.4,2.4,3,4,5,6.2,7.3,8.1]]
list_ex_new_w=pd.DataFrame(list_ex_w)

Оценка корреляции фрейма данных приведет к пустому фрейму данных, поскольку атрибуты list_ex_w выглядят следующим образом:

 {'_is_copy': None, '_data': BlockManager
 Items: RangeIndex(start=0, stop=8, step=1)
 Axis 1: Index(['a', 1, 2, 3, 4], dtype='object')
 ObjectBlock: slice(0, 8, 1), 8 x 5, dtype: object, '_item_cache': {}}

Где сейчас dtype - это 'объект', поскольку фрейм данных не согласован в своих типах есть струны и плавает вместе. Наконец, может быть сгенерирован четвертый кадр данных:

 list_new_new_w = list_ex_new_w.iloc[1:,:]

в результате будет сгенерирован тот же самый блокнот, но без 'a', по-видимому, совершенно правильный кадр данных для вычисления корреляций. Однако это вернет снова пустой фрейм данных. Окончательная проверка атрибутов dataframe показывает:

vars(list_new_new_w)

{'_is_copy': None, '_data': BlockManager
 Items: Index([1, 2, 3, 4], dtype='object')
 Axis 1: RangeIndex(start=0, stop=8, step=1)
 ObjectBlock: slice(0, 4, 1), 4 x 8, dtype: object, '_item_cache': {}}

где dtype все еще объект, поэтому метод corr возвращает пустой фрейм данных. Эту проблему можно решить с помощью astype (float)

 list_new_new_w.astype(float).corr()

Таким образом, кажется, что панды в то время, когда corr или cov среди других методов вызываются, генерируют новый фрейм данных с такими же атрибутами, игнорируя случай, когда новый фрейм данных имеет согласованный глобальный тип. Я проверял исходный код панд и понимаю, что это правильная интерпретация реализации панд.

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