TypeError: unhashable тип: 'numpy.ndarray' с пандами после импорта данных из MYSQL - PullRequest
0 голосов
/ 20 января 2019

Я запускал одну и ту же программу на двух разных источниках данных (файл CSV и база данных MYSQL), импорт CSV работает нормально, но импорт MYSQL выдает ошибку типа numpy:

Я предполагаю, что проблема может быть связана с этими2 балла: 1. Проблемы с импортом данных - INT, TEXT и т. Д.?Я использую VARCHAR для данных.2. Проблема с тем, как matplotlib работает с фреймами данных Panda?

Я новичок, поэтому обращайтесь со мной как с одним:)

import pandas as pd
import numpy as np
import matplotlib.pyplot as pp
import seaborn
from sqlalchemy import create_engine
import pymysql

engine = create_engine("mysql+pymysql://root:root@127.0.0.1:3306/babynames",echo=False)

names = pd.read_sql_query('select * from BABYNAMES',engine)

names_indexed = names.set_index(['gender','name','year']).sort_index()


def plotname(gender, name):
    data = names_indexed.loc[gender, name]
    pp.plot(data.index, data.values)

plotname('F','Nancy')

Код ошибки:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-32-9d981bcf8365> in <module>()
----> 1 plotname('F','Nancy')

<ipython-input-31-85c728659ad0> in plotname(gender, name)
      1 def plotname(gender, name):
      2     data = allyears_indexed.loc[gender, name]
----> 3     pp.plot(data.index, data.values)

~/anaconda3/lib/python3.7/site-packages/matplotlib/pyplot.py in plot(*args, **kwargs)
   3361                       mplDeprecation)
   3362     try:
-> 3363         ret = ax.plot(*args, **kwargs)
   3364     finally:
   3365         ax._hold = washold

~/anaconda3/lib/python3.7/site-packages/matplotlib/__init__.py in inner(ax, *args, **kwargs)
   1865                         "the Matplotlib list!)" % (label_namer, func.__name__),
   1866                         RuntimeWarning, stacklevel=2)
-> 1867             return func(ax, *args, **kwargs)
   1868 
   1869         inner.__doc__ = _add_data_doc(inner.__doc__,

~/anaconda3/lib/python3.7/site-packages/matplotlib/axes/_axes.py in plot(self, *args, **kwargs)
   1526         kwargs = cbook.normalize_kwargs(kwargs, _alias_map)
   1527 
-> 1528         for line in self._get_lines(*args, **kwargs):
   1529             self.add_line(line)
   1530             lines.append(line)

~/anaconda3/lib/python3.7/site-packages/matplotlib/axes/_base.py in _grab_next_args(self, *args, **kwargs)
    404                 this += args[0],
    405                 args = args[1:]
--> 406             for seg in self._plot_args(this, kwargs):
    407                 yield seg
    408 

~/anaconda3/lib/python3.7/site-packages/matplotlib/axes/_base.py in _plot_args(self, tup, kwargs)
    381             x, y = index_of(tup[-1])
    382 
--> 383         x, y = self._xy_from_xy(x, y)
    384 
    385         if self.command == 'plot':

~/anaconda3/lib/python3.7/site-packages/matplotlib/axes/_base.py in _xy_from_xy(self, x, y)
    214         if self.axes.xaxis is not None and self.axes.yaxis is not None:
    215             bx = self.axes.xaxis.update_units(x)
--> 216             by = self.axes.yaxis.update_units(y)
    217 
    218             if self.command != 'plot':

~/anaconda3/lib/python3.7/site-packages/matplotlib/axis.py in update_units(self, data)
   1467         neednew = self.converter != converter
   1468         self.converter = converter
-> 1469         default = self.converter.default_units(data, self)
   1470         if default is not None and self.units is None:
   1471             self.set_units(default)

~/anaconda3/lib/python3.7/site-packages/matplotlib/category.py in default_units(data, axis)
    113         # default_units->axis_info->convert
    114         if axis.units is None:
--> 115             axis.set_units(UnitData(data))
    116         else:
    117             axis.units.update(data)

~/anaconda3/lib/python3.7/site-packages/matplotlib/category.py in __init__(self, data)
    180         self._counter = itertools.count(start=0)
    181         if data is not None:
--> 182             self.update(data)
    183 
    184     def update(self, data):

~/anaconda3/lib/python3.7/site-packages/matplotlib/category.py in update(self, data)
    197         data = np.atleast_1d(np.array(data, dtype=object))
    198 
--> 199         for val in OrderedDict.fromkeys(data):
    200             if not isinstance(val, VALID_TYPES):
    201                 raise TypeError("{val!r} is not a string".format(val=val))

TypeError: unhashable type: 'numpy.ndarray'

1 Ответ

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

Я был прав, проблема была с типами данных.Я создал новую таблицу, заменяющую VARCHAR для INT, а затем использовал тот же код сверху, и программа работала отлично.

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