量化杂谈之基础篇系列文章:
基础篇1:https://bbs.pinggu.org/thread-4145710-1-1.html
基础篇2:https://bbs.pinggu.org/thread-4154818-1-1.html
基础篇3:https://bbs.pinggu.org/thread-4164534-1-1.html
基础篇4:https://bbs.pinggu.org/thread-4172585-1-1.html
基础篇5:https://bbs.pinggu.org/thread-4191475-1-1.html
基础篇6:https://bbs.pinggu.org/thread-4409589-1-1.html
在这一篇中我们会接着上一讲的内容讲一讲如何从从数据库中读取数据。通过这一篇和上一篇的讲解,同学们应该能对数据库的IO过程有一个初步的了解。
从数据库中读取数据的主要方法是采用pandas包中的read_sql_query方法,该方法可以对数据库的表进行query并将查询出来的数据存储为一个DataFrame,其主要参数有以下几个:sql: sql的查询语句(select)
con : 数据库connnect
index_col: 作为index的列
如果我们希望从上一讲中存放历史bars数据的表中取出股票代码为002337在2012年1月1号到2012年2月1号每日的bar数据,在mysql中其query语句为:
SELECT
*
FROM his_daily_adj_bars
WHERE code = ‘002337’
AND bar_date>='2012-01-01' AND bar_date<=‘2012-02-01'复制代码
为了更一般的适用性,我们可以将表名、股票代码、开始以及结束日期作为参数放在select语句中。下面ReadSqlSource对象中的get_bars方法实现了这样的功能。
class ReadSqlSource(object):
def __init__(self):
try:
self.db = mysql.connect("localhost","root","123456","test")
self.cursor = self.db.cursor()
except mysql.Error,e:
print self.get_cur_time() + "连接数据库错误,%d: %s" % (e.args[0], e.args[1])
def get_bars(self, table, code, start_time, end_time):
sql = "SELECT bar_date, open_price, high_price, low_price, close_price, volume FROM %s \
WHERE bar_date>='%s' AND bar_date<='%s' AND code=%s"%(table, start_time, end_time, code)
data = pd.read_sql_query(sql, self.db, index_col='bar_date')
return data复制代码
采用以上方法可以将需要的数据取出来,并存在一个DataFrame中。在这层数据上面,我们还可以用一个数据包装器把它封装起来。数据包装器是一个更为抽象的数据类,在包装器中可以添加各种读取功能。在这里,我们添加了一个非常简单的功能——逐条从数据包装器中读取数据。
class SqlDataWrapper(object):
def __init__(self, data):
self.data = data
self.max_len = len(data)
self.curbar = -1
def rolling_read(self):
self.curbar += 1
if self.curbar == self.max_len:
return None
else:
return self.data.iloc[self.curbar]复制代码
下面可以采用一个实例进行测试:
if __name__ == '__main__':
test = ReadSqlSource()
data = test.get_bars('his_daily_adj_bars','002337','2012-01-01','2012-02-01')
wrapper = SqlDataWrapper(data)
print wrapper.rolling_read()
print wrapper.rolling_read()复制代码
我的微信公众号:会掘金的小鹿(NuggetsRoad)
是时候关注一波了!