我从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
我做错了什么?
答案 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