1. はじめに
どうも、趣味でデータ分析している猫背なエンジニアです。
いつもN-MAGIだったりKK-Adamでデータをcsvで蓄積して、そのデータを使用しているのですが、「データ保存」という観点でN-MAGIのアルゴにメス入れをしたので記録します。
2. N-MAGIの収集アーキと変更点の概要
■ 既存アーキについて
前提としてN-MAGIは、平日21時頃にNUMBERSの数字を予想するシステムです。フローとしては、みづほ銀行のNUMBERS3,4の当選番号公開情報をスクレイピング、収集したデータをcsvに保存。その後、MAGIに読み込ませて予測結果をXに投稿という流れになっています。
■ 変更点の概要
NUMBERSの当選番号をスクレイピングして、csvに保存する際にデータを上書きではなくバックアップという方法で毎日のデータを日付保管してました。

これはプロジェクトファイルの1部の写真ですが...続きの言葉はお任せします(笑)
正直言ってローカルで毎日の更新スライスを保存するなんてバグと思っています。 今回はこの部分を修正する過程で、以下の条件を加味して、githubを利用した自動保存アルゴを追加したいと思います。
2. 要件定義
以下に今回のアーキ変更で満たしたい要件を考えました。
1. 前日の収集結果は消す
これに関しては言うまでもなく将来性を考えたときにPCのディスクを圧迫してしまうので、マストで必須なことです。
N-MAGI開発を設計せずにコーディングしてた弊害ですね。設計の重要性が身に沁みます。
2. my_datasetというリポジトリで管理する
新たにmy_datasetというPublic (※) なリポジトリを作成しました。今後もデータセットを作成する可能性があるので、その中にファイルごとで管理するように追加しました。
※ Publicを強調した理由
publicを強調した理由として、みなさんにも収集したデータを使ってほしいという思いから公開することに決めました。個人サイトで収集した番号を公開されている方もいるのですが、私はセキュリティや更新頻度を含めて常に最新をモットーに公開するので、それを含めてぜひ利用してください。
3. git pushは自動更新する
これに関しては、恒例のめんどくさい病のひとりごと案件です。「あ~githubに自動でpushしてくれないかな~」から始まって、batポチっで動くものを作りたいと思ったためです。
それでは実際に開発していきましょう
3. 開発開発っ!
■ 1. 前日の収集結果を消す(リソース開放)
現状では垂れ流し状態で、フォルダ内に蓄積していたのですが、収集するpyファイルに以下のようなソースコードを追加することでリソース開放をしました。
def merge_data():
...
# 今日の日付を取得
today = datetime.today()
# 曜日を取得(0=月, 6=日)
weekday = today.weekday()
# 土曜日(5)の場合は2日前、日曜日(6)の場合は3日前の木曜日を削除対象 / 月曜日 (0) の場合は3日前の金曜日を削除対象
if weekday == 5:
target_date = today - timedelta(days=2)
elif weekday == 6:
target_date = today - timedelta(days=3)
elif weekday == 0:
target_date = today - timedelta(days=3)
else:
target_date = today - timedelta(days=1)
# フォーマット済み文字列を作成(日付を取得(YYYYMMDD形式))
today_str = target_date.strftime("%Y%m%d")
base_path = "D:/01.開発/06Numbers3/numbers_19941007_to_{}.csv"
csv_path = base_path.format(today_str)
# --- 前日のCSVを削除 ---
if os.path.exists(csv_path):
try:
os.remove(csv_path)
print(f'前日のCSVファイルを削除しました: {csv_path}')
except Exception as e:
print(f'CSVファイルの削除中にエラーが発生しました: {e}')
else:
print(f'前日のCSVファイルは存在しません: {csv_path}')
■ 2. my_datasetというリポジトリで管理する
使用しているデータを開放するためにpublicでmy_datasetというリポジトリを作りました。こちらで今後も最新のNUMBERSの当選番号を管理していきます。
また、ほかにも収集したデータがありましたら随時更新するので、ぜひgitとQiitaアカウントのフォローをお願いします(笑)
■ 3. git pushは自動更新する
最終的なアーキは以下になりました。メインからpushでもよかったのですが、APIトークンなどもあったので、専用のgithubフォルダを作成し、batAからgithub用フォルダ内にあるbatBに指令($ call batB)を出して実行するタスクチェーンにしました。
ぶっちゃけここが一番時間がかかりました。
理由はスリープするとbat B内のプログラムが沈黙するからです(笑)。
3.1 基本的なbatで単体テスト
スリープなど使わない場合は以下のbatでgitにpushできます。しかし、これでは、wake時は通るもののsleepになると通らない。
@echo off
chcp 65001
:: フォルダへのフルパス
cd "D:\01.開発\98my_dataset\numbers"
git add .
:: 現在時刻を取得してコミットメッセージに使う
for /f %%i in ('powershell -command "Get-Date -Format yyyy-MM-dd_HH-mm-ss"') do set NOW=%%i
git commit -m "Auto update on %NOW%"
git push origin main
:: 完了メッセージ
echo 自動コミット&プッシュが完了しました。
3.2 SSHを使った方法
ある記事でgithubのssh認証をすることで、以降の認証(認証したPCに限る)をPASSできるというのを見ました。そこで、毎回認証をしているので、sleepでは通らない可能性があるという考えに至りました。
案の定、正解でした。 自動実行&スリープ状態でもpushできた時は感動しました。
- 手順1 : github準備&SSH登録/接続準備
こちらのサイトを参考に作成しました。
記事自体は1年前のものになっているのですが、非常に見やすく2025年7月31日時点でのUIでも問題なく設定を進めることができました。
- 手順2 : .sshフォルダを作成、コピーする
githubとPC間のSSH開通後にsshキーが提供されます。提供されたものをSYSTEMユーザ用にコピーし、自作プログラムでも使用できるようにします。そのために、管理者権限付きPowerShellコマンドで以下を実行して、SYSTEM制御用ディレクトリを作成しました。
mkdir "C:\Windows\System32\config\systemprofile\.ssh"
作成したフォルダにid_rsaおよびid_rsa.pubをコピーする。
※id:各々で違った番号の場合もあるので、発行されたトークンを確認。
copy "C:\Users\<USERNAME>\.ssh\id_rsa" "C:\Windows\System32\config\systemprofile\.ssh\id_rsa"
copy "C:\Users\<USERNAME>\.ssh\id_rsa.pub" "C:\Windows\System32\config\systemprofile\.ssh\id_rsa.pub"
コピーしたid_rsaのパーミッション(アクセス権)が広すぎるとsshは拒否されます。そのため、セキュリティ担保のためにも以下のおまじないをしておくことで、アクセス権を限定しておくと安心。id_rsaは各々変更してくださいね👍
icacls "C:\Windows\System32\config\systemprofile\.ssh\id_rsa" /inheritance:r /grant:r "SYSTEM:R"
- 手順3 : 開通確認
バッチファイル中で以下の環境変数がセットされているか確認し、タイムスケジューラやスリープ状態でbatを実行などして確認してみてください!
set "HOME=C:\Windows\System32\config\systemprofile"
set "GIT_SSH_COMMAND=ssh -i %HOME%\.ssh\id_rsa"
- 修正したソースコード
3.1にスリープでも稼働するように修正を加えたものが以下になります。このbatをcsvが配置されているフォルダ内に置きます。私が仕事や旅行で自宅にいなくてもPCに電源を入れていたら自動でpush更新してくれているので、とても便利になりました。
※トークンやgit情報に関しては変更してください。
@echo off
chcp 65001
setlocal
:: --- 日時の整形(ファイル名やコミットメッセージ用) ---
for /f "tokens=1-4 delims=/ " %%a in ("%DATE%") do (
set YYYY=%%a
set MM=%%b
set DD=%%c
)
for /f "tokens=1-2 delims=:. " %%a in ("%TIME%") do (
set HH=%%a
set MN=%%b
)
set NOW=%YYYY%-%MM%-%DD%_%HH%-%MN%
:: --- SSH環境変数設定 ---
set "HOME=C:\Users\<USERNAME>"
set "GIT_SSH_COMMAND=ssh -i %HOME%\.ssh\id_rsa"
:: --- Dドライブ確認(最大30秒待機) ---
set RETRY=0
:WAIT_LOOP
if exist D:\ (
echo Dドライブが見つかりました。
) else (
set /a RETRY+=1
if %RETRY% GEQ 30 (
echo Dドライブが見つかりません。中止します。
exit /b 1
)
timeout /t 1 >nul
goto WAIT_LOOP
)
:: --- Gitユーザー情報(SYSTEMユーザー向け) ---
"C:\Program Files\Git\cmd\git.exe" config --global user.name "<NAME>"
"C:\Program Files\Git\cmd\git.exe" config --global user.email "<EMAIL>"
REM 表示確認
echo --------------------------
"C:\Program Files\Git\cmd\git.exe" config --global user.name
"C:\Program Files\Git\cmd\git.exe" config --global user.email
echo --------------------------
echo --------------------------
echo SSH接続確認完了
ssh -i %HOME%\.ssh\id_rsa -T git@github.com >> D:\01.開発\06Numbers3\log.txt 2>&1
echo --------------------------
echo --------------------------
echo safe.directory設定
:: --- Git safe.directory 設定 ---
"C:\Program Files\Git\cmd\git.exe" config --global --add safe.directory D:/01.開発/98my_dataset
echo --------------------------
echo --------------------------
echo git操作
:: --- Git 操作 ---
"C:\Program Files\Git\cmd\git.exe" add numbers_dataset.csv
"C:\Program Files\Git\cmd\git.exe" commit -m "Auto update on %NOW%"
"C:\Program Files\Git\cmd\git.exe" push origin main
echo --------------------------
echo complete
endlocal
4. 開発完了👍
試行錯誤で悩みはしましたが、自動化は1段落しました。
今後はこのリソース削減版システムで実施していきたいと思います。最近パソコンの圧迫感がすごかったので、とりあえずは一安心ですね。
また、自動更新に関しても時間になったらやってくれているみたいです。以下に毎日更新している当選番号のデータを貼りますね。
いやぁ、どこにも書いていないプログラムだったので、gitのことも知れるいい勉強になったな~(笑)。
おわりに
■ そもそもこのデータってどこで使ってんの?
このデータはMAGI伝記と題して現在運用中のNUMBERS当選番号予測システムのデータとして使用しています。
今回はその前処理の修正・改良をしました。
本編に関しては、私のQiitaを参照していただければと思います。
また、予想結果はTwitter(X)で運用していますので、参考程度に当選番号を見てください!
参考資料