金融时间序列的matplotlib图的嵌套循环

时间:2014-06-30 19:46:18

标签: python matplotlib

我正在尝试打印所选代码的图形,因为我正在学习python和matplotlib。我写了下面的代码并且它工作正常,除了打印整个代码列表的图例,我理解为什么它这样做,但我不明白如何让它只打印相关的自动收报机到那个图。 我也觉得,由于我是初学者,我可能写了太多代码,如果有人可以指导我如何减少这些代码,那将有助于我学习正确的方法。

#!/usr/bin/env python3
import numpy as np
import datetime
import pandas as pd
import pandas.io.data
from pandas import Series, DataFrame

import matplotlib.pyplot as plt
import matplotlib as mpl

tickers=["ADBE","AAPL","GME","SNDK"]
roll_pd=30
num_std=2
flist=[]
ts_cutoff_days=-220
flag=1
start=datetime.datetime(2008,7,1)
end=datetime.date.today()

for ticker in tickers:
    time_srs=pd.io.data.get_data_yahoo(ticker,start,end)
    #time_srs.head()
    fname=ticker+"_ohlc.csv"
    print (fname)
    time_srs.to_csv(fname) 
    flist.append(fname)

for fn in flist:
    #print(fn)
    df=pd.read_csv(fn,index_col='Date',parse_dates=True)
    df.head()
    df.index
    close_px=df['Adj Close']
    ts=df['Adj Close'][ts_cutoff_days:]
    if flag==0:
        px_srs=close_px
    else:
        px_srs=ts

    mavg=pd.rolling_mean(px_srs,roll_pd)
    mstd=pd.rolling_std(px_srs,roll_pd)

    rets=px_srs / px_srs.shift(1) - 1
    rets.head()


    plt.figure()
    plt.plot(px_srs.index, px_srs,color='k',label=tickers)# this is where I am making the error
    plt.plot(mavg.index, mavg,label='mavg',color='red')
    plt.fill_between(mstd.index,mavg-num_std*mstd,mavg+num_std*mstd,color='b',alpha=0.2)
    plt.legend(loc='best')
    plt.axes().yaxis.grid(True)
    plt.show()

if flag==0:
    df1 = pd.io.data.get_data_yahoo(tickers,start, end)['Adj Close']
else:
    df1 = pd.io.data.get_data_yahoo(tickers,start, end)['Adj Close'][ts_cutoff_days:]# I tried writing [ts] instead of ['Adj Close'][ts_cutoff_days:], but it gave me an error, so I had to write this above if-else condition to create df1 correctly

2 个答案:

答案 0 :(得分:1)

我认为您应该抛弃flist,因为所有信息都在tickers中。然后您可以这样做:

...

for ticker in tickers:
    df=pd.read_csv(ticker + 'ohlc.csv',index_col='Date',parse_dates=True)
    ...
    plt.plot(px_srs.index, px_srs,color='k',label=ticker)

如果您担心更改文件名,那么您可以为其创建一个简单的函数,并在读取和写入文件时使用它。

另一种可能性是将一个元组放入flist:

for ticker in tickers:
    ...
    flist.append((ticker, fname))

然后在下一个循环中使用此元组:

for ticker, fn in flist:
    ...

这也使您可以使用ticker作为情节标签。

答案 1 :(得分:0)

我相信你需要设置plt.title而不是label:

plt.title = ticker

labels, annotations, etc