如何使 Pandas Timestamp 对象可下标?

问题描述

出现错误 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() 行。

请帮助一个brotha。谢谢,非常感谢。

编辑:完整错误

  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')

结果: enter image description here

请注意,我将您的重采样从“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。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...