Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python ';numpy.ndarray和#x27;对象没有属性';查找';在尝试生成箱线图时?_Python_Numpy_Matplotlib - Fatal编程技术网

Python ';numpy.ndarray和#x27;对象没有属性';查找';在尝试生成箱线图时?

Python ';numpy.ndarray和#x27;对象没有属性';查找';在尝试生成箱线图时?,python,numpy,matplotlib,Python,Numpy,Matplotlib,我正在尝试生成一个方框图。这是我的代码,数据如下: def loadData(fileName): data = pd.read_csv(fileName, quotechar='"') cols = data.columns.tolist() cols = cols[1:] + [ cols[0] ] data = data[cols] return data.values cols={} cols['close/last']=0 cols['volumn

我正在尝试生成一个方框图。这是我的代码,数据如下:

def loadData(fileName):
 data = pd.read_csv(fileName, quotechar='"')
    cols = data.columns.tolist()

    cols = cols[1:] + [ cols[0] ]
    data = data[cols]
    return data.values

cols={}
cols['close/last']=0
cols['volumne']=1
cols['open']=2
cols['high']=3
cols['low']=4
cols['date']=5

fileName = 'microsoft.csv'

def boxplot():
    data1 = loadData(fileName)
    ithattr1 = cols['high']
    ithattr2 = cols['close/last']
    dataset1 = data1[:,ithattr1]
    dataset2 = data1[:,ithattr2]

    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.boxplot([dataset1,dataset2])
    plt.show()


boxplot()
数据是浮点型的,当输出为浮点型时,打印命令会对其进行验证
。在运行代码时,我得到以下错误(下面是完整的stacktrace)

AttributeError:'numpy.ndarray'对象没有属性'find'

我的数据(例如
dataset1
)如下所示

[52.21 52.2 52.44 52.65 52.33 51.58 51.38 51.68 51.97 53.4163 54.07 53.1
 52.85 53.28 53.485 54.4001 55.39 54.8 56.19 56.78 56.85 55.95 55.96 55.88
 55.48 55.35 56.0 56.79 56.245 55.9 55.21 55.1 55.655 55.87 56.1 55.97
.........................................
 27.54 27.66 28.02 28.05 27.97 28.19 28.13]
输出
数据.shape
=
(756,)

数据文件格式: 堆栈跟踪
回溯(最近一次呼叫最后一次):
文件“plot_curves.py”,第100行,in
箱线图()
文件“plot_curves.py”,第96行,方框图
ax.boxplot([dataset1,dataset2])
文件“/home/rohit/anaconda/lib/python2.7/site packages/matplotlib/axes/_axes.py”,第3118行,方框图
manage_xticks=manage_xticks)
bxp中的文件“/home/rohit/anaconda/lib/python2.7/site packages/matplotlib/axes/_axes.py”,第3480行
传单x,传单y,**最终传单
文件“/home/rohit/anaconda/lib/python2.7/site packages/matplotlib/axes/_axes.py”,第3361行,doplot格式
返回自绘制(*args,**kwargs)
文件“/home/rohit/anaconda/lib/python2.7/site packages/matplotlib/axes/_axes.py”,第1373行,在绘图中
对于自身中的行。获取行(*args,**kwargs):
文件“/home/rohit/anaconda/lib/python2.7/site packages/matplotlib/axes/_base.py”,第304行,在下一个参数中
对于seg in self.\u plot\u args(剩余,kwargs):
文件“/home/rohit/anaconda/lib/python2.7/site packages/matplotlib/axes/_base.py”,第263行,在绘图参数中
线型、标记、颜色=\处理\打印\格式(tup[-1])
文件“/home/rohit/anaconda/lib/python2.7/site packages/matplotlib/axes/_base.py”,第85行,采用_process_plot_格式
如果fmt.find('--')>=0:
AttributeError:'numpy.ndarray'对象没有属性'find'

有人知道如何解决吗?

问题的直接原因是
dataset1
dataset2
ndarray
类型,带有
dtype==object

虽然您的值作为
float
type读入,但当您访问返回的
values
数组的列时(在
dataset1=data1[:,ithattr1]
行),
dtype
将更改为
object
(由于您实际上是逐行提取数据,然后提取一列,
numpy
在行中同时包含浮点数和字符串,因此必须强制使用最特定的公共数据类型-
对象

有几种方法可以解决这个问题,一种是简单地将数组放入列表中,在这一点上Python将看起来像浮点的内容强制为浮点,即更改

ax.boxplot([dataset1,dataset2])

另一种方法是添加显式设置类型的行:

dataset1 = dataset1.astype(np.float)
dataset2 = dataset2.astype(np.float)
当您通过索引访问列中包含不同数据类型的pandas dataframes或numpy数组时,这是一个难题。调试非常困难(我花了一段时间才得到这个问题的答案,我以前见过它-请参阅编辑历史)


然而,通过数字索引处理数据的方式也意味着,为了方便您的
加载数据
功能,您最终不得不对列等进行重新排序。更好的方法是让panda对类型等执行所有繁重的操作

例如,我已经将您的代码放入(我认为)更传统的pandas/python编写中。它有点短,不需要黑客将数据更改为我上面给出的列表。下面是代码,然后是输出图(使用您问题中的输入数据片段)

输出

能否提供一个自包含的示例,即包含数据的示例?我看不出有什么试图访问
ndarray。在代码中查找
。错误是正确的;没有任何版本的NumPy具有
find
属性或
ndarray
方法。能否显示
def loadData()
?@将更新问题。请显示完整的错误回溯,而不仅仅是最后一行。@BrenBarn使用完整堆栈跟踪更新了问题。您的示例清除了一些细节并生成了有效的绘图,但我认为它无法确定OP出现此错误的原因。我无法使用任何类型的列表或数组输入重现它。好的,
pandas
喜欢在存在任何类型混合甚至字符串的情况下还原为
对象。
plt.boxplot(np.arange(3,dtype=object))
生成绘图,但在尝试标记它时引发错误。
ax.boxplot([dataset1,dataset2])
ax.boxplot([list(dataset1),list(dataset2)])
dataset1 = dataset1.astype(np.float)
dataset2 = dataset2.astype(np.float)
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np

def loadData(filename,cols):
    data = pd.read_csv(filename, quotechar='"',names=cols,header=None)
    return data

def boxplot(filename,cols):
    data1 = loadData(filename,cols)

    fig = plt.figure()
    ax = fig.add_subplot(111)

    ax.boxplot([data1['high'],data1['close/last']])
    plt.show()

cols=['date','close/last','volume','open','high','low']
filename = 'microsoft.csv'

boxplot(filename,cols)