Python:pct_change抛出TypeError:/|'str'和'float'的不支持的操作数类型

时间:2017-10-08 22:02:11

标签: python pandas

我从JSON导入了一个DataFrame:

res = pd.io.json.json_normalize(response['candles'])

    complete    mid.c   mid.h   mid.l   mid.o   time    volume
3000    True    1.48257 1.48902 1.47545 1.48299 2011-05-02T21:00:00.000000000Z  46718
3001    True    1.48271 1.49402 1.47752 1.48254 2011-05-03T21:00:00.000000000Z  49927

重新排序列并创建新的DataFrame并设置DatetimeIndex:

...
newRes = res
newRes = newRes.set_index(pd.DatetimeIndex(newRes['time']))

time                            
2002-05-06 21:00:00 2002-05-06T21:00:00.000000000Z  0.91535 0.91535 0.91535 0.91535 1   True
2002-05-07 21:00:00 2002-05-07T21:00:00.000000000Z  0.90435 0.90435 0.90435 0.90435 1   True

创建了另一个df

df = newRes[['mid.c']].copy()

time                mid.c
2002-05-06 21:00:00 0.91535
2002-05-07 21:00:00 0.90435

现在简单的pct_change会引发错误。

df['rtns'] = df['mid.c'].pct_change(1)

TypeError: unsupported operand type(s) for /: 'str' and 'float'

没有parens我得到

df['rtns'] = df['mid.c'].pct_change

time                mid.c   rtns    
2002-05-06 21:00:00 0.91535 <bound method NDFrame.pct_change of time\n2002...
2002-05-07 21:00:00 0.90435 <bound method NDFrame.pct_change of time\n2002...

我尝试按照其他帖子的建议设置日期时间索引,但仍然没有帮助(如此处所示)

我还试图通过在所有的情况下声明float()来手动执行pct_change计算,但这也不起作用。

也试过.dropna

我做错了什么?

1 个答案:

答案 0 :(得分:2)

您的列是一列字符串,因此pct_change会抛出错误。在后一种情况下,您所做的只是引用pct_change方法,而不实际调用函数本身。

您需要将列转换为float,然后然后计算pct更改。

r = df['mid.c'].astype(float).pct_change(1)

print(r)
3000         NaN
3001    0.000094
Name: mid.c, dtype: float64

df['rtns'] = r