pickup

★AIと作成すれば、プログラムを知らなくても、作成できる

 

最近は、AIがやたら、広告で放送されています。

AIを知らなければ、仕事がなくなる可能性があります。

難しい、わからない、できない、ではありません。

プログラムを知らなくても、機械学習システム作成できるようにしましょう。

 

 

スポンサーリンク

★機械学習をするための準備

 

前回は、SQLiteでテーブルを作成するところまで解説しました。

では、今回は、機械学習をするために、大量のデータをアップロードしなければなりません。

その際のアップロードの方法等を今回は解説しています。

機械学習をするためには、10万件位のデータが必要になります。

ここがネックでした。

データは、あるもののCSVを作成するのは結構面倒でした。

では、そんな悩みを解決します。

 

 

スポンサーリンク

このブログはこんな人にお勧め

 

今回のテーマ
  • 機械学習システムを作成したい人
  • AIを利用したいけど、やり方がわからない人
  • 競馬を、投資に変えたい人

このブログを読み終わる頃には・・・・・・

 

このブログの結論

大量のデータをアップロードするときは、エラーがつきものです。

しかし、AIが理解できるように質問すると、AIが、完璧なコードを提示してくれます。

質問の方法を覚えましょう。

 

スポンサーリンク

★ACCESSから、アップロード用のCAVを作成

先にこのようなデータを、作成します。

データ件数は、195,745件です。

ACCESSの基本機能で、CSVファイルを作成すると、65,000件までしか作成出ません。

結構面倒・・・・・・・

 

今までは、ACCESSの基本機能で作成していたのですが、ここもAIに確認しました。

 

サクッとVBAのコードを提示してくれました。

Public Sub ExportQ_KOLtoCSV_UTF8()
    Dim strSQL As String
    Dim strFilePath As String
    Dim fso As Object
    Dim ts As Object
    Dim rs As DAO.Recordset
    Dim i As Integer
    Dim line As String

    ' 出力先のファイルパス
    strFilePath = "C:\Users\tekis\Desktop\conpi_data.csv"

    ' クエリを開く
    Set rs = CurrentDb.OpenRecordset("Q_コンピ", dbOpenSnapshot)

    ' FileSystemObjectを使用してUTF-8で書き込み
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set ts = fso.CreateTextFile(strFilePath, True, True) ' 第3引数 True = UTF-8

    ' ヘッダー出力
    For i = 0 To rs.Fields.Count - 1
        line = line & rs.Fields(i).Name & IIf(i < rs.Fields.Count - 1, ",", "")
    Next
    ts.WriteLine line

    ' データ出力
    Do While Not rs.EOF
        line = ""
        For i = 0 To rs.Fields.Count - 1
            line = line & """" & Replace(Nz(rs.Fields(i).Value, ""), """", """""") & """" & IIf(i < rs.Fields.Count - 1, ",", "")
        Next
        ts.WriteLine line
        rs.MoveNext
    Loop

    ' 終了処理
    ts.Close
    rs.Close
    Set rs = Nothing
    Set ts = Nothing
    Set fso = Nothing

    MsgBox "CSVファイルの出力が完了しました:" & vbCrLf & strFilePath, vbInformation
End Sub

コードは、Q_コンピというクエリのデータを変換するコードです。

19万件のデータをpythonで転送

 

AIへの質問内容です

下記のデータをSQLiteにアップします。

C:\Users\tekis\Desktop\conpi_data.csv

UTF-8に書き換えて、C:\Users\tekis\Desktop\に別名で保存してください

そして、UTF-8で記載されているか確認してください。

そのデータがUTF-8であれば、SQLiteのG_CONPへ、転記してください。

pythonでお願います。

CSVのヘッダーは下記の通りです

レースID馬 レースID レース番号 場所 クラス 芝・ダ 距離 頭数 枠 ゼッケン コンピ指数 コンピ能力 能力 T着順 単勝 複勝
202102130501050101 2021021305010501 01 東京 未勝利 ダ 1400 1 01 55 6 0 16

G_COMPIのテーブルの構造は下記の通りです

CREATE TABLE G_CONPI (
race_id_horse TEXT PRIMARY KEY,
race_id TEXT,
race_number INTEGER,
racecourse TEXT,
race_class TEXT,
track_type TEXT,
distance INTEGER,
number_of_horses INTEGER, — NULLあり
frame_number INTEGER,
horse_number TEXT,
compi_index TEXT, — 文字列
compi_ability TEXT, — 文字列(順位)
ability INTEGER, — 推奨馬の順位
finish_position INTEGER,
win_odds REAL,
place_odds REAL,
win_popularity INTEGER
);

 

AIが提示したpythonのコードです

import pandas as pd
import sqlite3
import chardet
import os

# ファイルパス
input_file = r"C:\Users\tekis\Desktop\conpi_data.csv"
output_file = r"C:\Users\tekis\Desktop\conpi_data_utf8.csv"
db_file = r"D:\SQLlite\sqlite-tools-win-x64-3490100\keiba.db"  # SQLiteパスを指定

