使用Numpy创建Yahoo财经价格表
我不想使用matplotlib的金融模块。我想把网址的数据放到一个numpy数组里。这样我就可以用列标题来做一些数学运算。比如:
prices = r.adj_close
来源于: http://matplotlib.sourceforge.net/examples/pylab_examples/finance_work2.html
不过我不想使用:
fh = finance.fetch_historical_yahoo(ticker, startdate, enddate)
# a numpy record array with fields: date, open, high, low, close, volume, adj_close)
r = mlab.csv2rec(fh); fh.close()
r.sort()
我想手动创建网址:
url = http://ichart.yahoo.com/table.csv?a=2&c=2011&b=30&e=7&d=7&g=d&f=2011&s=msft&ignore=.csv
f = urllib.urlopen(url)
fr = f.read()
hdata = np.asarray(fr, dtype='object')
prices = hdata.adj_close
print prices
3 个回答
0
你也可以用 S10
来告诉 numpy,第一个元素是一个长度为 10 的字符串。这样,你就不需要使用 lambda 了。
data = np.loadtxt(f, dtype={'names': ('dtime', 'open', 'high','low','close','volume','aclose'), 'formats': ('S10', '<f8', '<f8','<f8','<f8','i','<f8')},
delimiter="," )
i=integer, <f8 =0.256, f8=0.25600001298, S10="MM-DD-YYYY"
想了解更多关于 f、f8、u4、S、u8 等的内容,可以访问这个 链接。
0
如果你不想使用 pylab
来进行时间字符串的转换,可以用 mktime
函数来简化这个过程,直接用一个简单的函数(也叫 lambda 函数)来实现:
import numpy as np
import urllib
import time
url = "http://ichart.yahoo.com/table.csv?a=2&c=2011&b=30&e=7&d=7&g=d&f=2011&s=msft&ignore=.csv"
f = urllib.urlopen(url)
title = f.readline().strip().split(",")
data = np.loadtxt(f, dtype={'names': ('dtime', 'open', 'high','low','close','volume','aclose'),
'formats': ('u4', 'f8', 'f8','f8','f8','u4','f8')},
delimiter=",",
converters={0: lambda y:int(time.mktime(time.strptime(y,'%Y-%m-%d')))})
4
使用numpy.loadtxt()来加载csv文件:
import numpy as np
import pylab as pl
import urllib
url = "http://ichart.yahoo.com/table.csv?a=2&c=2011&b=30&e=7&d=7&g=d&f=2011&s=msft&ignore=.csv"
f = urllib.urlopen(url)
title = f.readline().strip().split(",")
data = np.loadtxt(f, dtype=np.float, delimiter=",", converters={0: pl.datestr2num}))
第一列是日期,所以要用pylab.datestr2num把它转换成数字。