楼主: wl142857
2634 3

[源码分享] 【量化杂谈之基础篇7】从数据库中读取数据 [推广有奖]

  • 0关注
  • 34粉丝

硕士生

70%

还不是VIP/贵宾

-

威望
0
论坛币
201 个
通用积分
0
学术水平
11 点
热心指数
12 点
信用等级
8 点
经验
7091 点
帖子
86
精华
0
在线时间
281 小时
注册时间
2009-2-22
最后登录
2020-6-24

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

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

基础篇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语句为:

  1. SELECT
  2.     *
  3. FROM  his_daily_adj_bars
  4. WHERE  code =  ‘002337’
  5. AND  bar_date>='2012-01-01' AND bar_date<=‘2012-02-01'
复制代码

为了更一般的适用性,我们可以将表名、股票代码、开始以及结束日期作为参数放在select语句中。下面ReadSqlSource对象中的get_bars方法实现了这样的功能。

  1. class ReadSqlSource(object):
  2.    
  3.     def __init__(self):
  4. try:
  5.             self.db = mysql.connect("localhost","root","123456","test")
  6.             self.cursor = self.db.cursor()
  7.         except mysql.Error,e:
  8.             print self.get_cur_time() + "连接数据库错误,%d: %s" % (e.args[0], e.args[1])
  9.             
  10.     def get_bars(self, table, code, start_time, end_time):
  11.         sql = "SELECT bar_date, open_price, high_price, low_price, close_price, volume FROM %s \
  12.                 WHERE bar_date>='%s' AND bar_date<='%s' AND code=%s"%(table, start_time, end_time, code)
  13.         data = pd.read_sql_query(sql, self.db, index_col='bar_date')
  14.         return data
复制代码

采用以上方法可以将需要的数据取出来,并存在一个DataFrame中。在这层数据上面,我们还可以用一个数据包装器把它封装起来。数据包装器是一个更为抽象的数据类,在包装器中可以添加各种读取功能。在这里,我们添加了一个非常简单的功能——逐条从数据包装器中读取数据。

  1. class SqlDataWrapper(object):
  2.    
  3.     def __init__(self, data):
  4.         self.data = data
  5.         self.max_len = len(data)
  6.         self.curbar = -1
  7.         
  8.     def rolling_read(self):
  9.         self.curbar += 1
  10.         if self.curbar == self.max_len:
  11.             return None
  12.         else:
  13.             return self.data.iloc[self.curbar]
复制代码

下面可以采用一个实例进行测试:

  1. if __name__ == '__main__':
  2.     test = ReadSqlSource()
  3.     data = test.get_bars('his_daily_adj_bars','002337','2012-01-01','2012-02-01')
  4.     wrapper = SqlDataWrapper(data)
  5.     print wrapper.rolling_read()
  6.     print wrapper.rolling_read()
复制代码


我的微信公众号:会掘金的小鹿(NuggetsRoad)
是时候关注一波了!


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:读取数据 数据库 基础篇 Dataframe pinggu 数据库 文章 量化投资

已有 3 人评分经验 论坛币 学术水平 热心指数 收起 理由
一缕阳光等你 + 66 + 16 + 1 精彩帖子
MemMao + 5 + 3 + 3 热心帮助其他会员
fantuanxiaot + 66 精彩帖子

总评分: 经验 + 66  论坛币 + 87  学术水平 + 4  热心指数 + 3   查看全部评分

沙发
MemMao 发表于 2016-3-16 09:08:43 |只看作者 |坛友微信交流群
很不错,加油

使用道具

藤椅
一缕阳光等你 学生认证  发表于 2016-7-1 08:39:11 |只看作者 |坛友微信交流群
顶,好的知识值得分享,分享快乐,加油

使用道具

板凳
gxlynn 发表于 2018-2-11 17:34:13 |只看作者 |坛友微信交流群
支持一下!

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 17:58