# 1. CSVを読み込み、UTF-8で保存
# 元ファイルのエンコーディングを自動検出
with open(input_file, 'rb') as f:
    result = chardet.detect(f.read())
    original_encoding = result['encoding']
    print(f"元のエンコーディング: {original_encoding}")

# Pandasで読み込み
df = pd.read_csv(input_file, encoding=original_encoding)

# ヘッダーを確認
expected_headers = [
    "レースID馬", "レースID", "レース番号", "場所", "クラス", "芝・ダ", "距離", "頭数", 
    "枠", "ゼッケン", "コンピ指数", "コンピ能力", "能力", "T着順", "単勝", "複勝"
]
if list(df.columns) != expected_headers:
    print("警告: ヘッダーが期待と異なる可能性があります")
    print(f"実際のヘッダー: {list(df.columns)}")

# UTF-8で保存
df.to_csv(output_file, encoding='utf-8', index=False)
print(f"UTF-8で {output_file} に保存しました")

# 2. UTF-8確認
with open(output_file, 'rb') as f:
    result = chardet.detect(f.read())
    utf8_check = result['encoding']
    print(f"保存後のエンコーディング: {utf8_check}")

if 'utf-8' in utf8_check.lower():
    print("ファイルはUTF-8で正しく保存されています")
else:
    print("警告: UTF-8ではない可能性があります")
    exit()

# 3. SQLiteに転記
# カラム名をG_CONPIテーブルに合わせる
df.columns = [
    "race_id_horse", "race_id", "race_number", "racecourse", "race_class", 
    "track_type", "distance", "number_of_horses", "frame_number", "horse_number", 
    "compi_index", "compi_ability", "ability", "finish_position", "win_odds", "place_odds"
]

# win_popularityがないのでNULLとして追加
df['win_popularity'] = None

# SQLite接続
conn = sqlite3.connect(db_file)
cursor = conn.cursor()

# テーブル作成(既存の場合は上書き)
cursor.execute("""
CREATE TABLE IF NOT EXISTS G_CONPI (
    race_id_horse TEXT PRIMARY KEY,
    race_id TEXT,
    race_number INTEGER,
    racecourse TEXT,
    race_class TEXT,
    track_type TEXT,
    distance INTEGER,
    number_of_horses INTEGER,
    frame_number INTEGER,
    horse_number TEXT,
    compi_index TEXT,
    compi_ability TEXT,
    ability INTEGER,
    finish_position INTEGER,
    win_odds REAL,
    place_odds REAL,
    win_popularity INTEGER
)
""")

# データ挿入(既存データを上書き)
df.to_sql('G_CONPI', conn, if_exists='replace', index=False)
print("データを G_CONPI テーブルに転記しました")

# データ確認(最初の5行)
cursor.execute("SELECT * FROM G_CONPI LIMIT 5")
rows = cursor.fetchall()
print("G_CONPIの最初の5行:")
for row in rows:
    print(row)

# 接続を閉じる
conn.commit()
conn.close()

 

 

 

★学習させるデータをSQLiteに転送する

 

学習させるデータとは、当日の競馬のレースデータです。

これを、CSVに変換して、pythonでアップロードするのは面倒です。

 

だから、Excelから転送します。

 

ACCESSで、転送したいデータを作成する

ADOを利用して、転送データをExcelに転記する

Excelに転記したデータを、SQLiteへ転送する。

 

ACCESSから、SQLiteへ転送もできると思いますが、私は、様々な事情から、Excelから転送しています。

Excelから、SQLiteへの転送コードです。

 

