映射到列表错误:系列对象不可调用

Posted

技术标签:

【中文标题】映射到列表错误:系列对象不可调用【英文标题】:Map to List error: Series object not callable 【发布时间】:2017-01-01 10:14:48 【问题描述】:
from nsepy import get_history
from datetime import date
import datetime
import pandas as pd
import numpy as np
file = r'C:\Users\Raspberry-Pi\Desktop\Desktop\List.xlsx'
list = pd.read_excel(file)
list = list['SYMBOL']
start = date.today()-datetime.timedelta(days = 10)
end = date.today()
symb = get_history(symbol='INFY',start = start,end = end)
h = symb.tail(3).High.tolist()
l = symb.tail(3).Low.tolist()
print(type(h))
print(type(l))
x =  map(lambda a,b:a-b,h,l)
print(type(x))
x = list(x)

我收到错误:

系列对象不可调用

它指向x = list(x) 线。

【问题讨论】:

你能把整个错误放在描述中吗 【参考方案1】:

但我认为您可以省略map 并使用简单的减法然后转换为list

symb = get_history(symbol='INFY',start = start,end = end)
print ((symb.tail(3).High - symb.tail(3).Low).tolist())

也不要使用变量list(python中的保留字)而不是L(或其他):

L = pd.read_excel(file)
L = L['SYMBOL']

示例:

import pandas as pd

symb = pd.DataFrame('High':[8,9,7,5,3,4],'Low':[1,2,3,1,0,1])
print (symb)
   High  Low
0     8    1
1     9    2
2     7    3
3     5    1
4     3    0
5     4    1

print ((symb.tail(3).High - symb.tail(3).Low).tolist())
[4, 3, 3]

编辑:

我尝试模拟问题:

list = pd.DataFrame('SYMBOL':['sss old','dd','old'])
print (list)
     SYMBOL
0  sss old
1       dd
2      old

list = list['SYMBOL']
print (list)
0    sss old
1         dd
2        old
Name: SYMBOL, dtype: object

print (type(list))
<class 'pandas.core.series.Series'>

x = [1,2,3]

#list is Series, not function
x = list(x)
print (x)
TypeError: 'Series' object is not callable

如果将list更改为L,重要的是重新打开python控制台,因为仍然是同样的错误。

所以这很完美:

df = pd.DataFrame('SYMBOL':['sss old','dd','old'])
print (df)
     SYMBOL
0  sss old
1       dd
2      old

L = df['SYMBOL']
print (L)
0    sss old
1         dd
2        old
Name: SYMBOL, dtype: object

x = [1,2,3]
x = list(x)
print (x)
[1, 2, 3]

【讨论】:

【参考方案2】:

list(x) 通常意味着将x 转换为list 对象。这是一个创建列表对象的函数。但是在顶部附近你重新定义了list

list = pd.read_excel(file)

现在list 现在是pandas series 对象(如错误消息所述),它不能作为函数使用,即它不是callable,它不能与() 一起使用。

为此对象使用不同的名称。如果您想不出更好的描述符,请使用像 foo 这样愚蠢的名称。

【讨论】:

【参考方案3】:

问题是你重新分配了保留字

list = pd.read_excel(file) 
list = list['SYMBOL']

因此这里的列表只是['S', 'Y', 'M', 'B'..] 的列表。为这个定义使用另一个名字,程序会正常工作

【讨论】:

我对其进行了测试,对我来说它有效。你用python 2还是python 3? 我用python 2,我不是一个热心的程序员 你用熊猫吗?你能测试一下吗? 我不使用熊猫 因为在 pandas 中 list['SYMBOL'] 表示在 DataFrame 中选择名称为 SYMBOL 的列称为 list

以上是关于映射到列表错误:系列对象不可调用的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:“列表”对象在尝试访问列表时不可调用

双向将字符串的“虚拟”列表绑定到列

列表对象在 SVM 中不可调用

将行优先数组映射到列优先特征矩阵

EF4.1 如何将属性映射到列

numpy 数组中非唯一行的快速组合,映射到列(即快速数据透视表问题,没有 Pandas)