Wiz日誌 新しい python | 60歳を迎えて、思うこと。

60歳を迎えて、思うこと。

いつの間にか、「60」という年月が経ちました。
残り少ないか多いか?わかりませんが。
じじぃ~の「ひとりごと」を細々と続けられれば。。。

Wiz日誌 新しい python

にゃあにゃあ
わんわん

日々
飽きもせず・・・
いや 飽きてるけど

Wizの 毎日 で ある

キャラの
ステータス

表示スクリプトを
新調した

【chatGPT】様 製 難あり
Microsoft Copilot様 製 難あり
じゃあ
【Gemini】様 は どう作る???

# ==== 【Gemini】様

# 「動作がおかしい」と感じる原因、鋭いご指摘です。
# これはプログラミング(特にデータ分析で使うPandasというライブラリ)の「おせっかいな仕様」が原因で、**犯人は2つ**います。
# ### 1. なぜ「1」が「0」になったのか?(全角スペースの罠)
# 元のCSVの中身をよく見ると、数値の前に**全角スペース**(あるいは特殊な空白)が入っています。
# > ` 1, 1, 1...`
# スクリプト内の `pd.to_numeric(..., errors='coerce')` は、「数字じゃないものが混じっていたら、計算できないから空っぽ(NaN)にする」という動きをします。
# 全角スペース付きの「 1」は数字として認識されず、空っぽになり、最終的に `.fillna(0)` によって **「0」** に置き換えられてしまったのです。
# ### 2. なぜ番号に小数点がつくのか?(NaNの連鎖)
# Pandasでは、列の中に一つでも「空っぽ(NaN)」が発生すると、その列全体を「小数点があるかもしれない列(浮動小数点型)」として扱おうとします。そのため、整数の「11」が「11.0」に変換されてしまったのです。

# ### 🛠️ 修正版:全角スペースを掃除して、整数を維持する
# 空白をきれいに取り除いてから数値に変換し、勝手に小数にならないように修正したコードです。
# ```python


import pandas as pd
from tabulate import tabulate
import os

# ===== 1. 設定エリア =====
csv_path = r"F:\__Libre-ods\_Wiz\Wiz-2026-02-01-成長記録.csv"
party_order = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]

print("\n--- Wiz 成長記録 出力メニュー ---")
print("1: ターミナルに表示")
print("2: CSVファイルに出力 (.csv)")
print("3: テキストファイルに出力 (.txt)")
print("4: Excelファイルに出力 (.xlsx)")
mode = input("出力モードを選択してください (1-4): ")

# ===== 2. CSV 読み込み =====
df = pd.read_csv(csv_path, encoding="utf-8", parse_dates=["年月日_時分"])

# 【修正ポイント①】全角・半角スペースを除去してから数値化
status_cols = ["LV", "AGE", "HP", "STR", "IQ", "PIE", "VIT", "AGL", "LUC"]
for col in status_cols + ["番"]:
    if df[col].dtype == "object":  # 文字列として読み込まれている場合
        df[col] = df[col].str.strip().str.replace(' ', '') # 前後の空白と全角スペースを削除
    df[col] = pd.to_numeric(df[col], errors='coerce')

# ===== 3. 変化(成長・減少)の計算ロジック =====
results = []
for num in party_order:
    char_history = df[df["番"] == num].sort_values("年月日_時分", ascending=False)
    if len(char_history) == 0: continue
    
    latest = char_history.iloc[0].copy()
    diff_msgs = []
    if len(char_history) >= 2:
        previous = char_history.iloc[1]
        for col in status_cols:
            cur_val, pre_val = latest[col], previous[col]
            if pd.notnull(cur_val) and pd.notnull(pre_val):
                diff = int(cur_val - pre_val)
                if diff > 0:
                    diff_msgs.append(f"{col}+{diff}" if col in ["HP", "LV", "AGE"] else f"{col}+")
                elif diff < 0:
                    diff_msgs.append(f"{col}{diff}" if col in ["HP", "LV", "AGE"] else f"{col}-")
    latest["CHANGES"] = ", ".join(diff_msgs)
    results.append(latest)

view_df = pd.DataFrame(results)

# ===== 4. データの整形 =====
display_cols = ["番", "年月日_時分", "なまえ", "性", "職業", "種族"] + status_cols + ["CHANGES"]
view_df = view_df[display_cols]

# 【修正ポイント②】整数列が小数点にならないように強制変換
view_df["番"] = view_df["番"].fillna(0).astype(int)
view_df[status_cols] = view_df[status_cols].fillna(0).astype(int)

# 日付を表示用に文字列化
view_df["年月日_時分"] = view_df["年月日_時分"].dt.strftime("%Y-%m-%d %H:%M")

rename_dict = {"番": "#", "年月日_時分": "DATE_TIME", "なまえ": "NAME", "性": "S", "職業": "JOB", "種族": "RACE"}
final_df = view_df.rename(columns=rename_dict)

# ===== 5. 出力振り分け =====
output_filename = "Wiz_Member_List"

if mode == "1":
    output = tabulate(final_df, headers="keys", tablefmt="plain", showindex=False,
                      colalign=("right", "left", "left", "center", "left", "left") + ("right",) * 9 + ("left",))
    print("-" * 145)
    print(output)
    print("-" * 145)

elif mode == "2":
    # CSV出力 (float_formatを指定して小数点を防ぐ)
    final_df.to_csv(f"{output_filename}.csv", index=False, encoding="utf-8-sig")
    print(f"CSV出力完了: {output_filename}.csv")

elif mode == "3":
    output = tabulate(final_df, headers="keys", tablefmt="plain", showindex=False)
    with open(f"{output_filename}.txt", "w", encoding="utf-8") as f:
        f.write(output)
    print(f"テキスト出力完了: {output_filename}.txt")

elif mode == "4":
    final_df.to_excel(f"{output_filename}.xlsx", index=False)
    print(f"Excel出力完了: {output_filename}.xlsx")


### 何を直したか?
# 1. **`.str.replace(' ', '')`**: 倉庫キャラのデータに含まれる「全角スペース」を消去してから計算するようにしました。これで「1」が正しく「1」と認識されます。
# 2. **`astype(int)`**: 「番」の列を最後にもう一度整数に変換するようにしたので、`11.0` ではなく `11` と表示されます。
# これで、全角スペースが混じった「ありえない数値」の倉庫キャラも、名簿に正しく表示されるはずです!試してみてください。
# 次に気になる点があれば、またいつでもどうぞ!
# ==============================

  #  DATE_TIME         NAME            S    JOB      RACE      LV    AGE    HP    STR    IQ    PIE    VIT    AGL    LUC  CHANGES
  1  2026-02-09 02:05  じじぃ~        G    LORD     HUMAN     23     25   272     15    18     18     18     18     16  LV+2, HP+2, LUC+
  2  2025-03-08 22:00  じじぃ~        G    PRIEST   GNOME    105     20   155     18    14     12     18     14     15
  3  2026-02-01 07:30  じじぃ~        G    LORD     HUMAN     48     24   429     18    18     18     18     18     18  LV+1, HP+1, PIE+
  4  2026-02-09 02:05  じじぃ~        G    SAMURAI  DWARF     30     21   215     18    18     16     18     17     18  LV+2, HP+2, PIE+, V

# ==============================
なかなかに
使いやすい♪

生成AI様

得意不得意
センスによりけり

3回目の 挑戦で

じじぃ~ の
は~と を 鷲掴み♪

じじぃ~