量化与mysql_【量化杂谈之基础篇7】从数据库中读取数据

量化杂谈之基础篇系列文章:

基础篇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)

是时候关注一波了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值