问题描述
出现错误 Timestamp object is not subscriptable.
我明白这意味着什么,但不知道如何解决代码。
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from mplfinance.original_flavor import candlestick_ohlc
API_URL = 'https://api.coingecko.com/api/v3'
r = requests.get(API_URL + '/coins/bitcoin/market_chart?vs_currency=usd&days=3&interval=hourly')
d = r.json()
df = pd.DataFrame(d['prices'],columns = ['dateTime','price'])
df['date'] = pd.to_datetime(df['dateTime'],unit='ms')
ohlc = df.set_index('date')['price'].resample('1h').ohlc()
stock_data = ohlc
class CandlesIndexes():
def __init__(self,stock_data):
self.high = stock_data.high
self.low = stock_data.low
self.close = stock_data.close
self.stock_data = stock_data
self.date = stock_data.index
def display_candle_bars(self):
fig,self.ax = plt.subplots()
#Describe candle properties
candle_ohlc = candlestick_ohlc(self.ax,self.date,width= 0.6,colorup= 'green',colordown= 'red',alpha= 0.8)
错误发生在最后的 candle_ohlc = candlestick_ohlc()
行。
编辑:完整错误:
File "/Users/teo/.local/share/virtualenvs/trend-nriNAUCq/lib/python3.8/site-packages/mplfinance/original_flavor.py",line 234,in candlestick_ohlc
return _candlestick(ax,quotes,width=width,colorup=colorup,File "/Users/teo/.local/share/virtualenvs/trend-nriNAUCq/lib/python3.8/site-packages/mplfinance/original_flavor.py",line 283,in _candlestick
t,open,high,low,close = q[:5]
TypeError: 'Timestamp' object is not subscriptable```
解决方法
您的代码存在一些问题。
首先,将变量命名为与方法/函数 (ohlc
) 相同的名称通常是一个坏主意。
其次,您似乎每小时从服务器提取数据,然后尝试以相同的每小时间隔重新采样 ohlc()
的数据 - 这将为您提供相同的开盘价、最高价、收盘价和低的。您需要提高从 API 中提取数据的频率,或者降低重新采样的频率。
第三,您错误地使用了 candlestick_ohlc()
。您需要首先使用日期时间(以 candlestick_ohlc()
可用的格式)创建一个列(而不是索引),然后仅将该数据框的值传递给函数。
此示例按描述工作,但仍可改进:
import requests
import matplotlib.pyplot as plt
from mplfinance.original_flavor import candlestick_ohlc
import matplotlib.dates as dates
API_URL = 'https://api.coingecko.com/api/v3'
r = requests.get(API_URL + '/coins/bitcoin/market_chart?vs_currency=usd&days=3&interval=hourly')
d = r.json()
df = pd.DataFrame(d['prices'],columns=['dateTime','price'])
df['dateTime'] = pd.to_datetime(df['dateTime'],unit='ms')
ohla = df.set_index('dateTime')['price'].resample('1d').ohlc()
stock_data = ohla.reset_index()
stock_data["dateTime"] = stock_data["dateTime"].apply(dates.date2num)
class CandlesIndexes():
def __init__(self,stock_data):
self.high = stock_data.high
self.low = stock_data.low
self.close = stock_data.close
self.stock_data = stock_data
self.date = stock_data.index
def display_candle_bars(self):
fig,self.ax = plt.subplots()
candlestick_ohlc(self.ax,self.stock_data.values,width= 0.6,colorup= 'green',colordown= 'red',alpha= 0.8)
plt.show()
x = CandlesIndexes(stock_data)
x.display_candle_bars()
,
@Teo
代码的绘图部分比它需要的要复杂得多。由于您已经将数据保存在带有时间戳索引的 DataFrame 中,我建议您使用 new mplfinance module(而不是您正在使用的旧的)。它会自动为您完成很多工作。因此,您的代码可以简单得多:
import requests
import pandas as pd
import mplfinance as mpf
API_URL = 'https://api.coingecko.com/api/v3'
r = requests.get(API_URL + '/coins/bitcoin/market_chart?vs_currency=usd&days=3&interval=hourly')
d = r.json()
df = pd.DataFrame(d['prices'],columns = ['dateTime','price'])
df['date'] = pd.to_datetime(df['dateTime'],unit='ms')
ohlcdf = df.set_index('date')['price'].resample('4h').ohlc()
mpf.plot(ohlcdf,type='candle',style='yahoo')
请注意,我将您的重采样从“1h”更改为“4h”。这是因为您的数据已经大约每小时一次。因此,如果您在 1 小时重新采样,那么您的开盘价、最高价、最低价和收盘价将全部相等。通过将上面代码的最后两行更改为:
,您可以轻松看到各种重采样频率之间的差异for freq in ('1h','2h','3h','4h'):
ohlcdf = df.set_index('date')['price'].resample(freq).ohlc()
mpf.plot(ohlcdf,style='yahoo')
请注意,对于“1h”,您会得到平线而不是蜡烛,因为 o、h、l、c 的值都大致相同。
HTH。