无法绘制蜡烛图

问题描述 投票:0回答:1

我尝试打开

csv
文件并绘制烛台图,但出现错误:

Traceback (most recent call last):
  File "/media/shutruk/Data/projects/money/qwerty.py", line 28, in <module>
    plot_candlestick(data_json)
  File "/media/shutruk/Data/projects/money/qwerty.py", line 14, in plot_candlestick
    ohlc = [(mdates.datestr2num(d[0]), d[2], d[3], d[4], d[1]) for d in data]
  File "/media/shutruk/Data/projects/money/qwerty.py", line 14, in <listcomp>
    ohlc = [(mdates.datestr2num(d[0]), d[2], d[3], d[4], d[1]) for d in data]
KeyError: 0

完整代码如下:

import matplotlib.pyplot as plt
from mplfinance.original_flavor import candlestick_ohlc
import matplotlib.dates as mdates
import csv

file_path = 'data.csv'

def plot_candlestick(data):
  if len(data) > 100:
    data = data[-100:]

  fig, ax = plt.subplots()
  
  ohlc = [(mdates.datestr2num(d[0]), d[2], d[3], d[4], d[1]) for d in data]
  candlestick_ohlc(ax, ohlc, width=0.6, colorup='red', colordown='green')

  ax.xaxis_date()
  ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
  plt.gcf().autofmt_xdate()
  plt.subplots_adjust(left=0.05, right=0.85, top=0.90, bottom=0.10)
  
  plt.show()

with open(file_path, 'r') as file:
  reader = csv.DictReader(file)    
  data_json = [row for row in reader]

plot_candlestick(data_json)

csv 文件内容看起来像:

"Date","Price","Open","High","Low","Vol.","Change %"
"03/27/2024","70,285.4","69,999.2","70,714.1","69,459.5","82.93K","0.41%"
"03/26/2024","69,999.3","69,896.3","71,490.7","69,366.4","90.98K","0.15%"
"03/25/2024","69,892.0","67,216.4","71,118.8","66,395.0","124.72K","3.99%"
"03/24/2024","67,211.9","64,036.5","67,587.8","63,812.9","65.59K","4.96%"
"03/23/2024","64,037.8","63,785.6","65,972.4","63,074.9","35.11K","0.40%"
"03/22/2024","63,785.5","65,501.5","66,633.3","62,328.3","72.43K","-2.62%"
"03/21/2024","65,503.8","67,860.0","68,161.7","64,616.1","75.26K","-3.46%"
"03/20/2024","67,854.0","62,046.8","68,029.5","60,850.9","133.53K","9.35%"

请告诉我如何解决它。

python csv matplotlib mplfinance
1个回答
0
投票

替换数字列(开盘价、最高价、最低价、价格)中的逗号并将其转换为浮点数。 所以,我改变了你的

ohlc = [(mdates.datestr2num(d[0]), d[2], d[3], d[4], d[1]) for d in data]

我已经用你的 CSV 示例进行了测试,它有效。

def plot_candlestick(data):
    if len(data) > 100:
        data = data[-100:]

    fig, ax = plt.subplots()
    
    ohlc = [(mdates.datestr2num(d['Date']), float(d['Open'].replace(',', '')), float(d['High'].replace(',', '')), float(d['Low'].replace(',', '')), float(d['Price'].replace(',', ''))) for d in data]
    candlestick_ohlc(ax, ohlc, width=0.6, colorup='red', colordown='green')

    ax.xaxis_date()
    ax.xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
    plt.gcf().autofmt_xdate()
    plt.subplots_adjust(left=0.05, right=0.85, top=0.90, bottom=0.10)
    
    plt.show()


plot_candlestick(data)
© www.soinside.com 2019 - 2024. All rights reserved.