TypeError:“范围”对象不可调用

时间:2018-12-01 19:11:49

标签: python pandas matplotlib visualization seaborn

我一直在绘制一些图,然后收到以下代码的上述错误:

    lag = range(0, 31)
    djia_acf = []
    for l in lag:
        djia_acf.append(djia_df['Close'].autocorr(l))


    plt.figure(figsize = (5.5, 5.5))
    g = sns.pointplot(x=lag, y=djia_acf, markers = '.')
    g.set_title('Autocorrelation function for DJIA')
    g.set_xlabel('Lag in terms of number of trading days')
    g.set_ylabel('Autocorrelation Function')
    g.set_xticklabels(lag, rotation = 90)

TypeError                            Traceback (most recent call last)
<ipython-input-42-3ca28bdcaeea> in <module>()
      1 plt.figure(figsize = (5.5, 5.5))
----> 2 g = sns.pointplot(x=lag, y=djia_acf, markers = '.')
      3 g.set_title('Autocorrelation function for DJIA')
      4 g.set_xlabel('Lag in terms of number of trading days')
      5 g.set_ylabel('Autocorrelation Function')

/home/aspiring1/anaconda3/lib/python3.6/site-packages/seaborn/categorical.py in pointplot(x, y, hue, data, order, hue_order, estimator, ci, n_boot, units, markers, linestyles, dodge, join, scale, orient, color, palette, ax, errwidth, capsize, **kwargs)
   3065                             estimator, ci, n_boot, units,
   3066                             markers, linestyles, dodge, join, scale,
-> 3067                             orient, color, palette, errwidth, capsize)
   3068 
   3069     if ax is None:

/home/aspiring1/anaconda3/lib/python3.6/site-packages/seaborn/categorical.py in __init__(self, x, y, hue, data, order, hue_order, estimator, ci, n_boot, units, markers, linestyles, dodge, join, scale, orient, color, palette, errwidth, capsize)
   1607         """Initialize the plotter."""
   1608         self.establish_variables(x, y, hue, data, orient,
-> 1609                                  order, hue_order, units)
   1610         self.establish_colors(color, palette, 1)
   1611         self.estimate_statistic(estimator, ci, n_boot)

/home/aspiring1/anaconda3/lib/python3.6/site-packages/seaborn/categorical.py in establish_variables(self, x, y, hue, data, orient, order, hue_order, units)
    201                 # Group the numeric data
    202                 plot_data, value_label = self._group_longform(vals, groups,
--> 203                                                               group_names)
    204 
    205                 # Now handle the hue levels for nested ordering

/home/aspiring1/anaconda3/lib/python3.6/site-packages/seaborn/categorical.py in _group_longform(self, vals, grouper, order)
    243 
    244         # Group the val data
--> 245         grouped_vals = vals.groupby(grouper)
    246         out_data = []
    247         for g in order:

/home/aspiring1/anaconda3/lib/python3.6/site-packages/pandas/core/generic.py in groupby(self, by, axis, level, as_index, sort, group_keys, squeeze, **kwargs)
   4269         return groupby(self, by=by, axis=axis, level=level, as_index=as_index,
   4270                        sort=sort, group_keys=group_keys, squeeze=squeeze,
-> 4271                        **kwargs)
   4272 
   4273     def asfreq(self, freq, method=None, how=None, normalize=False,

/home/aspiring1/anaconda3/lib/python3.6/site-packages/pandas/core/groupby.py in groupby(obj, by, **kwds)
   1624         raise TypeError('invalid type: %s' % type(obj))
   1625 
-> 1626     return klass(obj, by, **kwds)
   1627 
   1628 

/home/aspiring1/anaconda3/lib/python3.6/site-packages/pandas/core/groupby.py in __init__(self, obj, keys, axis, level, grouper, exclusions, selection, as_index, sort, group_keys, squeeze, **kwargs)
    390                                                     level=level,
    391                                                     sort=sort,
--> 392                                                     mutated=self.mutated)
    393 
    394         self.obj = obj

/home/aspiring1/anaconda3/lib/python3.6/site-packages/pandas/core/groupby.py in _get_grouper(obj, key, axis, level, sort, mutated)
   2636                         sort=sort,
   2637                         in_axis=in_axis) \
-> 2638             if not isinstance(gpr, Grouping) else gpr
   2639 
   2640         groupings.append(ping)

/home/aspiring1/anaconda3/lib/python3.6/site-packages/pandas/core/groupby.py in __init__(self, index, grouper, obj, name, level, sort, in_axis)
   2418                     t = self.name or str(type(self.grouper))
   2419                     raise ValueError("Grouper for '%s' not 1-dimensional" % t)
