Построение графика данных панд после расплавления панд происходит медленно и создает странную ось Y - PullRequest
0 голосов
/ 07 июня 2018

Это может быть вызвано тем, что я не понимаю, как работает pandas.melt, но я получаю странное поведение при построении "расплавленных" фреймов данных с использованием plotnine .Оба кадра были преобразованы из широкого в длинный формат.Один кадр со столбцом, содержащим строковые значения (df_slow), а другой - только с числовыми значениями (df_fast).

Следующий код дает другое поведение.Построение df_slow является медленным и дает странно выглядящую ось Y.Построение df_fast выглядит нормально и быстро.Я предполагаю, что таяние панд делает что-то странное с данными, которые вызывают такое поведение.Смотрите примеры графиков.

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import plotnine as p9

SIZE = 200
value = np.random.rand(SIZE, 1)

# Create test data, one with a column containing strings, one with only numeric values
df_slow = pd.DataFrame({'value': value.flatten(), 'string_column': ['A']*SIZE})
df_fast = pd.DataFrame({'value': value.flatten()})

# Set index
df_slow = df_slow.reset_index()
df_fast = df_fast.reset_index()

# Convert 'df_slow', 'df_fast' to long format
df_slow = pd.melt(df_slow, id_vars='index')
df_fast = pd.melt(df_fast, id_vars='index')

print(df_slow.head())
print(df_fast.head())
df_slow = df_slow[df_slow.variable == 'value']

# This is slow and has many breaks on y-axis
p = (p9.ggplot(df_slow, p9.aes(x='index', y='value')) + p9.geom_point())
p.draw()

# This is much faster and y-axis looks good
p = (p9.ggplot(df_fast, p9.aes(x='index', y='value')) + p9.geom_point())
p.draw()

медленный и странный сюжет

быстрый и красивый сюжет

Возможное исправление

Изменение типа столбца «значение» в df_slow приводит к тому, что при построении он ведет себя как df_fast.

# This makes df_slow behave like df_fast when plotting
df_slow['value'] = df_slow.value.astype(np.float64)

Вопрос

Это ошибка в plotnine (или панд ) или я что-то не так делаю?

Ответ

При повороте двух столбцов с разными типами данных, в данном случае это строка и число с плавающей точкой, я думаю, этоимеет смысл, что результирующий столбец, содержащий как строки, так и числа с плавающей точкой, будет иметь тип объекта.Как указывал ALollz, это, вероятно, заставляет plotnine интерпретировать значения как строки, вызывающие такое поведение.

...