Как создать сюжет для скрипки Matplotlib - PullRequest
0 голосов
/ 03 января 2019

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

Обрабатывать кадр данных pandas в скрипочном сюжете

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


x = np.random.poisson(lam =3, size=100)
y = np.random.choice(["S{}".format(i+1) for i in range(6)], size=len(x))
df = pd.DataFrame({"Scenario":y, "LMP":x})

fig, axes = plt.subplots()

axes.violinplot(dataset = [df[df.Scenario == 'S1']["LMP"],
                           df[df.Scenario == 'S2']["LMP"],
                           df[df.Scenario == 'S3']["LMP"],
                           df[df.Scenario == 'S4']["LMP"],
                           df[df.Scenario == 'S5']["LMP"],
                           df[df.Scenario == 'S6']["LMP"] ] )

Ошибка:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-6-cd0789171d00> in <module>
     15                            df[df.Scenario == 'S4']["LMP"],
     16                            df[df.Scenario == 'S5']["LMP"],
---> 17                            df[df.Scenario == 'S6']["LMP"] ] )
     18 
     19 # axes.set_title('Day Ahead Market')

c:\Anaconda\lib\site-packages\matplotlib\__init__.py in inner(ax, data, *args, **kwargs)
   1808                         "the Matplotlib list!)" % (label_namer, func.__name__),
   1809                         RuntimeWarning, stacklevel=2)
-> 1810             return func(ax, *args, **kwargs)
   1811 
   1812         inner.__doc__ = _add_data_doc(inner.__doc__,

c:\Anaconda\lib\site-packages\matplotlib\axes\_axes.py in violinplot(self, dataset, positions, vert, widths, showmeans, showextrema, showmedians, points, bw_method)
   7915             return kde.evaluate(coords)
   7916 
-> 7917         vpstats = cbook.violin_stats(dataset, _kde_method, points=points)
   7918         return self.violin(vpstats, positions=positions, vert=vert,
   7919                            widths=widths, showmeans=showmeans,

c:\Anaconda\lib\site-packages\matplotlib\cbook\__init__.py in violin_stats(X, method, points)
   1460         # Evaluate the kernel density estimate
   1461         coords = np.linspace(min_val, max_val, points)
-> 1462         stats['vals'] = method(x, coords)
   1463         stats['coords'] = coords
   1464 

c:\Anaconda\lib\site-packages\matplotlib\axes\_axes.py in _kde_method(X, coords)
   7910         def _kde_method(X, coords):
   7911             # fallback gracefully if the vector contains only one value
-> 7912             if np.all(X[0] == X):
   7913                 return (X[0] == coords).astype(float)
   7914             kde = mlab.GaussianKDE(X, bw_method)

c:\Anaconda\lib\site-packages\pandas\core\series.py in __getitem__(self, key)
    765         key = com._apply_if_callable(key, self)
    766         try:
--> 767             result = self.index.get_value(self, key)
    768 
    769             if not is_scalar(result):

c:\Anaconda\lib\site-packages\pandas\core\indexes\base.py in get_value(self, series, key)
   3116         try:
   3117             return self._engine.get_value(s, k,
-> 3118                                           tz=getattr(series.dtype, 'tz', None))
   3119         except KeyError as e1:
   3120             if len(self) > 0 and self.inferred_type in ['integer', 'boolean']:

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

KeyError: 0

1 Ответ

0 голосов
/ 03 января 2019

A KeyError вызывается всякий раз, когда поиск элемента в контейнере завершается неудачно.В этих поисках используются значения keys , и ошибка означает, что 0 не является допустимым ключом для фрейма данных.

DataFrame объекты не являются традиционными массивами NumPy.Они содержат индекс , который обеспечивает быстрый поиск данных на основе более или менее произвольной информации, включая числовые данные, а также даты, строки и многое другое.Это в отличие от стандартных ndarray s, которые допускают только линейный индекс (т. Е. Позицию) в качестве допустимых ключей.Поэтому, когда вы делаете что-то вроде df[0], это попытка найти значение 0 в индексе фрейма, а не извлечь первый элемент в массиве.

Однако, если вы сделаете df[df.Scenario == 'S1']['LMP'].index, вы должны увидеть:

Int64Index([8, 20, 25, 27, 28, 35, 52, 57, 62, 68, 72, 74, 77, 80, 81, 83, 97], dtype='int64')

Обратите внимание, что 0 нигде не найти, следовательно, KeyError.matplotlib был разработан для работы с объектами NumPy ndarray, а не с объектами Pandas DataFrame.Он ничего не знает об этой причудливой индексации, поэтому такие ошибки встречаются часто.

У вас есть несколько вариантов решения этой проблемы.Сначала преобразуйте данные, которые вы хотите построить, в массивы.Вы можете сделать это с помощью df[df.Scenario == 'S1']['LMP'].values для каждого такого массива.

Другой вариант - использовать пакет, подобный seaborn, который явно предназначен для работы с фреймами Pandas.Я очень рекомендую Seaborn в целом, это очень красивая и хорошо продуманная упаковка.Например, он имеет собственную версию violinplot, которая поддерживает DataFrame s и целый ряд параметров.

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