'属性错误:'int'对象没有属性'dtype''

2024-06-15 09:20:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图运行一个脚本来获取一些股票的数据。我试图获得的部分数据是流动性指标(称为Amihud流动性指标)。我自动化了脚本,但是当运行自动脚本时,我在大约15-20次成功返回后得到一个错误。 我如何解决这个问题?在

File "script.py", line 23, in <module>
return_data = function.get_data(row[1], row[0])
File "C:\Users\leon_\function.py", line 39, in get_data
print(np.nanmean(illiq))
File "D:\Anaconda3\lib\site-packages\numpy\lib\nanfunctions.py", line 916, in nanmean
avg = _divide_by_count(tot, cnt, out=out)
File "D:\Anaconda3\lib\site-packages\numpy\lib\nanfunctions.py", line 190, in _divide_by_count
return a.dtype.type(a / b)
AttributeError: 'int' object has no attribute 'dtype'

处理非流动性度量的代码部分:

^{pr2}$

有人知道怎么解决这个问题吗?在

编辑:这是脚本文件

# Open File Dialog

root = tk.Tk()
root.withdraw()

file_path = filedialog.askopenfilename()

# Load Spreadsheet data
f = open(file_path)

csv_f = csv.reader(f)
next(csv_f)

result_data = []

# Iterate
for row in csv_f:
    return_data = function.get_data(row[1], row[0])
    if len(return_data) != 0:
        # print(return_data)
        result_data_loc = [row[1], row[0]]
        result_data_loc.extend(return_data)
        result_data.append(result_data_loc)

if result_data is not None:
    with open('resuls.csv', mode='w', newline='') as result_file:
        csv_writer = csv.writer(result_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
        for result in result_data:
            # print(result)
            csv_writer.writerow(result)
else:
    print("No results found!")

Tags: csvinpy脚本datareturnlibline
3条回答

简单的答案是,您的数据不是numpy数据类型。这可能是因为列不是完全数值(即不包含任何内容)。在

简而言之:

print(np.nanmean(pd.to_numeric(illiq)))

解决这个问题最快的方法是简单地将数据强制为numpy喜欢的数字类型。这可以通过pandas的to_numeric方法实现。在

[我会将此作为注释,但鉴于篇幅,我不能]我觉得没有足够的信息来帮助您解决问题,在您的位置上,我会添加这些信息以确保我理解代码失败的原因,同时继续此过程以完成它。这样,您就可以处理失败的文件,并在获得结果的同时更正脚本。在

root = tk.Tk()
root.withdraw()

file_path = filedialog.askopenfilename()

# Load Spreadsheet data
f = open(file_path)

csv_f = csv.reader(f)
next(csv_f)

result_data = []

# Iterate
for row in csv_f:
    try:
       return_data = function.get_data(row[1], row[0])
       if len(return_data) != 0:
          # print(return_data)
          result_data_loc = [row[1], row[0]]
          result_data_loc.extend(return_data)
          result_data.append(result_data_loc)
    except AttributeError:
          print(row[0])
          print('\n\n')
          print(row[1])
          continue

if result_data is not None:
    with open('resuls.csv', mode='w', newline='') as result_file:
        csv_writer = csv.writer(result_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
        for result in result_data:
            # print(result)
            csv_writer.writerow(result)
else:
    print("No results found!")

因此,根据回溯(谢天谢地,我们没有要求),错误发生在:

np.nanmean(illiq)

它试图调整返回值以匹配输入的dtype,可能是illiq。在nanmean(查看其代码)中,它已经对输入(在删除nan)之后,tot和计数元素{}求和。它的编写假设illiq是一个数值numpy数组(最好是float数据类型,因为它必须处理floatnp.nan)。在

所以它大部分时间都是有效的,但在某些情况下失败了。在这些情况下,illiq有什么不同?在

^{pr2}$

看起来stock_datadataframe,输入是从单个series派生的数组。我相信stock_data[name].to_num()是从序列中获取数组的首选方法,尽管np.array(...)在大多数情况下都可以工作。stock_data[name].values也被使用。在

我建议在此调用之前对illiq应用一些测试。至少检查shape和{}。试着找出问题案例中的不同之处。在

下面是一个产生此错误的简单情况:

In [117]: np.nanmean(np.array([0,3],object))                                                                 
                                     -
AttributeError                            Traceback (most recent call last)
<ipython-input-117-26ab42d92ec9> in <module>
  > 1 np.nanmean(np.array([0,3],object))

<__array_function__ internals> in nanmean(*args, **kwargs)

/usr/local/lib/python3.6/dist-packages/numpy/lib/nanfunctions.py in nanmean(a, axis, dtype, out, keepdims)
    949     cnt = np.sum(~mask, axis=axis, dtype=np.intp, keepdims=keepdims)
    950     tot = np.sum(arr, axis=axis, dtype=dtype, out=out, keepdims=keepdims)
 > 951     avg = _divide_by_count(tot, cnt, out=out)
    952 
    953     isbad = (cnt == 0)

/usr/local/lib/python3.6/dist-packages/numpy/lib/nanfunctions.py in _divide_by_count(a, b, out)
    216         else:
    217             if out is None:
 > 218                 return a.dtype.type(a / b)
    219             else:
    220                 # This is questionable, but currently a numpy scalar can

AttributeError: 'int' object has no attribute 'dtype'

当一个或多个值不是有效数字时,pandas经常创建对象数据类型系列。它可以包含字符串和None值。在

相关问题 更多 >