LoginSignup
3
6

More than 5 years have passed since last update.

【備忘録】Pythonで日次で四半期決算を取得してSqliteに投げる

Last updated at Posted at 2019-03-27

はじめに

初記事です。テスト用。

kessan.py

import pandas as pd
import datetime
import sqlite3

def Get_DataF(data):
  #決算プロ【http://ke.kabupro.jp】の全上場企業・短信XBRL一括ダウンロードページより取得
  yyyymmdd = data.strftime("%Y%m%d")
  yyyy_mm_dd = data.strftime("%Y/%m/%d")
  df = pd.read_excel(r'http://ke.kabupro.jp/down/{}f.xls'.format(yyyymmdd))\
      .query('連結個別 == "連結" ')

  CashFlow = df.drop(['企業名', '決算期間', '期首', '会計基準', '連結個別', '決算期', '名寄前勘定科目(売上高欄に掲載)', '売上高',
                      '営業利益', '経常利益', '純利益', '一株当り純利益', '希薄化後一株当り純利益', '純資産又は株主資本',
                      '総資産', '一株当り純資産'], axis=1).dropna(subset=['営業キャッシュフロー', '投資キャッシュフロー', '財務キャッシュフロー'])\
      .drop_duplicates(subset=['証券コード', '期末'], keep='last')

  QtlyRslt = df.drop(['企業名', '期首', '会計基準', '連結個別', '決算期', '名寄前勘定科目(売上高欄に掲載)', '営業キャッシュフロー',
                      '投資キャッシュフロー', '財務キャッシュフロー'], axis=1).drop_duplicates(subset=['証券コード', '決算期間', '期末'], keep='last')

  return QtlyRslt.values.tolist(), CashFlow.values.tolist()

def Row_data_Qtly(row):
    code = row[0]
    name = row[1]
    term = row[2].strftime("%Y-%m-%d")
    amount_sales = row[3]
    ope_income = row[4]
    ord_income = row[5]
    net_income = row[6]
    net_income_per_share = row[7]
    diluted_net_income_per_share = row[8]
    net_assets = row[9]
    total_assets = row[10]
    net_assets_per_share = row[11]
    presendate = row[12].strftime("%Y-%m-%d")

    return code, name, term, amount_sales, ope_income, ord_income, net_income, net_income_per_share, \
           diluted_net_income_per_share, net_assets, total_assets, net_assets_per_share, presendate

def Row_data_CashData(row):
    code = row[0]
    term = row[1].strftime("%Y-%m-%d")
    sales_cash = row[2]
    invest_cash = row[3]
    financial_cash = row[4]
    presendate = row[5].strftime("%Y-%m-%d")

    return code, term, sales_cash, invest_cash, financial_cash, presendate

def QtlyData_Generator(data):
    for index in range(len(data )):
        d = Row_data_Qtly(data[index])
        yield d

def CashData_Generator(data):
    for index in range(len(data )):
        h = Row_data_CashData(data[index])
        yield h

def insert_data_to_db(db_file_name):
  conn = sqlite3.connect(db_file_name)
  now = datetime.datetime.now()
  data = Get_DataF(now)

  #更新が無ければ終了
  if len(data[0]) == 0 and len(data[1]) == 0:
      print("更新無し")
      return None

  with conn:
    conn.execute('BEGIN TRANSACTION')
    sql1 = "INSERT OR REPLACE INTO Corp_QuarterlyResults_R(BrandCode, TermName, Term, Amount_Sales, Ope_Income," \
          "Ord_Income,Net_Income,Net_Income_Per_Share,Diluted_Net_Income_Per_Share,Net_Assets,Total_Assets,"\
          "Net_Assets_Per_Share,PresenDate,RegTime, UpdTime)" \
          "VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,datetime('now', 'localtime'),datetime('now', 'localtime'))"
    conn.executemany(sql1, QtlyData_Generator(data[0]))

    sql2 = "INSERT OR REPLACE INTO Corp_CashFlow_R(BrandCode, Term, Sales_Cash, Invest_Cash, Financial_Cash, PresenDate, RegTime, UpdTime)" \
          "VALUES(?,?,?,?,?,?,datetime('now', 'localtime'),datetime('now', 'localtime'))"
    conn.executemany(sql2, CashData_Generator(data[1]))
    conn.commit()

#現在の日時をyyyymmdd形式で取得
insert_data_to_db(r"filepath")

filepathにはSqlite3のdbファイルのフルパスを入れればできる。

ddlはこんな感じ。

create.sql

CREATE TABLE `Corp_QuarterlyResults_R` (
    `BrandCode` TEXT,
    `TermName`  TEXT,
    `Term`  TEXT,
    `Amount_Sales`  REAL,
    `Ope_Income`    REAL,
    `Ord_Income`    REAL,
    `Net_Income`    REAL,
    `Net_Income_Per_Share`  REAL,
    `Diluted_Net_Income_Per_Share`  REAL,
    `Net_Assets`    REAL,
    `Total_Assets`  REAL,
    `Net_Assets_Per_Share`  REAL,
    `PresenDate`    TEXT,
    `RegTime`   TEXT,
    `UpdTime`   TEXT,
    PRIMARY KEY(`BrandCode`,`TermName`,`Term`)
);
CREATE TABLE `Corp_CashFlow_R` (
    `BrandCode` TEXT,
    `Term`  TEXT,
    `Sales_Cash`    REAL,
    `Invest_Cash`   REAL,
    `Financial_Cash`    REAL,
    `PresenDate`    TEXT,
    `RegTime`   TEXT,
    `UpdTime`   TEXT,
    PRIMARY KEY(`BrandCode`,`Term`)
);

差分抽出ではないので、なんか、こう、駄目ですね。
いい感じになんかできたらいいですね。

3
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
6