経済指標カレンダーの作成とsqlite へ取り込み

経済指標カレンダーの作成とsqlite へ取り込み

メルマガから

■■■7月21日(月)■■■
・日本は祝日で休場
・日本の参議院選挙明け
・週明け
・米国の主要企業の決算発表(本格化)
07:45 NZ)第2四半期消費者物価指数
23:00 ★米)景気先行指数

■■■7月22日(火)■■■
・米国の主要企業の決算発表(本格化)
07:45 NZ)貿易収支
10:30 豪)RBA議事録公表(7月8日開催分)
18:15 ★米)ベイリーBOE総裁の発言   
21:30 ★米)パウエルFRB議長の発言(ブラックアウト期間中で金融政策に関する発言はない予定)
23:00 ★米)リッチモンド連銀製造業指数
26:00 ★米)ボウマンFRB副議長の発言(ブラックアウト期間中で金融政策に関する発言はない予定)
-     ★米)注目度の高い経済指標の発表はない

■■■7月23日(水)■■■
・米国の主要企業の決算発表(本格化)→テスラ、アルファベット、その他
10:30 日)内田日銀副総裁の発言(あいさつ)
未定 日)40年利付国債入札
未定 日)内田日銀副総裁の発言(記者会見)
20:00 ★米)MBA住宅ローン申請指数
23:00 ★米)中古住宅販売件数
23:30 ★米)週間原油在庫
26:00 ★米)20年債入札
米株引後 ★米)テスラ決算
米株引後 ★米)アルファベット決算

■■■7月24日(木)■■■
・米国の主要企業の決算発表(本格化)     
12:05 豪)ブロックRBA総裁の発言   
16:15 仏)製造業PMI【速報値】
16:15 仏)非製造業PMI【速報値】
16:30 独)製造業PMI【速報値】
16:30 独)非製造業PMI【速報値】
17:00 欧)製造業PMI【速報値】
17:00 欧)非製造業PMI【速報値】
17:30 英)製造業PMI【速報値】
17:30 英)非製造業PMI【速報値】
20:00 ト)TCMB政策金利&声明発表
21:15 欧)ECB政策金利&声明発表
21:30 加)小売売上高&【除自動車】
21:45 欧)ラガルドECB総裁の記者会見
21:30 ★米)新規失業保険申請件数     
21:30 ★米)シカゴ連銀全米活動指数
22:45 ★米)製造業PMI【速報値】
22:45 ★米)非製造業PMI【速報値】
23:00 ★米)新築住宅販売件数
23:30 ★米)週間天然ガス貯蔵量
24:00 ★米)カンザスシティ連銀製造業活動指数

■■■7月25日(金)■■■
・週末
・五十日(25日)
・米国の主要企業の決算発表(本格化)
08:30 日)東京都区部消費者物価指数&【除生鮮】
15:00 英)小売売上高&【除自動車】
17:00 独)IFO景況指数
21:30 ★米)耐久財受注&【除輸送用機器】

の部分をコピペして
chatGPTで

これらをcsvファイルにして

とするとcsvが作成できる

これを既に作成ずみのDBへ追加する

✅ ポイント
引数 内容
if_exists=’append’ 既存テーブルがあれば追記(削除せず)
index=False DataFrameの行番号をDBに書き込まないようにする

とすればOKらしい

✅ ステップ概要
1. SQLiteテーブルに一意制約(UNIQUE)を追加
2. to_sql() ではなく 手動でUPSERT処理 を行う(INSERT OR IGNORE)

SQLiteに CSV を追加する際に重複をチェックし、すでに登録済みのレコードはスキップ(UPSERT) する処理を組み込む

✅ 特徴
処理内容 説明
CREATE TABLE IF NOT EXISTS 初回だけテーブルを作成
UNIQUE(date, time, country, event) 主な識別要素による重複防止
ON CONFLICT IGNORE 重複レコードがある場合は無視してスキップ
INSERT OR IGNORE 既存レコードと重複するものは挿入されない

これらを元に

vim add_calendarDB.py

内容を

import pandas as pd
import sqlite3

# 新しいCSVを読み込み
csv_path = "economic_events_20250721_25.csv"
df_new = pd.read_csv(csv_path)

# SQLiteに接続
conn = sqlite3.connect("economic_events.db")
cursor = conn.cursor()

# ① テーブルがまだ存在しない場合は一意制約付きで作成
cursor.execute("""
CREATE TABLE IF NOT EXISTS events (
    date TEXT,
    time TEXT,
    country TEXT,
    event TEXT,
    importance TEXT,
    type TEXT,
    UNIQUE(date, time, country, event) ON CONFLICT IGNORE
)
""")

# ② 各レコードを1件ずつINSERT OR IGNOREで追加
for _, row in df_new.iterrows():
    cursor.execute("""
        INSERT OR IGNORE INTO events (date, time, country, event, importance, type)
        VALUES (?, ?, ?, ?, ?, ?)
    """, (
        row["date"],
        row["time"],
        row["country"],
        row["event"],
        row["importance"],
        row["type"]
    ))

# コミット & 終了
conn.commit()

# レコード数を確認
cursor.execute("SELECT COUNT(*) FROM events")
print(f"現在のeventsテーブルの件数: {cursor.fetchone()[0]}")

conn.close()

として保存

実行すると

python add_calendarDB.py 
現在のeventsテーブルの件数: 90

となる

これで再度、今日のイベント情報を取得してみる

 python today_events.py                       
         date   time country               event importance  type
0  2025-07-25  08:30       日  東京都区部消費者物価指数&【除生鮮】       None  経済指標
1  2025-07-25  15:00       英        小売売上高&【除自動車】       None  経済指標
2  2025-07-25  17:00       独             IFO景況指数       None  経済指標
3  2025-07-25  21:30       米      耐久財受注&【除輸送用機器】          ★  経済指標

問題なく実行できた

次に金の価格などの過去データだが
これは investing.com へ無料登録すれば過去データの取得が可能
一気にダウンロードしようとしたけど
20年ぐらいが限界なので分けて取得する

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です