zoukankan      html  css  js  c++  java
  • python+Sqlite+Dataframe打造金融股票数据结构

    5. 本地数据库

    很简单的用本地Sqlite查找股票数据。

    DataSource类,返回的是Dataframe物件。这个Dataframe物件,在之后的业务,如计算股票指标,还需要特别处理。

    import os
    import sqlite3 as sqlite3
    import numpy as np
    import pandas as pd
    
    
    # 数据源
    class DataSource:
        def __init__(self):
            self.db = None              # 数据库
            self.cursor = None          # 指针
            self.stocks = {}            # 股票池
            self.indexs = {}            # 指数池
            self.name = 'unit_test.db'  # 数据源名称
    
        def connect(self):
            self.db = sqlite3.connect(os.path.abspath(self.name))
            self.cursor = self.db.cursor()
    
        def get_stocks(self, ucodes):
            # 股票池
            try:
                self.stocks = {}
                self.connect()
                self.db.row_factory = lambda cursor, row: row[0]
                for ucode in ucodes:
                    sql = """SELECT t.code, t.lot, t.nmll, t.stime, t.high, t.low, t.open, t.close, t.volume
                                FROM (SELECT n.code, n.lot, n.nmll, c.stime, c.high, c.low, c.open, c.close, c.volume 
                                    FROM s_{} AS c INNER JOIN name AS n 
                                        ON c.code=n.code ORDER BY c.stime DESC LIMIT 365*20) AS t 
                                    /*INNER JOIN financial AS f 
                                ON t.code=f.code AND substr(t.stime,1,4)=f.year*/
                            ORDER BY t.stime""".format(ucode)
                    self.cursor.execute(sql)
                    columns = ['code', 'lot', 'nmll', 'sdate', 'high', 'low', 'open', 'last', 'vol']
                    self.stocks[ucode] = pd.DataFrame(self.cursor.fetchall(), columns=columns)
                self.db.commit()
                self.cursor.close()
                self.db.close()
                return self.stocks
            except sqlite3.Error as e:
                print(e)
    
        def get_indexs(self, indexs):
            try:
                # 指数池
                self.indexs = {}
                self.connect()
                self.db.row_factory = lambda cursor, row: row[0]
                for index in indexs:
                    sql = """SELECT t.code, t.lot, t.nmll, t.stime, t.high, t.low, t.open, t.close, t.volume
                                FROM (SELECT n.code, n.lot, n.nmll, c.stime, c.high, c.low, c.open, c.close, c.volume 
                                    FROM s_{} AS c INNER JOIN name AS n 
                                        ON c.code=n.code ORDER BY c.stime DESC LIMIT 365*20) AS t 
                                    /*INNER JOIN financial AS f 
                                ON t.code=f.code AND substr(t.stime,1,4)=f.year*/
                            ORDER BY t.stime""".format(index.upper())
                    self.cursor.execute(sql)
                    columns = ['code', 'lot', 'nmll', 'sdate', 'high', 'low', 'open', 'last', 'vol']
                    self.indexs[index] = pd.DataFrame(self.cursor.fetchall(), columns=columns)
                self.db.commit()
                self.cursor.close()
                self.db.close()
                return self.indexs
            except sqlite3.Error as e:
                print(e)
    
    
    data_source = DataSource()
    df1 = data_source.get_stocks(['00700'])
    df2 = data_source.get_indexs(['hsi'])
  • 相关阅读:
    java经典入门算法题,小白必备!
    java客房管理小项目,小白练手必备!
    10道java经典算法题,每一题都能提升你的java水平!第二弹!
    活动目录对象属性批量修改工具------ADModify
    CentOS7基于http方式搭建本地yum源
    如何禁用AD OU 下面的邮箱用户的Exchange ActiveSync 和 适用于设备的OWA
    通过组策略禁止有本地管理员权限的域用户更改网络配置
    1 什么是virtual Machine
    写Ansible playbook添加zabbix被监控的对象
    Windows server 安装和配置zabbix agent
  • 原文地址:https://www.cnblogs.com/chenkuang/p/12236519.html
Copyright © 2011-2022 走看看