-> 2420                 self.grouper = self.index.map(self.grouper)
   2421                 if not (hasattr(self.grouper, "__len__") and
   2422                         len(self.grouper) == len(self.index)):

/home/aspiring1/anaconda3/lib/python3.6/site-packages/pandas/core/indexes/base.py in map(self, mapper)
   2725         """
   2726         from .multi import MultiIndex
-> 2727         mapped_values = self._arrmap(self.values, mapper)
   2728         attributes = self._get_attributes_dict()
   2729         if mapped_values.size and isinstance(mapped_values[0], tuple):

pandas/_libs/algos_common_helper.pxi in pandas._libs.algos.arrmap_int64 (pandas/_libs/algos.c:41758)()

TypeError: 'range' object is not callable

<matplotlib.figure.Figure at 0x7f1fa7c2ab70>

在上面的代码中,我只是尝试使用seaborn绘制点图,但是它给出了不能调用范围对象的错误,我见过类似的帖子,其中包含错误

  

“列表对象不可调用”

但是,在这里我看不到调用范围对象 lag 的任何地方。 使用x = np.array(lag)为我提供了所需的绘图,并带有以下输出,不知道为什么?

[<matplotlib.text.Text at 0x7f1fa7d38208>,
 <matplotlib.text.Text at 0x7f1fa7d38ef0>,
 <matplotlib.text.Text at 0x7f1fa7c61208>,
 <matplotlib.text.Text at 0x7f1fa7c61cc0>,
 <matplotlib.text.Text at 0x7f1fa7c696d8>,
 <matplotlib.text.Text at 0x7f1fa7c711d0>,
 <matplotlib.text.Text at 0x7f1fa7c71c88>,
 <matplotlib.text.Text at 0x7f1fa7c75780>,
 <matplotlib.text.Text at 0x7f1fa7c7c278>,
 <matplotlib.text.Text at 0x7f1fa7c7cd30>,
 <matplotlib.text.Text at 0x7f1fa7c02828>,
 <matplotlib.text.Text at 0x7f1fa7c08320>,
 <matplotlib.text.Text at 0x7f1fa7c08dd8>,
 <matplotlib.text.Text at 0x7f1fa7c0c8d0>,
 <matplotlib.text.Text at 0x7f1fa7c123c8>,
 <matplotlib.text.Text at 0x7f1fa7c12e80>,
 <matplotlib.text.Text at 0x7f1fa7c1a978>,
 <matplotlib.text.Text at 0x7f1fa7c1e470>,
 <matplotlib.text.Text at 0x7f1fa7c1ef28>,
 <matplotlib.text.Text at 0x7f1fa7c25a20>,
 <matplotlib.text.Text at 0x7f1fa7c2a518>,
 <matplotlib.text.Text at 0x7f1fa7c2afd0>,
 <matplotlib.text.Text at 0x7f1fa7c31ac8>,
 <matplotlib.text.Text at 0x7f1fa7c385c0>,
 <matplotlib.text.Text at 0x7f1fa7c3d0b8>,
 <matplotlib.text.Text at 0x7f1fa7c3db70>,
 <matplotlib.text.Text at 0x7f1fa7bc5668>,
 <matplotlib.text.Text at 0x7f1fa7bc9160>,
 <matplotlib.text.Text at 0x7f1fa7bc9c18>,
 <matplotlib.text.Text at 0x7f1fa7bce710>,
 <matplotlib.text.Text at 0x7f1fa7bd4208>]

我已经使用matplotlib.pyplot绘制了图,该图将范围对象作为x值,如下所示:

inflation = pd.read_excel('inflation-consumer-prices-annual.xlsx', parse_dates=['Year'])
plt.figure(figsize=(5.5, 5.5))
plt.plot(range(1960,2017), inflation['India'], linestyle='-', marker='*',
color='r')
plt.plot(range(1960,2017), inflation['United States'], linestyle='-',
marker='.', color='b')
plt.legend(['India','United States'], loc=1)
plt.title('Inflation in Consumer Price Index')
plt.ylabel('Inflation')
plt.xlabel('Years')

因此,我不知道为什么收到TypeError,因为它与matplotlib.pyplot一起使用,而调用range对象没有任何意义。

1 个答案:

答案 0 :(得分:1)

在python 3中,range返回一个迭代器,而不是列表本身。因此,以下内容不适用于python3。但是,适用于python 2。

import seaborn as sns
import matplotlib.pyplot as plt

x = range(9)
y = [1,2,3]*3
sns.pointplot(x=x, y=y, markers = '.')

plt.show()

但是,您可以通过range将任何list(range(...))转换为列表。因此,以下工作正常。

import seaborn as sns
import matplotlib.pyplot as plt

x = list(range(9))
y = [1,2,3]*3
sns.pointplot(x=x, y=y, markers = '.')

plt.show()