Python 时间序列代码matplotlib图上叠加的复步长函数

Python 时间序列代码matplotlib图上叠加的复步长函数,python,function,datetime,matplotlib,Python,Function,Datetime,Matplotlib,是否有人知道在使用步骤函数pyplot.step(x,y)时存在问题,其中x值由datetime实例给出??? 我可以让函数很容易地绘图,除非我使用日期时间序列作为x值。 我有一个如下所示的矩阵: In [3]: Minor_trend_matrix[0:20] Out[3]: matrix([[ 0, 1], [ 1, 2], [ 1, 3], [ 1, 4], [-1, 5], [ 0, 6],

是否有人知道在使用步骤函数pyplot.step(x,y)时存在问题,其中x值由datetime实例给出??? 我可以让函数很容易地绘图,除非我使用日期时间序列作为x值。 我有一个如下所示的矩阵:

In [3]: Minor_trend_matrix[0:20]
Out[3]: 
matrix([[ 0,  1],
        [ 1,  2],
        [ 1,  3],
        [ 1,  4],
        [-1,  5],
        [ 0,  6],
        [ 1,  7],
        [ 2,  8],
        [ 0,  9],
        [ 1, 10],
        [ 1, 11],
        [ 1, 12],
        [ 1, 13],
        [ 1, 14],
        [-1, 15],
        [-1, 16],
        [-1, 17],
        [ 1, 18],
        [ 1, 19],
        [-1, 21]])
注:第一列仅由-2、-1,0,1,2组成 这些表示步骤功能所需的不同操作; -2是指数范围的高值,然后是指数范围的低值 -1是指数范围的下限 0不是操作 1是指数范围的高值 2是指数范围的低值,然后是指数范围的高值

这些索引引用datetime对象。我认为这就是步进函数遇到麻烦的地方。如有任何建议或替代方案,将不胜感激。 此外,关于由整数表示的动作的细节,您是否认为,因为例如,矩阵的运行可能如下所示

 [ 1,  2],
 [ 1,  3],
 [ 1,  4]
但我只希望在变更发生之前对最终项目进行操作,不包括零,我应该删除相关项目之前的所有之前的条目(在不同条目之前,即在本例中为-1,2,-2),如果是,我将如何进行此操作?? 此外,任何关于实施适当代码以实现此目标的帮助也将不胜感激

# Package Imports

import csv
import datetime
import matplotlib.pyplot as plt
import numpy as np
import dateutil.relativedelta as rd
import bisect
import scipy as sp

## File Settings

ipath = "/home/kane/Downloads/Charts/Wheat/W2/"
fname = "W2_0_L1N.CSV"

dateList = []
openList = []
highList = []
lowList = []
closeList = []
x = []
g = []
portfolio_list = []
result = []

portfolio = csv.DictReader(open(ipath + fname, "rb"))
portfolio_list.extend(portfolio)


for data in portfolio_list:
    dateList.append(data['Date'])
    openList.append(data[' Open'])
    highList.append(data[' High'])
    lowList.append(data[' Low'])
    closeList.append(data[' Close'])



for item in dateList:
    d = datetime.datetime.strptime(item, '%Y%m%d')

    t = d.toordinal()
    x.append(d)
    g.append(t)


dataArray = np.asarray([x, openList, highList, lowList, closeList])
dataArrayOrd = np.array([g, openList, highList, lowList, closeList], 
dtype = float)
代码的绘图部分如下所示:

# Plot settings
fig = plt.figure(figsize=(10, 5))
ax = fig.add_subplot(111)

line0 = plt.plot(x, simple_slope, 'k', label = "High Slope")
line1 = plt.plot(x, dataArray[1,:], 'g', label = "Open")  
line2 = plt.plot(x, dataArray[2,:], 'r', label = "High")
line3 = plt.plot(x, dataArray[3,:], 'y', label = "Low")
line4 = plt.plot(x, dataArray[4,:], 'b', label = "Close")
lns = line0 + line1 + line2 + line3 + line4
labs = [l.get_label() for l in lns]
ax.legend(lns, 
          labs, 
          loc='upper left', 
          frameon = False, 
          shadow=False, 
          fancybox=False, 
          labelspacing=0.1, 
          ncol=4, 
          prop={'size':9}
          )
ax.set_title(fname , fontsize = 12)



plt.xticks(fontsize = 8)
plt.yticks(fontsize = 8)
ax.set_ylabel( 'Cents', fontsize = 10 )
ax.grid()
plt.show()
plt.step(x[Minor_trend_matrix[:,1]],dataArray[2,Minor_trend_matrix[:,1]])
此图中的x轴是时间,因此datetime值,因此step函数应按如下方式工作:

# Plot settings
fig = plt.figure(figsize=(10, 5))
ax = fig.add_subplot(111)

line0 = plt.plot(x, simple_slope, 'k', label = "High Slope")
line1 = plt.plot(x, dataArray[1,:], 'g', label = "Open")  
line2 = plt.plot(x, dataArray[2,:], 'r', label = "High")
line3 = plt.plot(x, dataArray[3,:], 'y', label = "Low")
line4 = plt.plot(x, dataArray[4,:], 'b', label = "Close")
lns = line0 + line1 + line2 + line3 + line4
labs = [l.get_label() for l in lns]
ax.legend(lns, 
          labs, 
          loc='upper left', 
          frameon = False, 
          shadow=False, 
          fancybox=False, 
          labelspacing=0.1, 
          ncol=4, 
          prop={'size':9}
          )
ax.set_title(fname , fontsize = 12)



plt.xticks(fontsize = 8)
plt.yticks(fontsize = 8)
ax.set_ylabel( 'Cents', fontsize = 10 )
ax.grid()
plt.show()
plt.step(x[Minor_trend_matrix[:,1]],dataArray[2,Minor_trend_matrix[:,1]])
当然,确切的问题有点复杂,需要访问

dataArray[3,Minor_trend_matrix[:,1]]
阶跃函数垂直线的值应向下移动到范围的下限,当需要访问高和低或低和高时,则更为复杂。这将是一个开发正确的条件语句的问题。但是,当前的问题在于,在我可以继续之前,让一个简单的版本能够正确使用日期时间值。

解决方案:

我已经用step函数解决了这个问题。这是由于阶跃函数的工作方式。我必须通过for循环生成datetime对象。我现在可以得到一个我想要实现的简单版本

# Package Imports

import csv
import datetime
import matplotlib.pyplot as plt
import numpy as np
import dateutil.relativedelta as rd
import bisect
import scipy as sp

## File Settings

ipath = "/home/kane/tripkane_python/"
fname = "datetime_test_data.csv"


portfolio_list = []
dateList = []
valueList = []
x = []

portfolio = csv.DictReader(open(ipath + fname, "rb"))
portfolio_list.extend(portfolio)


for data in portfolio_list:
    dateList.append(data['date'])
    valueList.append(data[' value'])

for item in dateList:
    d = datetime.datetime.strptime(item, '%Y%m%d')
    t = d.toordinal()
    x.append(d)


dataArray = np.asarray([x, valueList])

stepList = [0, 3, 5]

TIda = []
TIv = []

for n in range(0, len(stepList)):
    TIda.append(x[stepList[n]])
    TIv.append(valueList[stepList[n]])


# Plot 

fig = plt.figure(figsize=(10, 5))
ax = fig.add_subplot(111)

line1 = plt.plot(x, valueList, 'b')
lns = line1

labs = [l.get_label() for l in lns]
ax.legend(lns, 
          labs, 
          loc='upper left', 
          frameon = False, 
          shadow=False, 
          fancybox=False, 
          labelspacing=0.1, 
          ncol=4, 
          prop={'size':9}
          )
ax.set_title(fname , fontsize = 12)



plt.xticks(fontsize = 8)
plt.yticks(fontsize = 8)
ax.set_ylabel( 'Cents', fontsize = 10 )
ax.grid()

plt.step(TIda, TIv, 'r')

plt.show()

现在的问题是如何生成适当的条件语句来实现目标。

如何调用
plt.step
函数?您好@DavidZwicker。有关更多信息,请参阅修订版。感谢您的关注。您好@tcaswell请参阅修订后的问题了解详细信息。谢谢Kane@tripkane你应该使用你的更新来回答你自己的问题(然后接受它)。很高兴你解决了自己的问题@谢谢你,伙计。干杯;)