【问题标题】:candlestick charts using Matplotlib skip weekends使用 Matplotlib 的烛台图跳过周末
【发布时间】:2017-12-08 18:05:29
【问题描述】:

我需要一些帮助。我在 matplotlib 和 numpy 之间学习。我只是用我自己的 csv 文件从“使用 Matplotlib 的日内烛台图表”中复制一段代码,以从该代码中学习。我的代码与它不同的部分如下:

import numpy as np 
import matplotlib.pyplot as plt 
import datetime

from mpl_finance import candlestick_ohlc 
from matplotlib.dates import num2date

# data in a text file, 5 columns: time, opening, close, high, low
# note that I'm using the time you formated into an ordinal float data = 
np.loadtxt("/Users/paul/Documents/python/Quant/INTC.csv",       delimiter=",")

我收到一条错误提示

ValueError: could not convert string to float: b'Date'.

我什至尝试使用这条线,但仍然给我同样的错误信息

data = np.genfromtxt("/Users/paul/Documents/python/Quant/INTC.csv", delimiter=",", skip_header=1, usecols=[0,1,2,3,4], dtype=(dt, float,float,float, float))"

这可能是一个我不理解的基本概念。非常感谢一些指导。

样本数据:

Date,Open,High,Low,Close,Volume,Adj Close
2017-11-06,46.599998,46.740002,46.090000,46.700001,46.700001,34035000
2017-11-07,46.700001,47.090000,46.389999,46.779999,46.779999,24461400
2017-11-08,46.619999,46.700001,46.279999,46.700001,46.700001,21565800
2017-11-09,46.049999,46.389999,45.650002,46.299999,46.299999,25570400
2017-11-10,46.040001,46.090000,45.380001,45.580002,45.580002,24095400
2017-11-13,45.259998,45.939999,45.250000,45.750000,45.750000,18999000

【问题讨论】:

    标签: python csv numpy matplotlib candlestick-chart


    【解决方案1】:

    您可以通过将“日期列”(字符串)转换为日期时间对象来导入它。一旦将其作为日期时间对象,您就可以过滤掉周末,如下所示。您可以按照 matplotlib 的理解在 matplotlib 中绘制过滤后的数据datetime 对象。希望对您有所帮助。

    '''
    data in csv
    Date,Open,High,Low,Close,Volume,Adj Close 
    2017-12-06,46.599998,46.740002,46.090000,46.700001,46.700001,34035000 
    2017-12-07,46.700001,47.090000,46.389999,46.779999,46.779999,24461400
    2017-12-08,46.619999,46.700001,46.279999,46.700001,46.700001,21565800
    2017-12-09,46.049999,46.389999,45.650002,46.299999,46.299999,25570400 
    2017-12-10,46.040001,46.090000,45.380001,45.580002,45.580002,24095400
    2017-12-13,45.259998,45.939999,45.250000,45.750000,45.750000,18999000
    '''
    
    import numpy as np
    from datetime import datetime
    
    # use converter to convert a string object to datetime object. Note dtype is object for all columns
    data = np.genfromtxt(r'stock.csv', delimiter = ',', names = True,
                        converters={0: lambda x: datetime.strptime(x, "%Y-%m-%d")}, dtype=object)
    
    print data
    
    '''
    [ (datetime.datetime(2017, 12, 6, 0, 0), '46.599998', '46.740002', '46.090000', '46.700001', '46.700001', '34035000')
     (datetime.datetime(2017, 12, 7, 0, 0), '46.700001', '47.090000', '46.389999', '46.779999', '46.779999', '24461400')
     (datetime.datetime(2017, 12, 8, 0, 0), '46.619999', '46.700001', '46.279999', '46.700001', '46.700001', '21565800')
     (datetime.datetime(2017, 12, 9, 0, 0), '46.049999', '46.389999', '45.650002', '46.299999', '46.299999', '25570400')
     (datetime.datetime(2017, 12, 10, 0, 0), '46.040001', '46.090000', '45.380001', '45.580002', '45.580002', '24095400')
     (datetime.datetime(2017, 12, 13, 0, 0), '45.259998', '45.939999', '45.250000', '45.750000', '45.750000', '18999000')]
    '''
    
    # check if a day is a weekday or not
    def check_weekday_or_not(datetime_object):
        if datetime_object.weekday() not in [5,6]:
            # datetime.weekday() returns 5 and 6 for saturday and Sunday
            return True
        else:
            return False
    
    # create a function to apply on each row of the matrix
    vfunc =np.vectorize(check_weekday_or_not)     
    filter_mask = vfunc(data['Date'])
    print filter_mask
    #[ True  True  True False False  True]
    
    # Apply the filter mask to obtain an array without weekends.
    print data[filter_mask]
    '''
    array([ (datetime.datetime(2017, 12, 6, 0, 0), '46.599998', '46.740002', '46.090000', '46.700001', '46.700001', '34035000'),
           (datetime.datetime(2017, 12, 7, 0, 0), '46.700001', '47.090000', '46.389999', '46.779999', '46.779999', '24461400'),
           (datetime.datetime(2017, 12, 8, 0, 0), '46.619999', '46.700001', '46.279999', '46.700001', '46.700001', '21565800'),
           (datetime.datetime(2017, 12, 13, 0, 0), '45.259998', '45.939999', '45.250000', '45.750000', '45.750000', '18999000')], 
          dtype=[('Date', 'O'), ('Open', 'O'), ('High', 'O'), ('Low', 'O'), ('Close', 'O'), ('Volume', 'O'), ('Adj_Close', 'O')])
    '''
    

    【讨论】:

    • 嗨@plasmon360。我一直在阅读 time.strptime() 上的所有内容,以确保我至少理解了这个概念。我确实理解解决方案正在尝试做的事情。它试图将日期转换为一组介于 0 和 6 之间的数字。星期一是 0,星期六是 6。一旦我们在 x 轴上对齐 0-5,然后可以再次将它们转换为日期以进行显示。但是,我什至无法使用“打印(数据)”来工作。
    • 我只是使用你的代码直到打印如下: import numpy as np from datetime import datetime data = np.genfromtxt('/Users/paul/Documents/python/Quant/INTC.csv' , delimiter = ',', names = True, converters={0: lambda x: datetime.strptime(x, "%Y-%m-%d")}, dtype=object) print (data) 它给了我此错误:TypeError:strptime() 参数 1 必须是 str,而不是字节。我认为 cvs 日期已经是 str。和我的版本有关系吗?或者我只是不明白?谢谢。
    • 我不确定为什么它不起作用,但可能有些日期字符是 unicode 并且它正在将它们加载为字节。我猜你使用的是 python3?也许你可以试试这个 converters={0: lambda x: datetime.strptime(x.decode('ascii'), "%Y-%m-%d")}
    • 它工作到了打印(数据)行!唯一的问题是它前面有一个'b'。这个对吗? [ (datetime.datetime(2017, 11, 10, 0, 0), b'46.040001', b'46.090000', b'45.380001', b'45.580002', b'45.580002', b'24095400') 还有一个之后的错误。我将尝试弄清楚那部分。再次感谢!
    • 如果这个答案对你有帮助。请投票并接受答案。谢谢
    猜你喜欢
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多