Sub アップロードCONPI()

    Dim conn As Object

    Dim rs As Object

    Dim sql As String

    Dim ws As Worksheet

    Dim lastRow As Long

    Dim i As Long

    Dim race_id_horse As String

    Dim race_id As String

    Dim race_number As Variant

    Dim racecourse As String

    Dim race_class As String

    Dim track_type As String

    Dim distance As Variant

    Dim number_of_horses As Variant

    Dim frame_number As Variant

    Dim horse_number As String

    Dim compi_index As String

    Dim compi_ability As String

    Dim ability As Variant

   

    On Error GoTo ErrorHandler

   

    Set conn = CreateObject("ADODB.Connection")

    conn.Open "DRIVER=SQLite3 ODBC Driver;Database=D:\SQLlite\sqlite-tools-win-x64-3490100\keiba.db;"

   

    Set ws = ThisWorkbook.ActiveSheet

    ' A列の最終行を検出(空白セルを考慮)

    lastRow = 6

    While ws.Cells(lastRow, "A").value <> ""

        lastRow = lastRow + 1

    Wend

    lastRow = lastRow - 1 ' 最後の非空白行

   

    Debug.Print "Last row: " & lastRow

    Debug.Print "Rows to insert: " & (lastRow - 5)

   

    ' Create S_CONPI table if not exists

    sql = "CREATE TABLE IF NOT EXISTS S_CONPI (" & _

          "race_id_horse TEXT PRIMARY KEY, race_id TEXT, race_date TEXT, race_number INTEGER, " & _

          "racecourse TEXT, race_class TEXT, track_type TEXT, distance INTEGER, " & _

          "number_of_horses INTEGER, frame_number INTEGER, horse_number TEXT, " & _

          "compi_index TEXT, compi_ability TEXT, ability INTEGER, s_hill REAL, " & _

          "s_wood REAL, compi_deviation REAL, compi_90_prob TEXT, compi_top_prob TEXT);"

    conn.Execute sql

   

    ' Begin transaction

    conn.Execute "BEGIN TRANSACTION;"

   

    For i = 6 To lastRow

        race_id_horse = Replace(ws.Cells(i, 1).value, "'", "''")

        race_id = Replace(ws.Cells(i, 2).value, "'", "''")

        race_number = IIf(IsEmpty(ws.Cells(i, 3).value), "NULL", ws.Cells(i, 3).value)

        racecourse = Replace(ws.Cells(i, 4).value, "'", "''")

        race_class = Replace(ws.Cells(i, 5).value, "'", "''")

        track_type = Replace(ws.Cells(i, 6).value, "'", "''")

        distance = IIf(IsEmpty(ws.Cells(i, 7).value), "NULL", ws.Cells(i, 7).value)

        number_of_horses = IIf(IsEmpty(ws.Cells(i, 8).value), "NULL", ws.Cells(i, 8).value)

        frame_number = IIf(IsEmpty(ws.Cells(i, 9).value), "NULL", ws.Cells(i, 9).value)

        horse_number = Replace(ws.Cells(i, 10).value, "'", "''")

        compi_index = Replace(ws.Cells(i, 11).value, "'", "''")

        compi_ability = Replace(ws.Cells(i, 12).value, "'", "''")

        ability = IIf(IsEmpty(ws.Cells(i, 13).value), "NULL", ws.Cells(i, 13).value)

       

        sql = "INSERT INTO S_CONPI (" & _

              "race_id_horse, race_id, race_number, racecourse, race_class, track_type, " & _

              "distance, number_of_horses, frame_number, horse_number, compi_index, " & _

              "compi_ability, ability, race_date, s_hill, s_wood, compi_deviation, " & _

              "compi_90_prob, compi_top_prob) VALUES (" & _

              "'" & race_id_horse & "', " & _

              "'" & race_id & "', " & _

              race_number & ", " & _

              "'" & racecourse & "', " & _

              "'" & race_class & "', " & _

              "'" & track_type & "', " & _

              distance & ", " & _

              number_of_horses & ", " & _

              frame_number & ", " & _

              "'" & horse_number & "', " & _

              "'" & compi_index & "', " & _

              "'" & compi_ability & "', " & _

              ability & ", " & _

              "'" & Left(race_id, 8) & "', " & _

              "NULL, " & _

              "NULL, " & _

              "NULL, " & _

              "NULL, " & _

              "NULL)"

       

        Debug.Print "SQL for row " & i & ": " & sql

       

        On Error Resume Next

        conn.Execute sql

        If Err.Number <> 0 Then

            Debug.Print "Error on row " & i & ": " & Err.Description

            conn.Execute "ROLLBACK;"

            MsgBox "Error on row " & i & ": " & Err.Description, vbCritical

            conn.Close

            Set conn = Nothing

            Exit Sub

        End If

        On Error GoTo ErrorHandler

    Next i

   

    ' Commit transaction

    conn.Execute "COMMIT;"

   

    ' Verify inserted rows

    Set rs = conn.Execute("SELECT COUNT(*) FROM S_CONPI;")

    Dim insertedRows As Long

    insertedRows = rs.Fields(0).value

    Debug.Print "Total rows in S_CONPI: " & insertedRows

    rs.Close

   

    MsgBox "Data uploaded to S_CONPI successfully. Total rows: " & insertedRows, vbInformation

   

    conn.Close

    Set conn = Nothing

    Exit Sub




ErrorHandler:

    MsgBox "Error on row " & i & ": " & Err.Description, vbCritical

    If Not conn Is Nothing Then

        conn.Execute "ROLLBACK;"

        conn.Close

    End If

    Set conn = Nothing

End Sub

番外編 作成した

 

コマンドプロンプトから確認するコードです

PRAGMA table_info(S_race_results );⇒カラムを確認
SELECT COUNT(*) FROM wood_training ;⇒データ数を確認

 

コード、テーブルは、Excelで管理する

雑ではありますが、AIを利用して、機械学習システムを作成すると、AIはすべて、英語で記載してきます。

すべて英語なので、実行する順番や、なんのためのテーブルなのが、わからなくなります。

なので、上記のように、まとめておくと、次回の作業がカンタンにわかるので、お勧めします。

 

 

ここがポイント

 

ここがポイント
Function8.png
入力規制は、絶対に必要です。AIは、上手に質問することで、正確なコードを提示してくれます。しかし、最後は、人間の目で確認しなければなりません。ここを怠ると、どんな立派なシステムも作動しません。
動画とブログでわかりやすくExcelとACCESSを紹介しています

 

 

まとめ

ここまでで、何も知らない私でも、約6時間くらいでした。

初めてなので、仕方ないですが、次回からは、もっと早くなるでしょう

スポンサーリンク

Twitterでフォローしよう

おすすめの記事