1

收到错误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```
4

2 回答 2

1

您的代码存在一些问题。

首先,将变量命名为与方法/函数同名的名称通常是一个坏主意(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()
于 2021-02-04T03:49:19.493 回答
0

@Teo

代码的绘图部分比它需要的复杂得多。由于您已经将数据保存在带有时间戳索引的 DataFrame 中,因此我建议您使用 的mplfinance模块(而不是您正在使用的旧模块)。它会自动为您完成很多工作。因此,您的代码可以简单得多:

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,type='candle',style='yahoo')

请注意,对于“1h”,您得到的是平线而不是蜡烛,因为 o、h、l、c 的值都大致相同。

HTH。

于 2021-02-04T20:55:54.367 回答