作者:Aaron Yu

共發表了 50 篇文章。

  • FastAPI 入門教程:從零開始建立你的第一個 API

    FastAPI 入門教程:從零開始建立你的第一個 API

    目標: 學習 FastAPI 的基本概念,建立一個簡單的 API,並了解其核心特性,如自動文件。

    預計時間: 約 2 小時 (包含實際操作編寫和運行程式的時間)

    參考文件: FastAPI 官方文件 - First Steps (https://fastapi.tiangolo.com/tutorial/first-steps/)


    教學大綱:

    1. 是什麼?為什麼用? (約 10 分鐘)

      • 什麼是 FastAPI?
      • FastAPI 的優勢 (速度、易用性、標準化、自動文件)
      • 與其他 Python 框架的比較簡述
    2. 環境準備與安裝 (約 15 分鐘)

      • Python 版本要求
      • 安裝 FastAPI 和 ASGI 服務器 (Uvicorn)
      • 創建專案目錄
    3. 你的第一個 FastAPI 應用 (約 20 分鐘)

      • 編寫 main.py
      • 創建 FastAPI 實例
      • 定義第一個路徑操作 (Path Operation - GET)
      • 運行開發伺服器 (Uvicorn)
      • 測試 API
    4. 自動 API 文件 (約 15 分鐘)

      2025-05-19
    5. GitHub Copilot:AI 輔助程式開發 入門到進階教學

      GitHub Copilot:AI 輔助程式開發 入門到進階教學

      第一部分:初識 GitHub Copilot 與基礎應用

      1.1 什麼是 GitHub Copilot?

      GitHub Copilot 是一款革命性的 AI 程式設計副駕駛(AI Pair Programmer),基於大型語言模型(LLMs)開發,由 OpenAI 的 Codex 模型驅動,該模型在海量的開源程式碼資料上進行訓練。它能夠根據上下文理解您的編碼意圖,提供智能化的程式碼建議。

      2025-05-19
    6. OpenAI 推出 AI 程式設計代理工具「Codex」研究預覽版

      OpenAI 推出 AI 程式設計代理工具「Codex」研究預覽版

      2025 年 5 月 16 日,OpenAI 發布了 AI 程式設計代理工具「Codex」的研究預覽版本,旨在提升開發者的工作效率。

      Codex 概覽

      • 模型驅動:Codex 由 codex-1 模型驅動,該模型是基於 OpenAI 的 o3 推理模型,專為軟體工程任務進行微調。

      • 功能特點

        • 生成更乾淨、精確的程式碼。
        • 能夠自動執行測試,直到通過為止。
        • 支援自然語言輸入,生成多種程式語言的代碼,包括 Python、JavaScript、Go 等。
      • 運行環境:Codex 在受沙盒保護的雲端虛擬電腦中運行,與 GitHub 連接後,可預先載入儲存庫,支援自動化開發流程。

      使用方式與可用性

      • 存取方式:Codex 已向 ChatGPT Pro、Team 及 Enterprise 用戶開放,未來計劃擴展至 ChatGPT Plus 和 Edu 用戶。
      • 操作方式:用戶可在 ChatGPT 側邊欄找到 Codex,輸入提示指令並點擊「Code」按鈕,即可指派編碼任務。
      • 限制與計費:初期用戶可自由存取,未來數週內將施加速度限制,用戶可選擇購買額外點數繼續使用。

      Codex CLI 更新

      OpenAI 也更新了先前推出的開源編碼代理程式 Codex CLI,預設採用最新的 o4-mini 模型,透過 OpenAI API 提供服務,收費標準為每百萬個輸入詞元(token)1.5 美元、每百萬輸出詞元 6 美元。

      2025-05-19
    7. Make.com 核心工具介紹:Router、Aggregator 與 Iterator 的應用實例

      Make.com 核心工具介紹:Router、Aggregator 與 Iterator 的應用實例

      本篇 Make.com 的核心工具教學!我們將一步步學習如何使用 Make.com 的三大核心模組:RouterAggregatorIterator,並結合實際案例,幫助您快速掌握自動化流程設計的技巧。


      🔀 Router 模組

      📌 Router 是什麼?

      Router(路由器) 是 Make.com 的一個模組,用來將資料流程分成多條支線。每條路徑可以設定自己的篩選條件(Filter),以便針對不同的資料進行個別處理。

      2025-04-21
    8. AI 工具功能與應用對照表(2025 年 4 月)

      AI 工具功能與應用對照表(2025 年 4 月)


      ✅ AI 工具功能與應用對照表(2025 年 4 月)

      工具名稱 類別 技術特性 強項 適合用途 成本 / 可用性
      Kling 2.0 🎬 影片生成 高寫實 video diffusion 模型、支援複雜物理運動 超寫實影片生成、鏡頭邏輯佳 廣告片、科幻短片、虛擬拍攝 未公開;內測中
      Seaweed AI(ByteDance) 🎬 影片生成 輕量影片合成、照片轉動畫、人臉驅動 快速生成、娛樂導向、社群風格 TikTok、社群影片、虛擬角色 未公開;預期整合 TikTok
      Canva Visual Suite 2.0 🎬 影片 + 設計工具 AI 圖片/影片生成、排版轉換、Magic Switch 無需專業背景即可製作內容 簡報、社群圖文、行銷素材 免費版 / Pro $14.99/月
      Codex (新版) 👨‍💻 寫程式助理 類 Devin agent,可讀 issue、自動修復與部署 自動開發流程、任務導向 開發者自動化、DevOps 尚未開放;預計屬於 API 付費服務
      GPT-4.1 / o4-mini 👨‍💻+🧠 多模態 / 編程 / 助理 新一代 GPT-4 系列、速度更快、支援工具使用 編程、多模態推理、語意理解 Chatbot、Code Interpreter、日常自動化 ChatGPT Plus $20/月;API 分級計價
      Claude Autonomous Research 👨‍💻+🧠 AI 助理 / 長任務研究 多日任務記憶、自主研究規劃、自動摘要 AI 助理 + 研究型用途 市場調查、法律摘要、研究助手 預計進入 Claude Pro / API 收費
      Microsoft Copilot Vision 🧠 AI 助理 / 圖像理解 多模態 Copilot,支援螢幕截圖理解 Office 整合佳、圖像分析力強 報表分析、圖像摘要、PDF 理解 M365 Copilot $30/月
      Grok Studio + Memories 🧠 個人 AI 助理 自創角色、自訂記憶、自我進化風格 個人化強、對話自然、可塑性高 聊天伴侶、任務提醒、定制 AI X Premium+ $16/月
      Gemini 2.5 Flash 🧠 即時助理 超高速小模型、低延遲 適合行動裝置與即時應用 Chatbot、智慧眼鏡、翻譯 預計 API 開放,成本低於 Gemini 1.5 Pro

      📌 各類型推薦小結:

      🎬 影片創作者首選

      • 高寫實風格:Kling 2.0(類 Sora)
      • 社群風格快速製作:Seaweed AI、Canva

      👨‍💻 程式開發與自動化

      • 進階 DevOps AI 工程師:Codex (新一代)
      • 一般程式輔助與數據處理:GPT-4.1(或 Code Interpreter)
      • 跨日研究分析任務:Claude Autonomous Research

      🧠 智慧型 AI 助理

      • 生活/個人任務 AI:Grok + Memories
      • 文件與圖表理解高手:Copilot Vision
      • 行動設備即時推理:Gemini 2.5 Flash

      🎬 1. Kling 2.0(Kuaishou 快手)AI 影片生成

      • 技術背景
        • 中國快手(Kuaishou)研發,類似 OpenAI 的 Sora。
        • 使用類似 diffusion 模型與 video transformer 架構,支援長時序生成。
      • 特性亮點
        • 可生成高達 1080p、2 分鐘長影片。
        • 支援物理運動邏輯(如影子、重力)、連續鏡頭切換。
        • 角色動作自然,包含跳舞、奔跑等複雜人體動作。
      • 用途:影片製作、自媒體創作、社群內容、品牌宣傳片。
      • 潛在應用
        • 替代初階動畫或概念影片拍攝流程。
      • 現狀與成本
        • 目前為內部測試階段,未開放公測。
        • 商業授權與 API 使用尚未公布,未來可能透過 B2B 模式營利。

      🎨 2. Canva Visual Suite 2.0

      • 技術背景
        • 整合自家 Magic AI 系列工具,擴充至設計、影片、簡報、文件等內容生成。
      • 功能
        • Magic Media:圖像/影片生成。
        • Magic Switch:一鍵格式轉換,如簡報轉 IG 影片。
        • Magic Write:內建 AI 文字生成助手。
      • 優點
        • 針對非設計師族群極為友好,整合 AI 設計建議、自動配色、社群排版。
      • 使用情境
        • 社群小編、電商主圖設計、簡報製作、教育教案排版。
      • 成本
        • 免費版已提供部分 AI 工具。
        • Pro 版:$14.99/月(提供更多素材與商用授權)。

      👁 3. Microsoft Copilot Vision

      • 技術核心:整合 GPT-4 with Vision 模型(類似 GPT-4 Turbo 多模態),支援圖像輸入。
      • 用途功能
        • 可識別截圖內容、PDF 表格、圖片中的流程圖。
        • 例如:你貼上報表圖像,Copilot 可直接解讀並給分析摘要。
      • 應用場景
        • 商務報表分析、教學材料理解、視覺文件摘要。
      • 特色優勢
        • 深度整合 Office(Word、Excel、PowerPoint)與 Windows 12 系統。
      • 成本
        • 屬於 Microsoft 365 E3/E5 方案(Copilot 要價 US$30/月/人)。

      🤖 4. Grok Studio & Memories(X AI)

      • Grok Studio 特性
        • 用戶可自行創建 AI 助手角色(類似 ChatGPT 中的 GPTs)。
        • 支援設定角色個性、資料來源、回答風格。
      • Memories 模組
        • 類似 ChatGPT 記憶功能:Grok 會記住你過去對話的偏好、資訊。
      • 應用潛力
        • 長期陪伴型聊天、個人任務提醒、持續性的學習或訓練。
      • 商業模型
        • 整合在 X Premium+(美金 $16/月)中,針對創作者與專業用戶開放。

      💬 5. ChatGPT 4.1、o3 / o4-mini

      • GPT-4.1 特性(未正式發布):
        • 更快推理、更便宜 token 成本、工具使用更自然(例如 DALL·E、瀏覽器、自動 Code Interpreter)
      • o3/o4-mini
        • 為「小型 GPT-4 模型」,加速版與行動端部署版本。
      • 應用領域
        • 更適合手機或 IoT 裝置內建 AI,推理速度快。
      • 成本概況
        • 預期仍屬 ChatGPT Plus 訂閱(US$20/月),API 成本更低,未來有望用於嵌入式設備。

      👨‍💻 6. OpenAI Codex(新一代 Coding Agent)

      • 背景說明
        • 並非原 Codex 模型,而是類似 Devin 的全自動開發 AI。
        • 可操作瀏覽器、執行測試、自動部署。
      • 能力
        • 分析 GitHub issue → 撰寫修正程式 → 提交 PR → 驗證。
      • 技術挑戰
        • 需要安全的 sandbox 執行環境、模擬 IDE 操作。
      • 應用前景
        • 可作為中大型開發團隊的 DevOps 助理、bug 修正、文件整理。
      • 可用性與價格:尚未對外,極可能整合於 OpenAI API / Pro 工作空間內。

      🐚 7. ByteDance Seaweed AI Video

      • 技術面
        • 聚焦輕量型影片生成,偏向娛樂性、虛擬形象生成。
        • 特別擅長照片→動態短影片,類似表情合成或 AI 偶像化。
      • 優勢
        • 生成速度快,適用於 TikTok 創作。
        • 支援聲音合成、AI 角色演出。
      • 預計應用
        • TikTok 創作者工具、虛擬主播、短劇剪輯。
      • 價格:暫未公布,可能逐步開放 API 或僅內部使用。

      🧠 8. Claude Autonomous Research

      • 功能
        • 讓 Claude 自主執行研究任務(如:閱讀 PDF、大量網頁、整合多日筆記)。
        • 任務持續數天,具備記憶與進度追蹤。
      • 應用場景
        • 法律分析、學術整理、競品調查。
        • 可成為 AI 研究助理,執行跨日任務。
      • 優點
        • 使用 Constitutional AI 保守而穩定。
      • 現狀與成本
        • 正測試中,將來可能整合至 Claude Pro($20/月)或企業 API。

      ⚡ 9. Google Gemini 2.5 Flash

      • 核心設計
        • 為低延遲任務優化的 Gemini 模型,適合 real-time chatbot、即時翻譯等。
        • 較小參數量、優化語音與圖片輸入理解。
      • 用途
        • 行動助理、Wear OS AI 應用、自駕儀表 AI。
      • 優點
        • 執行速度極快,token 價格預計更低。
      • 目前狀況
        • 預計很快會上架於 Gemini API,部分已在 Pixel 使用測試。

      2025-04-19
    9. 本機自動化工具 macOS vs Windows 11:跨平台任務整合與 API 實戰

      本機自動化工具對照表 macOS vs Windows 11

      macOS 工具

      工具名稱 是否內建 可錄製操作 可編輯邏輯 支援 Web 操作 可呼叫 API
      Automator ✅ 是 ⚠️ 部分支援 ⚠️ 基本流程 ⚠️ 可搭配 Script
      AppleScript ✅ 是 ✅(可錄製 GUI 操作) ⚠️ 透過 curl 可整合
      Hammerspoon ❌(需安裝) ❌(純程式控制) ✅ 可寫全邏輯 ⚠️ 間接支援(需搭配 script) ✅ 完整支援 API 請求

      Windows 工具

      工具名稱 是否內建 可錄製操作 可編輯邏輯 支援 Web 操作 可呼叫 API
      Power Automate Desktop ✅ 是(Pro/Enterprise) ✅ 支援完整錄製 ✅ 條件邏輯強 ✅ 支援 Web Automation ✅ 內建 HTTP 請求模組
      AutoHotKey (AHK) ❌ 需安裝 ❌ 無錄製器(可手寫操作模擬) ⚠️ 需搭配瀏覽器自動化套件 ⚠️ 手動整合 API

      📌 任務說明解析:

      每日任務:

      2025-04-19
    10. AI + 自動化工具設計核心需求與模型比較

      AI + 自動化工具設計核心需求與模型比較

      🚀 AI + 自動化工具設計核心需求

      • 理解指令/輸入
      • 規劃與推理
      • 執行與生成
      • 處理多模態資料
      • 維持上下文
      • 結構化輸出 (JSON 等)
      • 成本效益與速度

      📊 Gemini 2.5 Pro vs GPT-4o vs Claude 3 Sonnet 全面比較

      特點 Gemini 2.5 Pro (Google) ChatGPT API (GPT-4o - OpenAI) Claude 3 Sonnet (Anthropic) 分析與自動化意義
      核心模型能力 最新 Gemini 模型,增強推理、編碼與多模態理解能力 GPT-4 智能水準 + GPT-3.5 的速度,全面升級 高可靠性、長文本理解佳,在穩定性與準確性上持續領先 三者皆強大:GPT-4o 全能、Gemini 2.5 多模態最廣、Sonnet 在穩定與長文本方面表現突出。
      上下文長度 (tokens) 標準支援 1M tokens,企業版本支援至 2M 128k tokens,速度快。 200k tokens,效能與長度兼顧。 Gemini » Sonnet > GPT-4o。自動化任務中若處理大量單次資料輸入,Gemini 最具優勢。
      多模態能力 原生支援圖像、音訊、影片;文字理解外也擅長視覺/影片分析。 支援文字、圖像、音訊;可輸出語音與生成圖像 支援圖像與文字輸入;暫無音訊/影片處理能力。 若任務包含影片分析 → Gemini。需語音輸出/圖像生成 → GPT-4o。圖像理解任務三者皆可勝任。
      速度與效能 整體提速,效能大幅優化,但處理超長輸入時仍可能略慢 極快的反應速度,等同 GPT-3.5,維持 GPT-4 的智慧。 表現穩定,效能強但略慢於 GPT-4o GPT-4o > Sonnet > Gemini(超長上下文場景除外)。對互動性強的自動化任務建議優先使用 GPT-4o。
      成本結構與價格 約 $3.5/M input、$10.5/M output(標準);多模態另計。 $5/M input、$15/M output;多模態另計。 $3/M input、$15/M output;圖像處理計價另算。 Sonnet 輸入成本最低、GPT-4o 綜合 CP 值最高。Gemini 若使用長上下文可節省 API 調用次數,總成本可能更低。
      API 與整合 Vertex AI、Google AI Studio,JSON Mode、Function Calling 支援穩定。 OpenAI API + Azure 支援,開發資源最豐富,Function Calling 非常成熟。 支援 AWS、GCP 等多雲部署,Tool Use 逐步成熟中。 OpenAI 生態最成熟。Google 整合 Vertex AI 最深。Anthropic 提供跨平台彈性更強。
      Function Calling 支援,逐步向 Agent 能力擴展 非常成熟穩定,廣泛應用於工具調用與代理任務 Tool Use 概念推行中,API 逐步成熟。 自動化工具高度依賴 Function Calling 時,目前 OpenAI 優勢最大,但其他兩者正在追趕中。
      JSON Mode / 結構化輸出 支援 JSON Mode。 支援 JSON Mode,最穩定。 支援 JSON Mode。 對 AI 工具輸出格式要求高者,三者皆可勝任。
      安全性與可靠性 有安全審查與過濾。 改進中,具備較高穩定性與透明度。 Constitutional AI 機制強調模型可靠性與減害能力 對企業自動化/客戶導向應用,Sonnet 的安全與可預測性設計最為理想。
      社群與開發資源 成長中,依附 Google Cloud 生態系。 龐大的開發者社群與豐富資源支援 快速擴張中,企業用戶導向,支援 AWS/GCP 等主流平台。 OpenAI 生態完勝,適合快速起步與學習。其他兩者則在雲平台整合與企業導向工具上有優勢。

      ✅ 優缺點總覽

      Gemini 2.5 Pro

      • 優點:
        • 1M–2M Token 超長上下文支援
        • 影片/音訊/圖像 多模態最完整
        • 與 GCP 整合佳,適合使用 Vertex AI 平台者
      • 缺點:
        • 生態尚在擴張,工具與社群略遜於 OpenAI
        • 延遲可能高於 GPT-4o

      GPT-4o (OpenAI)

      • 優點:
        • 極快速度 + GPT-4 級智慧
        • 音訊輸出、圖像生成支援最佳
        • 生態豐富,Function Calling 最成熟
      • 缺點:
        • 上下文限制 (128k tokens)
        • 不支援影片處理

      Claude 3 Sonnet

      • 優點:
        • 200k 上下文,穩定表現
        • 可靠性與安全性極高
        • 跨雲平台部署選擇多,輸入價格便宜
      • 缺點:
        • 無音訊/影片能力,圖像也僅支援理解
        • 工具調用還在演進中,非最成熟實作

      🎯 實務選擇建議

      需求類型 推薦模型
      超大文件 (1M+ Tokens) 處理 Gemini 2.5 Pro
      安全與可靠性優先的流程(如內部法務) Claude 3 Sonnet
      快速交互式應用 (chatbot、workflow UI) GPT-4o
      圖像生成與語音輸出 GPT-4o
      音訊/影片輸入分析 Gemini 2.5 Pro
      成本敏感且以長文本輸入為主 Claude 3 Sonnet
      雲平台限制或偏好 GCP / AWS Gemini / Sonnet
      高度工具整合/Function 調用需求 GPT-4o(現階段最佳)

      🔍 最佳實踐建議

      1. 針對具體自動化任務進行小規模測試,評估效果與成本。
      2. 考慮混合模型架構
        • Gemini:長文本/影片預處理
        • Claude Sonnet:摘要、安全輸出
        • GPT-4o:快速互動、工具調用、語音輸出

      根據以下三種角色需求,從開發者、設計美術、教學人員的視角,分析 Gemini 2.5 Pro / GPT-4o / Claude 3 Sonnet 的差異與優劣:

      2025-04-18
    11. AI 繪圖工具速覽:主流生成式圖片平台優缺點一覽表

      AI 繪圖工具速覽 (哪個適合你?)

      工具名稱 (Tool) 最大優點 (Biggest Pro) 操作難度 (How Easy?) 費用 (Cost) 圖片感覺 (Image Vibe) 最適合誰? (Best For Whom?)
      ChatGPT (付費版) 超方便,用聊天就能做圖,很懂你的要求 ⭐⭐⭐⭐⭐ (非常容易) 付費 (需訂閱 Plus) 品質好、可加文字、風格多元 ChatGPT 付費會員、想輕鬆出圖、需圖文並茂的人
      Midjourney 藝術感和細節最強,風格獨特電影感 ⭐⭐ (需要學指令) 付費 (不同等級方案) 頂級藝術感、細節驚人、風格強烈 追求最高品質、藝術家、設計師 (願付費學習)
      Stable Diffusion (自己裝) 彈性最大、完全免費 (模型)、可高度客製化 ⭐ (非常複雜) 免費 (但電腦要夠力) 完全自訂,從照片到動漫,品質上限高 (看技術) 技術高手、開發者、想完全控制、預算有限 (肯花時間)
      Stable Diffusion (線上平台) 比自己裝簡單,功能多樣 ⭐⭐⭐ (中等) 有免費額度 & 付費方案 品質好、風格多樣 (依平台提供模型) 想用 SD 強大功能又不想搞技術、需要特定模型的人
      Adobe Firefly 商業安全 (版權風險低),與 Adobe 軟體整合 ⭐⭐⭐⭐ (容易) 有免費額度 & Adobe 付費方案 品質穩定、商業風格、安全合規 設計師、企業、Adobe 用戶、超級重視版權的人
      Leonardo.Ai 功能豐富的 SD 平台,可自訓模型 ⭐⭐⭐ (中等) 有每日免費額度 & 付費方案 品質好、模型選擇多、可訓練特殊風格 遊戲開發、藝術家、想在網頁上玩 SD 進階功能的人
      Microsoft Copilot 免費使用 DALL-E 3,品質好又易用 ⭐⭐⭐⭐⭐ (非常容易) 免費 (每日有限制) 品質好 (同 ChatGPT Plus)、理解力強 免費體驗高品質 AI 繪圖的一般大眾、微軟用戶
      Canva (Magic Media) 無縫整合 Canva,設計流程中快速加圖 ⭐⭐⭐⭐⭐ (非常容易) 免費版次數少 & Canva Pro 中上 (夠用),方便快速產出設計素材 Canva 用戶、做簡報/社群貼文、需要快速方便配圖的人

      簡單來說:

      2025-04-18
    12. Apify vs. Firecrawl vs. Crawl AI:AI 網頁爬蟲服務與框架詳細比較

      Apify vs. Firecrawl vs. Crawl AI - 詳細比較表

      🎯 核心目標與定位

      服務 定位
      Apify (apify.com) 通用、可擴展的雲端平台,用於網頁抓取、資料提取、網頁自動化。提供基礎設施和開發工具。
      Firecrawl (firecrawl.dev) 專注於為 AI/LLM 應用(特別是 RAG)提供乾淨、結構化的網頁內容。作為一個易於使用的 API 服務。
      Crawl AI (crawlai.org) 開源 Python 框架/專案,目標是利用 AI/機器學習技術來優化和指導網路爬蟲的行為(例如,更智慧地決定抓取哪些連結)。

      💻 主要可操作能力

      Apify

      • 複雜抓取:處理 JavaScript 渲染(Puppeteer/Playwright)、登入驗證、表單提交、無限滾動、點擊交互
      • 資料提取:從 HTML 提取結構化數據(JSON, CSV, Excel)、提取純文字、下載檔案/圖片
      • 自動化:執行任何瀏覽器內可完成的任務(填表、截圖、監控變化)
      • 代理:提供大型、可輪換的代理池(數據中心/住宅)
      • 排程與觸發:定時運行、Webhook 觸發
      • 自訂邏輯:可使用 Node.js 或 Python 開發自訂爬蟲(Actors)

      Firecrawl

      • 單一 URL 抓取:傳入 URL,獲取頁面內容
      • 網站爬取:給定起始 URL,爬取網站內的多個頁面
      • 內容轉換:自動將 HTML 轉換為乾淨的 Markdown 或提取結構化數據(基於模式或 LLM)
      • JS 渲染處理:可處理需要 JavaScript 渲染的頁面以獲取完整內容
      • 代理與反封鎖:內建處理,用戶無需關心

      Crawl AI

      • 基礎抓取:依賴底層函式庫(如 Scrapy, Requests, Playwright)實現基本的 HTTP 請求和瀏覽器操作
      • 智慧決策(核心理念):利用模型(需自行訓練或配置)判斷連結的相關性、頁面內容的重要性,優化爬取路徑,避免無用頁面
      • 高度自訂:由於是開源框架,理論上可以整合任何 Python 可實現的操作,但需要自行編碼

      ⚠️ 主要限制與不適用場景

      Apify

      • 成本:對於大規模或高頻率任務,成本可能較高
      • 學習曲線:對於非開發者或複雜自訂任務,有一定學習門檻
      • 非最佳 RAG 資料源:雖然可以提取文字,但不如 Firecrawl 針對性地優化輸出格式
      • 廠商鎖定風險:過度依賴 Apify 平台特性(如其特定 Actor 實現)可能增加遷移成本

      Firecrawl

      • 功能單一:主要聚焦於獲取頁面內容並轉換格式,不適合複雜的交互式自動化(如模擬購物、複雜登入流程)
      • 抓取邏輯客製化有限:無法像 Apify 或自訂程式碼那樣精細控制抓取邏輯(例如,只抓取特定模式的 URL、執行特定點擊序列)
      • 非通用型爬蟲:不適用於需要下載大量檔案、進行複雜數據轉換或需要與多個外部系統深度互動的任務

      Crawl AI

      • 需要大量開發工作:沒有現成的 UI、託管、排程、代理管理等功能,一切都需要自行搭建和維護
      • AI 模型效果依賴:“智慧"程度高度依賴所使用的 AI 模型及其訓練數據,效果可能不穩定或需要大量調優
      • 成熟度和穩定性:作為開源專案,可能不如商業產品成熟穩定,遇到問題可能需要自行解決
      • 基礎設施成本:雖然軟體免費,但運行大規模爬蟲所需的伺服器、代理、儲存等成本需自行承擔

      🔄 處理複雜網站能力

      服務 能力等級 說明
      Apify ⭐⭐⭐⭐⭐ (強) 內建瀏覽器環境(Chromium),可執行 JS、處理 AJAX、應對大多數反爬機制(需配合良好代理策略)。可編寫程式碼處理登入、CAPTCHA(需整合第三方服務)。
      Firecrawl ⭐⭐⭐⭐ (中等偏強) 可處理 JS 渲染網站。反封鎖能力內建,但對於極端複雜的登入流程或特定 CAPTCHA 可能無能為力(因為用戶無法直接干預過程)。
      Crawl AI ⭐⭐⭐ (取決於實現) 需要自行整合 Playwright/Selenium 等工具來處理 JS 渲染。登入、CAPTCHA 等都需要自行編寫處理邏輯。

      📊 資料提取能力

      服務 能力等級 說明
      Apify ⭐⭐⭐⭐⭐ (非常靈活) 可提取任何網頁元素,輸出多種格式(JSON, CSV, Excel, HTML, RSS 等)。可自訂提取邏輯。
      Firecrawl ⭐⭐⭐⭐ (聚焦) 主要輸出乾淨的 Markdown(移除廣告、導航等雜訊)或基於提供的 Schema 提取結構化數據。格式為 AI/LLM 優化。
      Crawl AI ⭐⭐⭐⭐⭐ (高度自訂) 可使用 Python 的各種解析庫(BeautifulSoup, lxml 等)提取任何數據,格式完全由開發者定義。

      🤖 AI/LLM 整合性

      Apify

      1. 作為數據源:可提供大量原始或結構化數據給 AI 模型
      2. 平台內應用:部分 Actor 使用 AI 進行特定任務(如分類、摘要、OCR)
      3. 間接整合:可透過 API/Webhook 將數據發送到 AI 平台

      Firecrawl

      1. 核心目標專門為 AI/LLM(特別是 RAG)提供優化的輸入數據
      2. 直接整合:提供易於整合的 API,可直接在 LangChain、LlamaIndex 等框架中使用
      3. 未來可能:可能會加入更多利用 LLM 的提取能力

      Crawl AI

      1. 核心方法將 AI/ML 應用於爬蟲過程本身,使其更智慧
      2. 作為數據源:爬取到的數據自然可以輸入給 AI 模型
      3. 整合方式:需要自行編碼將輸出數據傳遞給 AI 應用

      🔌 整合生態系與 API/SDK

      Apify - ⭐⭐⭐⭐⭐ (最完整)

      • 📌 API:功能豐富的 REST API
      • 📌 SDK:官方 Node.js 和 Python SDK
      • 📌 Webhook:強大的 Webhook 功能
      • 📌 預建整合:大量 Actor 市集、與 Zapier, Make (Integromat), Keboola, Airbyte 等平台整合
      • 📌 數據目的地:Apify 數據集、Key-Value Store,可導出到 S3, Google Drive, Webhook 等

      Firecrawl - ⭐⭐⭐⭐ (良好,API 導向)

      • 📌 API:簡潔明瞭的 REST API
      • 📌 SDK:提供官方 SDK(例如 Python, JavaScript)
      • 📌 Webhook:提供 Webhook 功能用於爬取完成通知
      • 📌 直接整合:強調與 LangChain 等 AI 框架的直接整合
      • 📌 數據目的地:主要透過 API 返回數據

      Crawl AI - ⭐⭐ (最弱,需自行構建)

      • 📌 API/SDK:沒有官方託管 API 或標準化 SDK(因為是框架)。需要自己封裝 API(如果需要)
      • 📌 Webhook:需要自行實現
      • 📌 整合:需要使用 Python 的標準函式庫(如 requests, boto3)與其他服務整合
      • 📌 數據目的地:完全由開發者決定如何儲存和傳輸數據

      🚀 開發與部署

      服務 開發模式 說明
      Apify 雲端託管 無需管理伺服器。可在 Apify Cloud 運行。提供線上 IDE 和本地開發工具。需要編寫 JS/Python 或配置 Actor。
      Firecrawl API 服務 無需開發或部署爬蟲本身,只需調用 API。
      Crawl AI 本地/私有部署 需要自行管理伺服器、依賴安裝、環境配置、部署流程。需要 Python 開發能力。

      🔒 代理與反封鎖

      服務 特性 說明
      Apify 內建且可選 提供強大的內建代理服務(付費),也可接入第三方代理。提供多種反封鎖技術。
      Firecrawl 內建且透明 代理和基本的反封鎖機制內建於服務中,用戶無需配置。
      Crawl AI 需自行解決 需要自行購買和管理代理伺服器,並自行實現反封鎖策略(如 User-Agent 輪換、延遲、指紋模擬等)。

      💼 使用者介面 (UI)

      服務 UI 說明
      Apify 提供 Web UI 用於管理 Actors、排程、查看結果、監控運行。
      Firecrawl 有 (可能較簡單) 可能提供儀表板用於管理 API 金鑰、查看用量和請求歷史。主要交互通過 API。
      Crawl AI 無 (預設) 作為開源框架,預設沒有圖形化使用者介面。

      💰 成本考量

      服務 成本模式 說明
      Apify 資源使用量計費 基於資源使用量(計算單位、代理流量、儲存)的點數付費。有免費方案。總體成本可能較高。
      Firecrawl API 請求計費 基於 API 請求次數或點數的付費。有免費方案。對於目標明確的任務可能成本效益更高。
      Crawl AI 基礎設施成本 軟體免費,但需要支付基礎設施(伺服器、帶寬、代理)和開發維護的人力成本。

      🔍 選擇建議

      服務 適合對象
      Apify 適合需要功能全面、高度自訂、可擴展的通用爬蟲、數據提取和自動化任務,且願意投入學習成本或預算的團隊/個人。
      Firecrawl 適合需要快速、簡單地為 AI/RAG 應用準備大量網頁文本內容,不想處理複雜爬蟲細節和基礎設施的開發者。
      Crawl AI 適合技術能力強、希望完全控制爬蟲邏輯、探索 AI 驅動爬蟲技術、且願意自行承擔開發和基礎設施成本的開發者或研究團隊。

      2025-04-17
    13. Claude 3.7 Sonnet vs ChatGPT 4.1:程式開發與小說創作能力對比分析

      Claude 3.7 Sonnet vs ChatGPT 4.1:程式開發與小說創作能力對比分析

      在人工智慧快速演進的時代,頂尖語言模型之間的較量不僅是技術指標的競爭,更關乎實際應用場景中的表現差異。本文將深入分析 Anthropic 的 Claude 3.7 Sonnet 與 OpenAI 的 ChatGPT 4.1(對應 GPT-4o)在程式開發與長篇小說創作兩大領域的表現。

      模型概述

      Claude 3.7 Sonnet 是 Anthropic 最新推出的高階語言模型,承襲了 Claude 系列在推理能力、上下文處理與文字生成方面的優勢,同時大幅提升了運算速度。

      ChatGPT 4.1(以 GPT-4o 為基礎)則代表了 OpenAI 目前最強大的多模態模型,以快速反應時間和全面的能力組合著稱。

      I. 程式開發能力對比

      程式碼生成

      • Claude 3.7 Sonnet: 在多項程式基準測試(如 HumanEval 和 MBPP+)上表現卓越。能精準理解複雜需求,生成更優化、符合慣例的程式碼。
      • ChatGPT 4.1: 作為程式碼生成領域公認的佼佼者,能處理多種語言和框架,並理解複雜指令。
      • 比較: Claude 3.7 Sonnet 在複雜邏輯和演算法實現方面展現出微弱優勢,但差距並不顯著。在實際應用中,兩者都能滿足大多數開發需求。

      除錯能力

      • Claude 3.7 Sonnet: 憑藉強大的推理能力,更精準地定位複雜錯誤,提供深入解釋及修復建議。
      • ChatGPT 4.1: 善於理解錯誤訊息,定位並修正常見問題。
      • 比較: Claude 在處理細微和複雜邏輯錯誤方面略勝一籌,特別適合需要深度分析的除錯工作。

      程式碼解釋

      • 兩者均表現優秀:Claude 傾向提供更細緻、具洞察力的解釋,ChatGPT 則以清晰直接著稱。選擇取決於用戶偏好詳盡分析還是簡潔說明。

      演算法與邏輯處理

      • Claude 3.7 Sonnet: 在需要複雜邏輯推理、演算法設計的任務上表現突出,能提出更創新或優化的解決方案。
      • ChatGPT 4.1: 處理複雜演算法問題的能力強,但有時需要更明確的引導。
      • 比較: Claude 在複雜推理和從零設計系統方面展現明顯優勢,對解決棘手演算法問題特別有利。

      多語言與框架支援

      • Claude 3.7 Sonnet: 支援主流程式語言和框架。
      • ChatGPT 4.1: 得益於更長的發展時間和龐大訓練數據,在冷門語言或特定框架上可能略有優勢。
      • 比較: 實際差異不大,主流開發場景下兩者都能滿足需求。

      處理程式碼複雜度

      • Claude 3.7 Sonnet: 在處理多文件、複雜依賴關係的專案時,展現出更佳的理解力和上下文掌握能力,特別是結合 Artifacts 功能時。
      • ChatGPT 4.1: 能處理複雜專案,但在極長或極複雜的依賴鏈中可能需要分解任務。
      • 比較: Claude 在處理複雜互動和依賴方面略有優勢,這得益於其在複雜指令遵循和長上下文理解上的技術進步。

      速度與互動性

      • Claude 3.7 Sonnet: 響應速度快,結合 Artifacts 功能可實現即時預覽和互動式開發。
      • ChatGPT 4.1: 以極快的響應速度著稱,是其核心賣點之一。
      • 比較: ChatGPT 4.1 在原始響應速度上可能略快,但 Claude 結合 Artifacts 提供的互動式開發體驗是獨特優勢。

      II. 長篇小說創作能力對比

      情節生成與大綱

      • 兩者均表現優秀:Claude 可能在生成具文學性或意想不到的情節轉折方面略有優勢,而 ChatGPT 在遵循用戶設定的類型化結構方面可能更直接。

      角色發展

      • Claude 3.7 Sonnet: 擅長創造具深度、內在一致性、情感豐富的角色,能把握角色動機和成長弧線。
      • ChatGPT 4.1: 能創造符合設定的角色,但在極長篇幅中維持角色細微情感和行為一致性可能需要更多引導。
      • 比較: Claude 在角色深度和一致性上表現更佳,更容易維持角色在長篇故事中的統一性。

      散文品質與風格

      • Claude 3.7 Sonnet: 以細膩、富文學性的文筆著稱,能模仿多種寫作風格,生成自然流暢的文字,減少人工智慧痕跡。
      • ChatGPT 4.1: 文筆流暢,能適應多種風格,但有時略顯通用,需要更多調整才能達到特定文學效果。
      • 比較: Claude 在散文品質和風格多樣性上評價更高,對追求特定文學風格的創作者更具吸引力。

      一致性維持

      • Claude 3.7 Sonnet: 得益於較大的上下文窗口和更強的連貫性保持能力,在長篇寫作中維持情節、角色設定和語氣一致性方面表現較好。
      • ChatGPT 4.1: 雖有大上下文窗口(128k tokens),但在極長篇幅寫作中,可能出現前後矛盾或遺忘細節的情況。
      • 比較: Claude 在長篇一致性維持上有明顯優勢,尤其是在需要精確回憶先前細節的情況下。

      世界觀建構

      • 兩者均表現優秀:Claude 的細膩描寫能力在呈現世界觀氛圍和細節上更有感染力。

      對話生成

      • 兩者均表現優秀:Claude 在微妙的對話互動和潛台詞表達上可能略勝一籌。

      長上下文處理

      • Claude 3.7 Sonnet: 以長上下文處理能力著稱,在長文本中精確回憶和利用信息的能力強。
      • ChatGPT 4.1: 擁有128k Token的上下文窗口,理論上能處理很長的文本。
      • 比較: Claude 在針對性測試(如"大海撈針"測試)中表現更為出色,能更精確地利用長篇文本中的特定信息。

      III. 關鍵差異化因素

      1. 核心優勢領域:

        2025-04-17
      2. Cursor AI 編輯器完全指南:從安裝到進階應用全攻略

        Cursor AI 編輯器完全指南

        章節目錄

        1. Cursor 基礎概念
        2. 安裝與環境設定
        3. Cursor 核心功能
        4. AI 溝通與互動技巧
        5. 上下文管理與文檔整合
        6. Context 7 與外部工具整合
        7. 任務管理系統
        8. 實際專案開發流程
        9. 進階應用與最佳實踐
        10. 寫作與非程式開發應用
        11. Cursor 免費使用與付費方案
        12. Cursor 與其他工具比較

        1. Cursor 基礎概念

        1.1 什麼是 Cursor

        Cursor 是一款基於 Visual Studio Code (VS Code) 的 AI 程式碼編輯器,透過深度整合 AI 功能來增強開發體驗。它不僅是一個程式碼編輯器,更是一個開發助手,能夠理解程式碼、回答問題並協助撰寫和修改程式碼。
        Cursor 的核心價值在於:

        2025-04-17
      3. Firebase Studio 全面解析:Google 的 AI 開發新工具評測

        Firebase Studio 全面解析:Google 的 AI 開發新工具評測

        作為一名長期關注科技發展的評論者,我最近深入研究了 Google 的最新開發工具 Firebase Studio。這款工具被定位為 AI 驅動的全端開發環境,承諾讓開發流程更加簡單高效。本文將為您提供一個全面且客觀的評測,幫助您了解這款工具的實際表現。

        Firebase Studio 是什麼?

        Firebase Studio 是 Google 最新推出的雲端代理開發環境,它整合了 Firebase 生態系統和 Gemini AI 模型,旨在提供一站式的全端開發體驗。從定位上看,它類似於 Cursor 的免費替代品,但同時也融合了 V0.dev 或 Vercel 的部分特性,形成一種獨特的混合產品。

        核心特點:

        1. 完全雲端化 - 基於瀏覽器的開發環境,無需安裝軟體
        2. 免費使用 - 提供三個免費工作區
        3. AI 輔助開發 - 整合 Gemini AI 模型
        4. 與 Firebase 生態整合 - 便於使用 Google 雲服務
        5. 多平台支援 - 包括網頁前端、後端及移動端開發

        用戶體驗與界面

        Firebase Studio 提供了直觀的開發界面,包括:

        2025-04-17
      4. Hugo vs WordPress:AI 時代的全面比較

        Hugo vs WordPress:AI 時代的全面比較

        第一部分:基本概念與核心差異

        Hugo 與 WordPress 代表了兩種完全不同的網站建設方法。理解它們的根本差異是做出明智選擇的第一步。

        基本架構對比

        graph TD
            subgraph "Hugo 架構"
                H1[內容: Markdown 文件] --> H2[Hugo 引擎]
                H2 --> H3[靜態 HTML 文件]
                H3 --> H4[訪問者]
            end
            
            subgraph "WordPress 架構"
                W1[後台管理介面] --> W2[PHP 程式]
                W2 <--> W3[(資料庫)]
                W2 --> W4[訪問者]
            end
        

        Hugo 是一個靜態網站生成器,它預先將所有內容處理為靜態 HTML 文件。這意味著訪問者請求頁面時,伺服器只需提供已準備好的文件,無需即時處理或資料庫查詢。

        2025-03-27
      5. XPath 爬蟲語法大全:完整對照表與實戰技巧

        XPath 爬蟲實戰語法對照表

        基本選擇器

        用途 XPath 語法 說明 範例
        選擇所有元素 //tag 選擇頁面上所有指定標籤的元素 //div 選擇所有 div 元素
        根據 ID 選擇 //*[@id='ID值'] 選擇具有特定 ID 的元素 //*[@id='header'] 選擇 ID 為 header 的元素
        根據 Class 選擇 //*[contains(@class, 'CLASS值')] 選擇具有特定 Class 的元素 //*[contains(@class, 'btn')] 選擇 class 包含 btn 的元素
        選擇精確 Class //*[@class='CLASS值'] 選擇 class 屬性完全匹配的元素 //*[@class='btn-primary'] 選擇 class 等於 btn-primary 的元素
        選擇屬性 //*[@屬性='值'] 選擇具有特定屬性值的元素 //*[@href='https://example.com'] 選擇連結到 example.com 的元素

        層級關係選擇器

        用途 XPath 語法 說明 範例
        子元素 //父元素/子元素 選擇直接子元素 //div/p 選擇所有 div 的直接子 p 元素
        所有後代 //父元素//後代元素 選擇所有後代元素,不限層級 //div//span 選擇所有 div 內的 span 元素,不論層級
        父元素 //元素/.. 選擇元素的父元素 //h1/.. 選擇所有 h1 元素的父元素
        祖先元素 //元素/ancestor::標籤 選擇元素的祖先元素 //li/ancestor::div 選擇 li 元素的 div 祖先
        上一個兄弟元素 //元素/preceding-sibling::標籤[1] 選擇緊鄰的前一個兄弟元素 //li[3]/preceding-sibling::li[1] 選擇第三個 li 前的一個 li
        下一個兄弟元素 //元素/following-sibling::標籤[1] 選擇緊鄰的後一個兄弟元素 //div/following-sibling::p[1] 選擇 div 後的第一個 p 元素
        所有兄弟元素 //元素/following-sibling::標籤 選擇所有後續兄弟元素 //h2/following-sibling::p 選擇 h2 後的所有 p 元素

        文本與內容篩選

        用途 XPath 語法 說明 範例
        包含特定文本 //*[contains(text(), '文本')] 選擇包含指定文本的元素 //*[contains(text(), '登入')] 選擇包含「登入」文本的元素
        精確文本匹配 //*[text()='文本'] 選擇文本完全匹配的元素 //*[text()='確認'] 選擇文本為「確認」的元素
        屬性包含文本 //*[contains(@屬性, '文本')] 選擇屬性值包含特定文本的元素 //*[contains(@href, 'product')] 選擇 href 包含 product 的元素
        元素內容為空 //*[not(node())] 選擇沒有子節點的空元素 //div[not(node())] 選擇所有空的 div 元素

        位置與索引篩選

        用途 XPath 語法 說明 範例
        第一個元素 (//元素)[1] 選擇符合條件的第一個元素 (//tr)[1] 選擇頁面上第一個 tr 元素
        最後一個元素 (//元素)[last()] 選擇符合條件的最後一個元素 (//li)[last()] 選擇最後一個 li 元素
        指定位置 (//元素)[位置] 選擇特定位置的元素 (//td)[5] 選擇第五個 td 元素
        位置範圍 (//元素)[position() > N and position() < M] 選擇位置在指定範圍內的元素 (//tr)[position() > 1 and position() < 5] 選擇第 2 到第 4 個 tr
        奇數位置元素 //元素[position() mod 2 = 1] 選擇位置為奇數的元素 //tr[position() mod 2 = 1] 選擇奇數行
        偶數位置元素 //元素[position() mod 2 = 0] 選擇位置為偶數的元素 //tr[position() mod 2 = 0] 選擇偶數行

        複合條件選擇

        用途 XPath 語法 說明 範例
        AND 條件 //元素[@屬性1='值1' and @屬性2='值2'] 同時符合多個條件 //input[@type='text' and @required] 選擇必填的文本輸入框
        OR 條件 //元素[@屬性1='值1' or @屬性2='值2'] 符合任一條件 //button[contains(@class, 'submit') or contains(@class, 'save')] 選擇提交或保存按鈕
        NOT 條件 //元素[not(@屬性='值')] 不符合特定條件 //div[not(contains(@class, 'hidden'))] 選擇不包含 hidden 類的 div
        多重條件 //元素[條件1][條件2] 依序篩選多個條件 //div[contains(@class, 'product')][.//span[contains(@class, 'price')]] 選擇包含價格的產品 div

        常用爬蟲實例

        用途 XPath 語法 說明
        爬取表格數據 //table[@id='data']//tr 選擇特定表格的所有行
        爬取產品列表 //div[contains(@class, 'product-item')] 選擇所有產品項目
        爬取分頁連結 //div[contains(@class, 'pagination')]//a 選擇分頁區域的所有連結
        爬取導航菜單 //nav//li/a 選擇導航菜單中的所有連結
        爬取特定區塊 //div[@id='content']//p 選擇內容區域中的所有段落
        爬取圖片連結 //div[contains(@class, 'gallery')]//img/@src 選擇圖庫中所有圖片的 src 屬性
        爬取下拉選單選項 //select[@id='options']/option 選擇特定下拉選單的所有選項

        特殊功能選擇器

        用途 XPath 語法 說明 範例
        獲取屬性值 //元素/@屬性 直接獲取元素的特定屬性值 //img/@src 獲取所有圖片的 src 屬性值
        元素計數 count(//元素) 計算符合條件的元素數量 count(//a[contains(@href, 'product')]) 計算產品連結數量
        連接多個結果 //元素1 | //元素2 合併多個 XPath 查詢結果 //h1 | //h2 選擇所有 h1 和 h2 元素
        選擇可見元素 //*[not(contains(@style, 'display:none'))] 選擇頁面上可見的元素 //div[not(contains(@style, 'display:none'))] 選擇可見的 div
        獲取節點文本 normalize-space(//元素) 獲取元素的文本並去除多餘空白 normalize-space(//h1) 獲取 h1 標題的文本

        動態頁面爬取技巧

        用途 技巧 說明
        等待元素加載 使用 WebDriverWait 設置顯式等待,直到特定 XPath 選擇器能夠找到元素
        處理 iframe 先切換到 iframe 再定位 driver.switch_to.frame(driver.find_element_by_xpath("//iframe[@id='content']"))
        處理 AJAX 加載 使用顯式等待 等待特定元素可見或可點擊,再進行後續操作
        處理動態 ID 使用 contains 或 starts-with 對於動態生成的 ID,使用部分匹配而非精確匹配
        處理浮動元素 使用相對位置定位 透過周圍的穩定元素來定位浮動元素

        2025-03-24
      6. 正則表達式實戰指南:從基礎到爬蟲應用

        目錄

        1. 基礎語法
        2. 常用正則表達式範例
        3. 網頁爬蟲實戰案例
        4. 在 make.com 平台的應用
        5. 實戰技巧與注意事項

        基礎語法

        正則表達式是一種強大的文本模式匹配工具,以下是基本語法元素的對照表:

        字元 說明 實例 匹配結果
        . 匹配任意單個字元(除換行符外) a.c abc, adc, a$c…
        \d 匹配任意數字 \d{3} 123, 456…
        \w 匹配字母、數字或下劃線 \w+ abc, a123, test_123…
        \s 匹配空白字元(空格、製表符、換行符) a\sb “a b”, “a\tb”…
        ^ 匹配字串開頭 ^Hello “Hello world”
        $ 匹配字串結尾 world$ “Hello world”
        * 匹配前面的模式零次或多次 a*b b, ab, aab…
        + 匹配前面的模式一次或多次 a+b ab, aab…
        ? 匹配前面的模式零次或一次 colou?r color, colour
        {n} 匹配前面的模式恰好n次 a{3} aaa
        {n,} 匹配前面的模式至少n次 a{2,} aa, aaa, aaaa…
        {n,m} 匹配前面的模式n到m次 a{2,4} aa, aaa, aaaa
        ` ` 邏輯或 `cat
        [] 字元集合,匹配括號內任意字元 [abc] a, b, c
        [^] 字元集合,匹配非括號內的任意字元 [^abc] d, e, f…
        () 捕獲組,可以提取匹配的內容 (abc) 提取 “abc”
        (?:) 非捕獲組,不提取匹配的內容 (?:abc) 不提取 “abc”

        匹配模式修飾符

        修飾符 說明
        g 全局匹配 (找出所有匹配項而非僅第一個)
        i 忽略大小寫
        m 多行匹配
        s 使 . 可以匹配換行符

        HTML 提取常用技巧

        1. 最小匹配: .*? 而不是 .* (貪婪匹配)
        2. 屬性匹配: [^>]* 可以匹配標籤內任意屬性
        3. 捕獲組: () 用於提取需要的內容

        常用正則表達式範例

        以下是 20 個實用的正則表達式範例:

        2025-03-24
      7. Notion 完整教案:從入門到精通

        Notion 完整教案:從入門到精通

        第一章:Notion 基本架構與概念

        1.1 Notio 簡介

        Notion 是一款多功能的工作空間工具,將筆記、資料庫、任務管理、文件協作等功能整合在一起。它可以用來管理個人事務、團隊專案、知識庫等多種用途。Notion 的特點是高度自定義和靈活性,使用者可以根據自己的需求打造專屬的工作環境。

        1.2 Notion 的核心架構

        1.2.1 工作區(Workspace)

        • 定義:最頂層的組織結構,相當於一個公司或個人的所有內容集合
        • 功能:可以設置不同的權限級別和成員管理
        • 特點:一個帳號可以擁有多個工作區
        • 註冊流程:用一個 Email 註冊,即可創建 Notion 帳號和工作區

        1.2.2 頁面(Page)

        • 定義:所有內容的基本容器
        • 功能:可以包含文字、圖片、表格和其他頁面
        • 特點:可以無限嵌套,形成樹狀層級結構
        • 應用:筆記、文檔、專案管理、知識庫

        1.2.3 區塊(Block)

        • 定義:頁面中的內容元素,Notion 的最小組成單位
        • 特點:可以自由拖曳、排序和嵌套
        • 操作:可以在頁面中自由拖放調整位置
        • 核心理念:所有內容都是區塊,可以靈活組合

        1.2.4 資料庫(Database)

        • 定義:用於存儲結構化資料的特殊頁面類型
        • 特點:可以有多種視圖方式呈現相同的資料
        • 應用:適合管理任務清單、專案追蹤、客戶資料等
        • 形式:可以是表格、看板、日曆、列表、畫廊等
          圖1.1:Notion核心架構.svg 圖1.1:Notion核心架構

        1.3 Notion 的三大核心精神

        1.3.1 簡化(Simplicity)

        • 極簡的使用者介面
        • 區塊化的內容設計
        • 將多種工具整合為一體

        1.3.2 破格(Innovation)

        • 打破傳統的文件結構限制
        • 提供多種視圖來查看同一資料
        • 模糊了不同生產力工具之間的界限

        1.3.3 靈活(Flexibility)

        • 無限嵌套的內容組織
        • 可完全自定義的工作流程
        • 跨平台無縫適應
        mindmap
          root((Notion核心精神))
            簡化(Simplicity)
              極簡的使用者介面
              區塊化的內容設計
              多種工具整合為一體
            破格(Innovation)
              打破傳統文件結構限制
              多視圖呈現同一資料
              模糊不同工具之間的界限
            靈活(Flexibility)
              無限嵌套的內容組織
              完全自定義的工作流程
              跨平台無縫適應
        

        圖1.2:Notion三大核心精神

        2025-03-23
      8. AI Prompt 提詞技巧大全:從入門到精通

        AI Prompt 提詞技巧大全:從入門到精通

        下載本文 PDF

        目錄

        1. 前言:AI提詞的藝術與科學
        2. 生活中常用提詞範例
        3. 提詞方法分析
        4. 大型語言模型特性比較
        5. 有效提詞的結構與技巧
        6. CRAFT提詞架構深入解析
        7. 綜合應用示例
        8. 提詞技巧進階應用
        9. AI模型能力開發方法
        10. AI提詞方法由淺入深
        11. 提詞方法對比與選擇指南
        12. 提詞最佳實踐摘要
        13. 生活應用50例
        14. 總結:掌握AI提詞的未來

        1. 前言:AI提詞的藝術與科學

        人工智能時代,我們不只是AI的使用者,更是與AI共同創造的夥伴。提詞(Prompting)是我們與AI溝通的橋樑,是解鎖AI潛力的鑰匙。掌握提詞技巧,就像學習一門新的語言,能夠讓我們更有效地利用AI工具,提升工作效率,釋放創意潛能。
        本書將系統性地介紹AI提詞的各種技巧,從基礎的零樣本提詞到進階的思維鏈提詞和元提詞,從實用的CRAFT框架到精準的角色設定。無論你是AI新手還是資深用戶,都能在本書中找到提升AI使用體驗的關鍵方法。
        在數位轉型的浪潮中,提詞技巧不僅是個人技能,更是組織競爭力的重要組成部分。讓我們一起探索AI提詞的奧秘,解鎖無限可能。

        2025-03-21
      9. Python 資料視覺化入門:Matplotlib 與 Plotly 實戰教學

        Python 資料視覺化入門 - Matplotlib & Plotly

        目錄

        1. 資料視覺化的重要性
        2. 簡介 Matplotlib 和 Plotly
        3. Matplotlib 基礎
        4. Plotly 基礎

        1. 資料視覺化的重要性

        為什麼我們需要資料視覺化?

        2025-03-20
      10. Chart.js 互動式圖表入門教程

        Chart.js 互動式圖表入門教程

        第一部分:課程介紹與環境準備

        課程簡介與 Chart.js 概覽

        什麼是 Chart.js? Chart.js 是一個簡單而靈活的 JavaScript 圖表庫,基於 HTML5 Canvas 元素,使網頁開發者能夠輕鬆在網頁中創建各種互動式圖表。

        為什麼選擇 Chart.js?

        2025-03-18
      11. amCharts 互動式圖表與儀表板設計完全指南

        amCharts 視覺化指南

        1. amCharts 簡介

        amCharts 是一套功能強大的 JavaScript 圖表庫,專為建立互動式、美觀的數據視覺化而設計。它提供了廣泛的圖表類型,從基本的柱狀圖和折線圖到複雜的地圖和儀表板。

        主要特點

        • 豐富的圖表類型:提供超過 40 種不同的圖表類型
        • 高度可定制:幾乎所有元素都可以自訂
        • 互動性:內建豐富的互動功能,如縮放、拖動和懸停效果
        • 響應式設計:自動適應不同尺寸的螢幕
        • 跨瀏覽器兼容:支援所有主流瀏覽器
        • 簡單的 API:易於理解和使用的 API

        amCharts 資料科學視覺化指南

        2025-03-17
      12. Markdown 入門指南:資料科學應用與視覺化

        Markdown 基礎介紹

        什麼是 Markdown?

        Markdown 是一種輕量級標記語言,由 John Gruber 於 2004 年創建。它使用純文本格式,但可以轉換為結構化的 HTML 文件,非常適合撰寫文檔、筆記和網頁內容。

        為什麼資料科學家需要學習 Markdown?

        • 輕鬆撰寫具有結構的文檔
        • 創建可重現的研究報告
        • 在 Jupyter Notebook 和 R Markdown 中整合代碼與文本
        • 撰寫清晰的分析說明
        • 在 GitHub 等平台上展示專案

        Markdown 的優勢

        • 語法簡單,易於學習
        • 純文本格式,跨平台兼容
        • 可轉換為多種格式(HTML、PDF、DOCX 等)
        • 與資料科學工具無縫集成
        • 專注於內容而非排版

        基本語法

        標題

        # 一級標題
        ## 二級標題
        ### 三級標題
        #### 四級標題
        ##### 五級標題
        ###### 六級標題
        

        文本格式

        *斜體文本* 或 _斜體文本_
        **粗體文本** 或 __粗體文本__
        ***粗斜體文本*** 或 ___粗斜體文本___
        ~~刪除線文本~~
        

        列表

        無序列表:

        2025-03-17
      13. Matplotlib 視覺化指南:結合 JSON 資料的完整實戰教程

        好的,以下是您提供的 Matplotlib 視覺化指南內容,以 Markdown 格式重新輸出:

        Matplotlib 視覺化指南

        1. 通用的 Matplotlib 技巧

        Matplotlib 是 Python 中最常用的 2D 繪圖工具,幾個核心概念包括:

        • Figure(圖像):整個視覺化畫布
        • Axes(座標軸):Figure 內的單個子圖
        • Axis(軸):x 軸和 y 軸
        • Artist(繪圖元素):圖形、標籤、圖例等

        基礎設定

        import matplotlib.pyplot as plt
        import numpy as np
        import json
        
        # JSON 資料範例:
        # 從 JSON 字串載入資料
        json_data = '''
        {
          "x_values": [0, 1, 2, 3, 4, 5],
          "y_values": [0, 1, 4, 9, 16, 25]
        }
        '''
        data = json.loads(json_data)
        
        # 基本繪圖流程
        plt.figure()
        plt.plot(data["x_values"], data["y_values"])
        plt.xlabel("X 軸")
        plt.ylabel("Y 軸")
        plt.title("從 JSON 資料繪製的基本圖表")
        plt.show()
        

        2. 買一送一的介面

        Matplotlib 提供兩種繪圖 API:

        2025-03-17
      14. Mermaid 圖表入門與生成指南

        Mermaid 圖表入門與生成指南

        Mermaid 是一個輕量級的圖表生成工具,讓你可以使用簡單的文本語法來創建各式各樣的視覺化圖表。本指南將從基礎概念開始,逐步深入到進階應用,包括如何使用 Python 和 ChatGPT 來輔助生成 Mermaid 圖表。

        1. Mermaid 基礎介紹

        什麼是 Mermaid?

        Mermaid 是一個 JavaScript 函式庫,允許使用者通過簡單的文本描述來生成圖表,類似於 PlantUML。這種「以程式碼繪製圖表」的方式非常適合在多種文本環境(如 Markdown 文件)中嵌入視覺化內容。

        2025-03-17
      15. Plotly 互動式圖表指南

        Plotly 圖表教學指南

        Plotly 是一個功能強大的 Python 資料視覺化函式庫,支援互動式與動態圖表,尤其適合用於網頁應用和資料分析。相較於 Matplotlib,Plotly 提供更豐富的互動性和美觀的預設樣式,能夠輕鬆製作出專業級的資料視覺化圖表。
        本教學將從基礎到進階,示範如何使用 Plotly 繪製各種類型的圖表,並特別聚焦於如何從 JSON 資料中建立視覺化。

        目錄

        1. 基礎設定
        2. 從 JSON 資料入手
        3. 基本圖表類型
        4. 進階圖表
        5. 組合與交互式圖表
        6. 自訂樣式與佈局
        7. 匯出與分享

        基礎設定

        首先,我們需要安裝並匯入必要的套件:

        2025-03-17
      16. 資料視覺化全攻略:從基礎概念到實際專案應用

        課程綱要

        課程簡介

        資料視覺化是將複雜資料轉換成視覺圖形的過程,能夠幫助我們更有效地理解數據、發現趨勢與模式,並優化溝通效果。本課程將從基礎知識開始,逐步深入各種視覺化工具與技術,幫助學生掌握將資料轉化為有效視覺呈現的能力。

        學習目標

        • 掌握靜態與互動式資料視覺化的核心概念與原則
        • 熟練運用多種視覺化工具與技術處理不同類型的資料
        • 培養設計直觀且具吸引力視覺化的能力
        • 結合程式設計與視覺化工具提升資料分析與溝通能力
        • 實現從資料收集到視覺化呈現的完整工作流程

        第一部分:視覺化基礎

        單元2:Matplotlib 基礎

        2.1 Matplotlib 入門

        • 環境設置與基本架構
        • Figure與Axes概念
        • 基本圖表建立:折線圖、柱狀圖、散點圖

        2.2 圖表樣式與格式設定

        • 標題、軸標籤與圖例
        • 顏色與樣式調整
        • 網格與刻度設定

        2.3 基礎實作

        • 建立簡單線條圖與長條圖
        • 實現多圖層疊加
        • 解決常見問題與最佳實踐

        單元3:Markdown & Mermaid 輕量級視覺化

        3.1 Markdown基礎

        • 基本語法與格式
        • 在資料分析中的應用

        3.2 Mermaid圖表入門

        • 流程圖、時序圖基本語法
        • 狀態圖與甘特圖設計

        3.3 實作練習

        • 使用Mermaid建立基本流程圖
        • 結合Markdown與Mermaid製作分析報告

        第二部分:進階視覺化技術

        單元4:Matplotlib 進階技巧

        4.1 複雜圖表設計

        • 子圖與多面板圖表
        • 數據分布視覺化:直方圖、箱型圖、小提琴圖
        • 3D圖表與等高線圖

        4.2 自訂與風格化

        • 風格表與主題設定
        • 自訂藝術風格
        • 圖片輸出與儲存格式

        4.3 進階實作

        • 地圖資料視覺化
        • 時間序列資料處理與視覺化
        • 科學圖表與發布品質製作

        單元5:Plotly 互動式視覺化

        5.1 Plotly基礎

        • 基本架構與運作原理
        • 互動式圖表的優勢
        • 基本圖表類型建立

        5.2 互動功能實作

        • 懸停資訊與工具提示
        • 縮放與平移功能
        • 選擇與過濾資料

        5.3 資料整合技術

        • JSON格式處理與視覺化
        • API整合與資料獲取
        • 動態資料視覺化

        單元6:amCharts 多功能圖表設計

        6.1 amCharts簡介

        • 功能與架構概述
        • 與其他工具的比較
        • 開發環境設置

        6.2 圖表類型與技術

        • 基本圖表:圓餅圖、柱狀圖、折線圖
        • 複合與進階圖表設計
        • 動畫效果與轉場

        6.3 客製化與進階應用

        • 主題與外觀設計
        • 反應式設計實現
        • 即時資料更新實作

        第三部分:整合應用與實戰

        單元7:資料與視覺化整合設計

        7.1 資料處理與視覺化準備

        • 資料清理與轉換
        • 資料與視覺化分離設計原則
        • 大型資料集的高效處理

        7.2 互動式儀表板設計

        • 儀表板設計原則
        • 多圖表協同設計
        • 使用者體驗優化

        7.3 視覺化自動化生成

        • 使用Python自動化生成圖表
        • 結合ChatGPT生成Mermaid圖表
        • 批量圖表產生方法

        單元8:綜合實戰專案

        8.1 商業儀表板專案

        • 需求分析與設計規劃
        • 使用Plotly/amCharts建立互動式儀表板
        • 案例研究與最佳實踐

        8.2 金融資料視覺化專案

        • 金融資料特性與挑戰
        • 結合Matplotlib與amCharts視覺化股票資料
        • 技術分析指標的視覺化

        8.3 地理資訊視覺化專案

        • GIS資料處理基礎
        • 互動式地圖建立(以台灣露營區地圖為例)
        • 位置資料的特殊視覺化技巧

        單元9:專案管理與工作流程視覺化

        9.1 專案規劃視覺化

        • 甘特圖設計與實作
        • 項目依賴關係圖
        • 進度追蹤視覺化

        9.2 系統與流程視覺化

        • 系統架構圖設計
        • 流程自動化視覺化
        • 決策樹與邏輯圖表

        9.3 綜合實例:專案全程視覺化

        • 從需求到成果的視覺化記錄
        • 問題分析與解決方案視覺化
        • 成果呈現與溝通技巧

        附錄:實用資源與工具

        • 視覺化工具推薦與比較
        • 開源資料集與範例
        • 進階學習資源
        • 專業視覺化社群與知識分享平台

        實例詳解:台灣露營區地圖專案

        背景與目標

        • 建立全台露營資源互動式地圖
        • 整合不同類型露營場地資訊
        • 提供使用者友善的查詢與導航功能

        資料收集與處理

        • 露營區與野營地點資料收集方法
        • 資料清理與標準化
        • 位置資訊與屬性資料整合

        視覺化實作

        • 使用Google Maps API建立基礎地圖
        • 資料分類與圖層設計
        • 互動功能實現:過濾、搜尋、資訊顯示

        成果與延伸

        • 使用指南與功能說明
        • 雲端分享與協作方式
        • 未來可能的功能擴展與優化

        實例詳解:其它實例

        國家災害防救科技中心 - 3D災害潛勢地圖

        2025-03-17
      17. 學習 NumPy:數據處理與分析基礎

        課程目標

        • 建立 NumPy 的基本知識。
        • 學習使用 NumPy 進行高效的陣列操作。
        • 掌握 NumPy 的進階功能,如廣播、索引、數學運算、統計分析和結構化陣列。
        • 能夠運用 NumPy 解決實際資料科學問題。
        • 實作 COVID-19 數據分析與視覺化

        課程大綱

        1. NumPy 簡介
          • 什麼是 NumPy?
          • NumPy 的優勢:高效的陣列運算
          • 安裝 NumPy
          • 導入 NumPy 模組
          • 查看 NumPy 版本
        2. NumPy 陣列基礎
          • NumPy 陣列 (ndarray) 的概念
          • 從 Python List 建立 NumPy 陣列
          • 建立不同維度的 NumPy 陣列
            • 一維陣列
            • 二維陣列
            • 三維陣列
          • NumPy 陣列的屬性
            • 形狀 (shape)
            • 維度 (ndim)
            • 資料型態 (dtype)
            • 大小 (size)
            • 記憶體大小 (nbytes)
          • NumPy 陣列的資料型態
          • 創建特殊陣列
            • np.zeros() 零陣列
            • np.ones() 單位陣列
            • np.arange() 等差陣列
            • np.linspace() 線性等分陣列
        3. NumPy 陣列的索引與切片
          • 存取單一元素
          • 多維陣列的索引
          • 切片操作
          • 布林索引
          • Fancy Indexing
        4. NumPy 陣列的運算
          • 基本算術運算 (+, -, *, /)
          • Universal Functions (ufuncs)
            • 平方 (square)
            • 平方根 (sqrt)
            • 指數 (exp)
            • 對數 (log)
            • 三角函數 (sin, cos, tan)
          • 聚合運算
            • 總和 (sum)
            • 平均值 (mean)
            • 中位數 (median)
            • 標準差 (std)
            • 最大值 (max)
            • 最小值 (min)
        5. NumPy 的廣播 (Broadcasting)
          • 廣播的概念與用途
          • 廣播的規則
          • 廣播的實際應用
        6. NumPy 的進階應用
          • 陣列的重塑 (reshape)
          • 陣列的合併與分割
            • 水平合併 (hstack)
            • 垂直合併 (vstack)
            • 分割 (split)
          • 條件篩選與布林邏輯
            • 使用布林運算篩選陣列元素
            • np.where() 函數
          • 排序
            • np.sort() 函數
            • np.argsort() 函數
        7. NumPy 的結構化陣列
          • 結構化陣列的概念
          • 定義結構化陣列的資料型態
          • 建立結構化陣列
          • 存取結構化陣列的欄位
          • 使用結構化陣列進行資料分析
        8. NumPy 實例演練
          • 計算移動平均
          • 數據標準化
          • 線性回歸分析
          • 圖像處理
          • COVID-19 數據分析與可視化

        課程內容詳解

        1. NumPy 簡介

        NumPy(Numerical Python 的簡稱)是 Python 中用於科學計算的核心函式庫。它提供了一個高性能的多維陣列對象 ndarray,以及用於處理這些陣列的工具。

        2025-03-09
      18. 學習 Pandas:基本操作與資料清理

        學習 Pandas:基本操作與資料清理

        課程目標

        本課程旨在幫助學員從零開始,掌握 Pandas 的基本操作與資料清理技巧,能夠運用 Pandas 進行資料分析與處理。

        課程大綱

        1. Pandas 簡介與環境設置

        • 什麼是 Pandas?
        • Pandas 的優勢與應用場景
        • 安裝 Pandas
        • 匯入 Pandas 函式庫
        import pandas as pd
        import numpy as np  # 通常也會一起匯入 NumPy
        

        2. Pandas 資料結構:Series

        • Series 的概念:一維標籤化陣列
        • 建立 Series:
          • 從 Python 列表建立
        # 創建一個簡單的Series
        data = [1, 2, 3, 4, 5]
        series = pd.Series(data, name='Example Series')
        print(series)
        

        3. Pandas 資料結構:DataFrame

        • DataFrame 的概念:二維表格型資料結構
        • 建立 DataFrame:
          • 從字典建立
        • DataFrame 的基本屬性:
          • shape:DataFrame 的形狀(列數、欄數)
          • columns:欄位名稱
          • index:列索引
        • DataFrame 的索引與選擇:
          • 選擇欄位
          • 選擇列
          • 使用 loc 和 iloc 進行選擇
          • 條件篩選
        • DataFrame 的基本操作:
          • 新增欄位
          • 刪除欄位
          • 修改欄位
        # 創建一個簡單的DataFrame
        data = {'Name': ['Alice', 'Bob', 'Charlie'],
                'Age': [25, 30, 35],
                'Score': [88, 92, 85]}
        df = pd.DataFrame(data)
        print(df)
        
        # 選擇欄位
        print(df['Name'])
        
        # 選擇列
        print(df.iloc[0]) #選擇第一列
        
        # 條件篩選
        filtered_df = df[df['Age'] > 30]
        print(filtered_df)
        

        4. 資料載入與儲存

        • 讀取 CSV 檔案: pd.read_csv()
        • 儲存 DataFrame 為 CSV 檔案: df.to_csv()
        # 讀取 CSV 檔案
        # df = pd.read_csv('data.csv') # 假設有名為 data.csv 的檔案
        # print(df)
        
        # 儲存 DataFrame 為 CSV 檔案
        # df.to_csv('output.csv', index=False) # 不儲存索引
        

        5. 資料清理

        • 處理缺失值:
          • 判斷缺失值: isna()isnull()
          • 填補缺失值: fillna()
          • 刪除缺失值: dropna()
        • 處理重複值:
          • 判斷重複值: duplicated()
          • 刪除重複值: drop_duplicates()
        • 資料類型轉換: astype()
        # 創建一個包含NaN的DataFrame
        df_nan = pd.DataFrame({'A': [1, 2, np.nan], 'B': [4, np.nan, 6]})
        print(df_nan.isna()) # 判斷哪裡是NaN
        print(df_nan.fillna(0)) # 將NaN替換為0
        
        # 剔除缺失值
        df_dropped = df_nan.dropna()
        print(df_dropped)
        
        # 判斷重複值
        df = pd.DataFrame({'A': [1, 2, 2, 3], 'B': [4, 5, 5, 6]})
        print(df.duplicated()) # 判斷重複值
        
        # 刪除重複值
        df_dropped = df.drop_duplicates() # 刪除重複值
        print(df_dropped)
        

        6. 資料操作與變換

        • 行的操作
        • 列的操作
        • 資料的聚合與群組運算
        • 資料合併: concatmerge
        # 範例資料集
        data = {'類別': ['A', 'A', 'B', 'B', 'C', 'C'],
                '數量': [10, 15, 10, 10, 20, 25]}
        
        df = pd.DataFrame(data)
        
        # 依據 '類別' 分組並計算每組的總和
        grouped_df = df.groupby('類別').sum()
        print(grouped_df)
        
        # 新增一個欄位
        df['數量_兩倍'] = df['數量'] * 2
        print(df)
        
        # 改變欄位名稱
        df.rename(columns={'數量': '產品數量'}, inplace=True)
        print(df)
        
        # 合併兩個DataFrame
        df1 = pd.DataFrame({'Key': ['A', 'B', 'C'], 'Value': [1, 2, 3]})
        df2 = pd.DataFrame({'Key': ['A', 'B', 'D'], 'Value': [4, 5, 6]})
        df_merged = pd.merge(df1, df2, on='Key', how='inner')
        print("\nMerge 合併後的 DataFrame:\n", df_merged)
        

        7. 資料統計與分析

        • 計算各列的平均值
        • 計算每列的總和
        • 值的排序
        • 描述性統計
        • 相關性分析
        • 計算次數
        # 範例資料集
        data = {'A': [1, 2, 3, 4, 5], 'B': [6, 7, 8, 9, 10]}
        df = pd.DataFrame(data)
        
        # 計算各列的平均值
        mean_values = df.mean()
        print(mean_values)
        
        # 計算每列的總和
        sum_values = df.sum()
        print(sum_values)
        
        # 根據列A排序
        sorted_df = df.sort_values(by='A', ascending=False)
        print(sorted_df)
        
        # 描述性統計
        print(df.describe())
        
        # 相關性分析
        print(df.corr())
        

        8. 數據正規化

        • 最小-最大正規化(Min-Max Scaling)
        # 範例資料集
        data = {'Salary': [50000, 60000, 70000], 'Score': [3.5, 4.2, 5.0]}
        df = pd.DataFrame(data)
        
        # 最小-最大正規化(Min-Max Scaling)
        df['Salary'] = (df['Salary'] - df['Salary'].min()) / (df['Salary'].max() - df['Salary'].min())
        df['Score'] = (df['Score'] - df['Score'].min()) / (df['Score'].max() - df['Score'].min())
        
        print(df)
        

        9. 時間序列資料處理 (基礎)

        • 時間序列的建立: pd.date_range()
        • 時間序列的索引與選擇
        • 時間序列的重採樣: resample()
        • 移動平均: rolling()
        # 時間序列的建立
        dates = pd.date_range('2025-01-01', periods=6, freq='D')
        df = pd.DataFrame({'Date': dates, 'Sales': [200, 220, 250, 270, 300, 350]})
        df.set_index('Date', inplace=True)
        print(df)
        
        # 移動平均
        df['Moving Average'] = df['Sales'].rolling(window=3).mean()
        print(df)
        

        10. 資料視覺化 (基礎)

        • 使用 Pandas 內建的繪圖功能
        • 繪製線圖、散佈圖、長條圖、直方圖等
        import matplotlib.pyplot as plt
        
        # 繪製線圖
        df = pd.DataFrame({'A': [1, 2, 3, 4, 5], 'B': [6, 7, 2, 9, 10]})
        df.plot(x='A', y='B', kind='line')
        plt.show()
        
        # 繪製直方圖
        df['A'].plot(kind='hist')
        plt.show()
        

        11. 向量化字串操作

        # 範例
        string_series = pd.Series(['apple', 'banana', 'cherry'])
        upper_case = string_series.str.upper()
        print("\n將字串轉為大寫:\n", upper_case)
        

        12. 高效率 Pandas: eval()query()

        # 範例
        df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
        df['C'] = pd.eval('df["A"] + df["B"]')
        print(df)
        
        df_filtered = df.query('A > 1')
        print(df_filtered)
        

        13. 處理遺漏值與異常值 (進階)

        • 使用中位數、平均值、眾數填補遺漏值
        • 移除或更正異常值
        # 範例
        df = pd.DataFrame({
            'A': [1, 2, np.nan, 4, 5],
            'B': [5, np.nan, np.nan, 8, 9]
        })
        
        # 使用 fillna 填補遺漏值
        df.fillna(value={'A': 0, 'B': 0}, inplace=True)
        print(df)
        
        # 移除或更正異常值
        df = pd.DataFrame({
            'A': [10, 20, 30, 1000, 50],
            'B': [5, 5, 5, 5000, 5]
        })
        df[df > 100] = np.nan
        print(df)
        

        14. 數據正規化 (進階)

        • 使用 scikit-learn 的 MinMaxScaler
        from sklearn.preprocessing import MinMaxScaler
        
        # 範例
        data = {'Salary': [50000, 60000, 70000], 'Score': [3.5, 4.2, 5.0]}
        df = pd.DataFrame(data)
        
        scaler = MinMaxScaler()
        df[['Salary', 'Score']] = scaler.fit_transform(df[['Salary', 'Score']])
        print(df)
        

        2025-03-09
      19. 日期轉換工具-處理各種日期格式

        日期轉換工具-處理各種日期格式

        1. 簡介

        提供了一個 DateConverter 類別,用於處理各種日期格式的轉換,包括:

        • 民國年與西元年(公元年)的轉換
        • 日期字串轉換為整數年、月、日
        • 農曆年與天干地支年的轉換
        • 國曆(西曆)與農曆日期的轉換

        這個工具類別可以應用於需要處理不同日期格式的應用程式中,例如:歷史資料分析、多國語言日曆系統等。

        2. 程式碼結構

        DateConverter 類別包含多個靜態方法,每個方法負責一種日期轉換。

        import datetime
        from lunardate import LunarDate
        
        class DateConverter:
            """
            日期轉換工具類別,提供多種日期格式的轉換方法。
            """
        
            # 民國年轉換為西元年
            @staticmethod
            def roc_to_ad(year):
                """將民國年轉換為西元年"""
                if year <= 0:
                    raise ValueError("無效的民國年份: 年份必須大於0")
                return year + 1911
        
            # 西元年轉換為民國年
            @staticmethod
            def year_to_roc(year):
                """將西元年轉換為民國年"""
                if year < 1912:
                    raise ValueError("年份不在有效範圍內: 民國年從1912年起始")
                roc_year = year - 1911
                return f"{roc_year}年"
        
            # 支援的日期格式
            _DATE_FORMATS = ['%Y-%m-%d', '%Y/%m/%d', '%Y年%m月%d日']  # 可擴展支持更多格式
        
            # 日期字符串轉換為整數型別的年、月、日
            @staticmethod
            def convert_to_int_date(date_str):
                """將日期字符串轉換為整數型別的年、月、日"""
                date = None
                for date_format in DateConverter._DATE_FORMATS:
                    try:
                        date = datetime.datetime.strptime(date_str, date_format)
                        break
                    except ValueError:
                        pass
                
                if date is None:
                    raise ValueError(f"無法解析日期:{date_str},請檢查日期格式是否正確。")
        
                return date.year, date.month, date.day
        
            # 農曆年轉天干地支年
            @staticmethod
            def lunar_year_to_gan_zhi(year):
                """將農曆年轉換為天干地支年"""
                tian_gan = "甲乙丙丁戊己庚辛壬癸"
                di_zhi = "子丑寅卯辰巳午未申酉戌亥"
                
                gan_idx = (year - 4) % 10  # 天干循環
                zhi_idx = (year - 4) % 12  # 地支循環
        
                return tian_gan[gan_idx] + di_zhi[zhi_idx]
            
            # 天干地支年轉換為多個西元年份
            @staticmethod
            def gan_zhi_to_lunar_years(gan_zhi_year):
                """將天干地支年轉換為多個西元年份"""
                tian_gan = "甲乙丙丁戊己庚辛壬癸"
                di_zhi = "子丑寅卯辰巳午未申酉戌亥"
                
                gan = gan_zhi_year[0]
                zhi = gan_zhi_year[1]
        
                gan_idx = tian_gan.index(gan)
                zhi_idx = di_zhi.index(zhi)
        
                current_year = datetime.datetime.now().year
                year_list = []
                for i in range(current_year, current_year - 241, -1):  # 遍歷過去240年
                    gan_idx_shift = (i - 4) % 10  # 根據天干的周期,向前位移4年
                    zhi_idx_shift = (i - 4) % 12  # 根據地支的周期,向前位移4年
                    if gan_idx_shift == gan_idx and zhi_idx_shift == zhi_idx:
                        year_list.append(i)
                    
                return year_list
            
            # 國曆日期轉換為農曆日期
            @staticmethod
            def convert_to_lunar_date(year, month, day):
                """將國曆日期轉換為農曆日期"""
                lunar_date = LunarDate.fromSolarDate(year, month, day)
                return lunar_date
        
            # 農曆日期轉換為國曆日期
            @staticmethod
            def convert_to_solar_date(year, month, day):
                """將農曆日期轉換為國曆日期"""
                lunar_date = LunarDate(year, month, day)
                return lunar_date.toSolarDate()
        
        • datetime 模組:用於處理日期和時間相關的操作。
        • lunardate 模組:用於處理農曆日期。

        3. 各種日期轉換方法

        3.1. 民國年與西元年轉換

        • roc_to_ad(year):將民國年轉換為西元年。
          • 如果輸入的民國年小於等於 0,則引發 ValueError。
          • 西元年 = 民國年 + 1911
        • year_to_roc(year):將西元年轉換為民國年。
          • 如果輸入的西元年小於 1912,則引發 ValueError。
          • 民國年 = 西元年 - 1911
            @staticmethod
            def roc_to_ad(year):
                """將民國年轉換為西元年"""
                if year <= 0:
                    raise ValueError("無效的民國年份: 年份必須大於0")
                return year + 1911
        
            @staticmethod
            def year_to_roc(year):
                """將西元年轉換為民國年"""
                if year < 1912:
                    raise ValueError("年份不在有效範圍內: 民國年從1912年起始")
                roc_year = year - 1911
                return f"{roc_year}年"
        

        3.2. 日期字串轉換為整數年、月、日

        • convert_to_int_date(date_str):將日期字串轉換為整數型別的年、月、日。
          • 使用 _DATE_FORMATS 列表中定義的日期格式嘗試解析日期字串。
          • 如果所有格式都無法解析,則引發 ValueError。
            _DATE_FORMATS = ['%Y-%m-%d', '%Y/%m/%d', '%Y年%m月%d日']  # 可擴展支持更多格式
        
            @staticmethod
            def convert_to_int_date(date_str):
                """將日期字符串轉換為整數型別的年、月、日"""
                date = None
                for date_format in DateConverter._DATE_FORMATS:
                    try:
                        date = datetime.datetime.strptime(date_str, date_format)
                        break
                    except ValueError:
                        pass
        
                if date is None:
                    raise ValueError(f"無法解析日期:{date_str},請檢查日期格式是否正確。")
        
                return date.year, date.month, date.day
        

        3.3. 農曆年與天干地支年的轉換

        • lunar_year_to_gan_zhi(year):將農曆年轉換為天干地支年。
          • 使用天干和地支的循環列表計算對應的天干和地支。
        • gan_zhi_to_lunar_years(gan_zhi_year):將天干地支年轉換為可能的西元年份列表。
          • 遍歷過去 240 年,找出符合給定天干地支的年份。
            @staticmethod
            def lunar_year_to_gan_zhi(year):
                """將農曆年轉換為天干地支年"""
                tian_gan = "甲乙丙丁戊己庚辛壬癸"
                di_zhi = "子丑寅卯辰巳午未申酉戌亥"
        
                gan_idx = (year - 4) % 10  # 天干循環
                zhi_idx = (year - 4) % 12  # 地支循環
        
                return tian_gan[gan_idx] + di_zhi[zhi_idx]
        
            @staticmethod
            def gan_zhi_to_lunar_years(gan_zhi_year):
                """將天干地支年轉換為多個西元年份"""
                tian_gan = "甲乙丙丁戊己庚辛壬癸"
                di_zhi = "子丑寅卯辰巳午未申酉戌亥"
        
                gan = gan_zhi_year[0]
                zhi = gan_zhi_year[1]
        
                gan_idx = tian_gan.index(gan)
                zhi_idx = di_zhi.index(zhi)
        
                current_year = datetime.datetime.now().year
                year_list = []
                for i in range(current_year, current_year - 241, -1):  # 遍歷過去240年
                    gan_idx_shift = (i - 4) % 10  # 根據天干的周期,向前位移4年
                    zhi_idx_shift = (i - 4) % 12  # 根據地支的周期,向前位移4年
                    if gan_idx_shift == gan_idx and zhi_idx_shift == zhi_idx:
                        year_list.append(i)
        
                return year_list
        

        3.4. 國曆(西曆)與農曆日期的轉換

        • convert_to_lunar_date(year, month, day):將國曆日期轉換為農曆日期。
          • 使用 LunarDate.fromSolarDate() 方法將國曆日期轉換為 LunarDate 物件。
        • convert_to_solar_date(year, month, day):將農曆日期轉換為國曆日期。
          • 使用 LunarDate() 建立 LunarDate 物件,然後使用 toSolarDate() 方法轉換為國曆日期。
            @staticmethod
            def convert_to_lunar_date(year, month, day):
                """將國曆日期轉換為農曆日期"""
                lunar_date = LunarDate.fromSolarDate(year, month, day)
                return lunar_date
        
            @staticmethod
            def convert_to_solar_date(year, month, day):
                """將農曆日期轉換為國曆日期"""
                lunar_date = LunarDate(year, month, day)
                return lunar_date.toSolarDate()
        

        4. 使用範例

        以下是如何使用 DateConverter 類別中的方法的範例:

        2025-03-09
      20. MacBook Pro 2019 + RTX 3060 + Micron X9 設置與優化指南

        MacBook Pro 2019 + RTX 3060 + Micron X9 設置與優化指南

        硬體環境

        • MacBook Pro 2019(16GB RAM)
        • Ubuntu(建議 22.04 LTS)
        • 外接顯卡(RTX 3060 12GB)
        • 外接 SSD(Micron X9 2TB,USB 3.2)

        1️⃣ 安裝 NVIDIA 驅動與 CUDA

        安裝 NVIDIA 驅動

        sudo apt update && sudo apt upgrade -y
        sudo apt install -y nvidia-driver-535
        sudo reboot
        

        安裝 CUDA 12(對應 PyTorch 和 DeepSeek)

        wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
        sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
        wget https://developer.download.nvidia.com/compute/cuda/12.2.2/local_installers/cuda_12.2.2_535.104.05_linux.run
        sudo sh cuda_12.2.2_535.104.05_linux.run --silent --toolkit
        export PATH=/usr/local/cuda-12.2/bin:$PATH
        export LD_LIBRARY_PATH=/usr/local/cuda-12.2/lib64:$LD_LIBRARY_PATH
        

        確認安裝成功

        nvidia-smi
        nvcc --version
        

        2️⃣ 建立 SWAP 優化運行

        創建 256GB SWAP(存放在 Micron X9)

        sudo mkdir -p /mnt/ssd_swap
        sudo fallocate -l 256G /mnt/ssd_swap/swapfile
        sudo chmod 600 /mnt/ssd_swap/swapfile
        sudo mkswap /mnt/ssd_swap/swapfile
        sudo swapon /mnt/ssd_swap/swapfile
        

        開機自動掛載 SWAP

        echo '/mnt/ssd_swap/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
        

        降低 SWAP 頻率(減少 SSD 負擔)

        echo 'vm.swappiness=10' | sudo tee -a /etc/sysctl.conf
        sudo sysctl -p
        

        3️⃣ 安裝 PyTorch、DeepSeek LLM、LangChain

        安裝 Python 環境

        sudo apt install -y python3-venv python3-pip
        python3 -m venv ~/llm_env
        source ~/llm_env/bin/activate
        

        安裝 PyTorch(支援 CUDA 12)

        pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
        

        安裝 DeepSeek LLM

        pip install deepseek-llm
        

        安裝 LangChain + FAISS(向量檢索庫)

        pip install langchain faiss-cpu
        

        4️⃣ 優化 DeepSeek LLM 運行

        啟動 DeepSeek LLM(7B 版本)

        from deepseek import DeepSeekModel
        model = DeepSeekModel.from_pretrained("deepseek-ai/deepseek-llm-7b")
        model.to("cuda")  # 使用 RTX 3060
        

        減少顯存占用(低 VRAM 優化)

        from transformers import BitsAndBytesConfig
        quantization_config = BitsAndBytesConfig(load_in_4bit=True)
        model = DeepSeekModel.from_pretrained("deepseek-ai/deepseek-llm-7b", quantization_config=quantization_config)
        

        設定 torch.compile() 提高推理速度(需要 PyTorch 2.0 以上)

        import torch
        model = torch.compile(model)
        

        5️⃣ LangChain + RAG 優化設置

        使用 FAISS 來管理向量資料庫

        from langchain.vectorstores import FAISS
        from langchain.embeddings import OpenAIEmbeddings
        
        vector_db = FAISS.load_local("/mnt/ssd_swap/faiss_db", OpenAIEmbeddings())
        

        減少 RAM 佔用(批量處理)

        from langchain.document_loaders import TextLoader
        
        loader = TextLoader("large_dataset.txt", chunk_size=512)
        docs = loader.load()
        

        啟用 Streaming 模式(避免載入太多內容到 RAM)

        from langchain.chat_models import ChatOpenAI
        llm = ChatOpenAI(model_name="deepseek-llm-7b", streaming=True)
        

        6️⃣ 總結調校重點

        NVIDIA 驅動 ➝ 安裝 CUDA 12,確認 nvidia-smi 正常運行 ✅ 增加 SWAP ➝ 在 Micron X9 建立 256GB SWAP,並調低 swappiness=10安裝 PyTorch + DeepSeek LLM用 CUDA 12 運行降低 VRAM 需求用 4-bit 量化(BitsAndBytesConfig)提高推理速度torch.compile() 編譯模型優化 LangChain + FAISS使用分批處理、Streaming API

        2025-02-25
      21. MacBook Pro 2019 安裝 Ubuntu 24.04 完整指南

        以下是針對 MacBook Pro 2019(含 T2 安全晶片)安裝 Ubuntu 24.04 的操作程序整理,我會將步驟簡化並整合為清晰的指南。因為 MacBook Pro 2019 有 T2 晶片,安裝 Ubuntu 需要特別調整安全設定並準備適當的啟動媒體。請注意,Ubuntu 24.04 是較新的版本,T2 支援可能需要額外的内核修補或驅動程式,以下步驟假設你希望從外部磁碟啟動或安裝到內部 SSD。

        操作程序:安裝 Ubuntu 24.04 於 MacBook Pro 2019 (含 T2 晶片)

        準備工作

        1. 下載 Ubuntu 24.04 ISO

          2025-02-25
        2. Ubuntu BreezyVoice 從零開始完整安裝設定指南

          Ubuntu BreezyVoice 從零開始完整安裝設定建議 (基於官方文件)

          Step 1: 環境準備 (系統更新與基本工具安裝)

          1. 開啟 Ubuntu 終端機 (Terminal):在 Ubuntu 桌面環境中,您可以透過應用程式選單搜尋 “Terminal” 或使用快捷鍵 Ctrl + Alt + T 開啟終端機。

          2. 更新系統套件列表與已安裝套件: 保持系統套件最新,有助於避免相容性問題。

            sudo apt update
            sudo apt upgrade -y
            
          3. 安裝必要的系統工具: 這些工具包含程式碼下載、編譯以及套件管理所需的基礎工具。

            sudo apt install -y git curl wget apt-utils
            

          Step 2: 安裝 Python 3.10 環境

          BreezyVoice 需要 Python 3.10 版本。請確認您的 Ubuntu 環境中已安裝或安裝正確版本的 Python。

          1.  **檢查 Python 版本**:  先確認系統中預設的 Python 版本。
          
              ```bash
              python3 --version
              ```
          
              如果版本不是 3.10.x,您需要安裝 Python 3.10。
          
          2.  **安裝 Python 3.10 (如果需要)**:  您可以使用 `deadsnakes` PPA 來安裝 Python 3.10。
          
              ```bash
              sudo add-apt-repository ppa:deadsnakes/ppa
              sudo apt update
              sudo apt install -y python3.10 python3.10-venv  # 同時安裝虛擬環境工具
              ```
          
          3.  **確認 Python 3.10 安裝成功**: 再次檢查版本,確認已安裝 Python 3.10。
          
              ```bash
              python3.10 --version
              ```
          
          4.  **設定 Python 3.10 為預設 (可選)**:  如果您希望之後直接使用 `python3` 指令就指向 Python 3.10,可以考慮設定預設版本 (請謹慎操作,可能影響其他系統工具)。
          
              ```bash
              sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 1
              python3 --version # 再次確認預設 python3 版本
              ```
          

          Step 3: 下載 BreezyVoice 程式碼

          2025-02-25
        3. 使用 CDC API 取得全球各國歷年 Covid-19 與流感數據並輸出 CSV 格式

          使用 CDC API 取得全球各國歷年 Covid-19 與流感數據並輸出 CSV 格式

          一、教學目標

          1. 知識目標:認識 CDC(美國疾病管制與預防中心)提供的公開數據 API 及其應用。
          2. 技能目標:學會使用 Python 與 requests 套件,從 CDC API 提取 Covid-19 與流感數據,並將其存為 CSV 格式。
          3. 態度目標:培養學生對公共健康數據分析的興趣,並理解其在疫情監測與研究的價值。

          二、前置準備

          適用對象

          • 對象:高中生、大學生或對公共健康、資料科學與 Python 有興趣的初學者。
          • 先備知識:基礎 Python 知識(檔案操作、資料處理)。

          所需軟硬體

          1. 硬體:具備網路連線的電腦。
          2. 軟體
            • Python 3.x(建議搭配 Anaconda)。
            • Python 套件:requestspandas
            • 文字編輯器(如 VS Code 或 Jupyter Notebook)。
          3. 其他:穩定的網路環境(API 需要線上存取)。

          教師準備

          • 預先安裝 requestspandas,並測試程式碼。
          • 準備 CDC API 的背景簡介(PDF 或投影片)。
          • 提供範例數據解釋(如 Covid-19 與流感的欄位意義)。

          三、教學流程

          時間分配:總計 90 分鐘

          • 導入(10 分鐘)
          • 環境設定與 API 介紹(15 分鐘)
          • Covid-19 數據實作(30 分鐘)
          • 流感數據實作(25 分鐘)
          • 總結與討論(10 分鐘)

          1. 導入(10 分鐘)

          活動:情境引導

          • 教師提問
            「如果要追蹤 Covid-19 或流感的全球趨勢,你會怎麼獲取數據?」
          • 簡介 CDC API
            • CDC 是什麼?(美國疾病管制與預防中心,提供公開健康數據)。
            • API 用途:透過程式獲取 Covid-19、流感等數據。
          • 目標導引
            「今天我們將學習如何用 Python 從 CDC API 提取 Covid-19 與流感數據,並存成 CSV 檔案,幫助你分析疫情趨勢!」

          2. 環境設定與 API 介紹(15 分鐘)

          講解(10 分鐘)

          • 安裝套件
            • 展示指令:
              pip install requests pandas
              
            • 檢查安裝:import requests, pandas(無錯誤即成功)。
          • CDC API 簡介
            • 端點範例:Covid-19 (9mfq-cb36.json)、流感 (vh55-3he6.json)。
            • 數據格式:JSON,需轉換為表格形式。

          實作活動(5 分鐘)

          • 學生任務
            1. 安裝 requestspandas
            2. 測試簡單請求:
          import requests
          url = "https://data.cdc.gov/resource/9mfq-cb36.json"
          response = requests.get(url)
          print(f"API 狀態碼:{response.status_code}")
          
          • 成果檢查:確認返回狀態碼 200(表示成功)。

          3. Covid-19 數據實作(30 分鐘)

          講解(10 分鐘)

          • 程式碼說明
            • requests.get():發送 API 請求。
            • pd.DataFrame():將 JSON 轉為表格。
            • 欄位篩選與日期格式化。
          • 展示範例:提取 Covid-19 數據並顯示前幾行。

          實作活動(20 分鐘)

          • 學生任務
            1. 執行以下程式碼,獲取 Covid-19 數據:
          import requests
          import pandas as pd
          
          # CDC Covid-19 API
          url = "https://data.cdc.gov/resource/9mfq-cb36.json"
          
          # 發送請求
          response = requests.get(url)
          
          if response.status_code == 200:
              data = response.json()
              df = pd.DataFrame(data)
              df = df[["submission_date", "state", "tot_cases", "tot_death"]]
              df["submission_date"] = pd.to_datetime(df["submission_date"])
              
              csv_filename = "covid19_cdc_data.csv"
              df.to_csv(csv_filename, index=False)
              print(f"已成功儲存 Covid-19 歷年數據至 {csv_filename}")
          else:
              print(f"❌ API 請求失敗,狀態碼:{response.status_code}")
          
          1. 打開 covid19_cdc_data.csv,檢查日期、州別與病例數。
          • 成果檢查:確認 CSV 包含日期、州別、總確診與死亡數。

          4. 流感數據實作(25 分鐘)

          講解(10 分鐘)

          • 程式碼說明
            • 流感 API 的欄位(如 weekili_activity_level)。
            • 與 Covid-19 程式碼的異同。
          • 展示範例:提取流感數據並解釋活動等級。

          實作活動(15 分鐘)

          • 學生任務
            1. 執行以下程式碼,獲取流感數據:
          import requests
          import pandas as pd
          
          # CDC Flu API
          flu_url = "https://data.cdc.gov/resource/vh55-3he6.json"
          
          # 發送請求
          response = requests.get(flu_url)
          
          if response.status_code == 200:
              flu_data = response.json()
              flu_df = pd.DataFrame(flu_data)
              flu_df = flu_df[["week", "region", "ili_activity_level", "activity_level_label"]]
              
              flu_csv_filename = "flu_cdc_data.csv"
              flu_df.to_csv(flu_csv_filename, index=False)
              print(f"已成功儲存流感數據至 {flu_csv_filename}")
          else:
              print(f"❌ API 請求失敗,狀態碼:{response.status_code}")
          
          1. 檢查 flu_cdc_data.csv,找出流感活動等級最高的地區。
          • 成果檢查:確認 CSV 包含週數、地區與活動等級。

          5. 總結與討論(10 分鐘)

          • 教師總結
            • CDC API 可提供 Covid-19 與流感等多種數據。
            • CSV 格式便於後續分析(如 Excel 或 Python)。
          • 學生討論
            • 「你發現哪些州的 Covid-19 死亡數最高?」
            • 「這些數據能用來做什麼?(如疫情預測、健康政策)」

          四、評量方式

          1. 實作成果(70%)
            • 成功生成 covid19_cdc_data.csv
            • 成功生成 flu_cdc_data.csv
          2. 參與討論(30%)
            • 在總結時分享觀察或提出問題。

          五、延伸應用

          1. 進階挑戰
            • 修改程式碼,篩選特定年份(如 2023)的數據。
            • 使用 matplotlib 繪製 Covid-19 或流感趨勢圖。
          2. 實務專案
            • 比較美國各州的流感與 Covid-19 活動等級。
            • 分析某地區的疫情數據,撰寫簡易報告。

          六、教學資源

          2025-02-23
        4. 使用 Google Trends API 擷取搜尋趨勢並輸出 CSV 格式

          使用 Google Trends API 擷取搜尋趨勢並輸出 CSV 格式

          一、教學目標

          1. 知識目標:理解 Google Trends 的功能及其透過 API 提供搜尋趨勢數據的機制。
          2. 技能目標:學會使用 pytrends 套件提取 LLM(大型語言模型)相關關鍵字的搜尋趨勢,並將資料輸出為 CSV 格式。
          3. 態度目標:培養對資料分析與趨勢研究的興趣,並認識其在商業與科技領域的應用價值。

          二、前置準備

          適用對象

          • 對象:高中生、大學生或對資料分析、Python 與 AI 趨勢有興趣的初學者。
          • 先備知識:基礎 Python 知識(套件安裝、資料處理)。

          所需軟硬體

          1. 硬體:具備網路連線的電腦。
          2. 軟體
            • Python 3.x(建議搭配 Anaconda)。
            • Python 套件:pytrendspandas
            • 文字編輯器(如 VS Code 或 Jupyter Notebook)。
          3. 其他:穩定的網路環境(Google Trends API 需要線上存取)。

          教師準備

          • 預先安裝 pytrends 並測試程式碼。
          • 準備一份簡易安裝指南(PDF 或投影片)。
          • 提供 LLM 相關背景資料(簡介 GPT-4、Llama 3 等模型)。

          三、教學流程

          時間分配:總計 90 分鐘

          • 導入(10 分鐘)
          • 環境設定與基本操作(20 分鐘)
          • 搜尋趨勢數據實作(30 分鐘)
          • 各國趨勢數據實作(20 分鐘)
          • 總結與討論(10 分鐘)

          1. 導入(10 分鐘)

          活動:情境引導

          • 教師提問
            「你知道現在最熱門的 AI 模型是什麼嗎?如何用數據證明它的熱度?」
          • 簡介 Google Trends
            • 什麼是 Google Trends?(免費工具,顯示關鍵字搜尋熱度)。
            • 介紹 pytrends 套件如何透過 API 提取資料。
          • 目標導引
            「今天我們將學習如何用 Python 抓取 LLM(如 GPT-4、Claude 3)的搜尋趨勢,並存成 CSV,幫助你分析 AI 熱度!」

          2. 環境設定與基本操作(20 分鐘)

          講解(10 分鐘)

          • 安裝 pytrends
            • 展示指令:
              pip install pytrends
              
            • 檢查安裝:import pytrends(無錯誤即成功)。
          • 基本概念
            • TrendReq:初始化 Google Trends API。
            • 參數說明:timeframe(時間範圍)、geo(地區)。

          實作活動(10 分鐘)

          • 學生任務
            1. 安裝 pytrends
            2. 測試簡單程式碼:
          from pytrends.request import TrendReq
          pytrends = TrendReq(hl="en-US", tz=360)
          print("成功連接到 Google Trends API!")
          
          • 成果檢查:確認程式運行無誤並顯示成功訊息。

          3. 搜尋趨勢數據實作(30 分鐘)

          講解(10 分鐘)

          • 程式碼說明
            • build_payload:設定關鍵字與搜尋條件。
            • interest_over_time():獲取時間序列數據。
            • to_csv():輸出為 CSV。
          • 展示範例:以 LLM 關鍵字(如 GPT-4)展示結果。

          實作活動(20 分鐘)

          • 學生任務
            1. 執行以下程式碼,獲取近 30 天 LLM 搜尋趨勢:
          from pytrends.request import TrendReq
          import pandas as pd
          
          # 初始化 API
          pytrends = TrendReq(hl="en-US", tz=360)
          
          # 定義關鍵字
          keywords = ["GPT-4", "Llama 3", "Gemini AI", "Claude 3", "Mistral AI"]
          
          # 設定搜尋條件
          pytrends.build_payload(kw_list=keywords, timeframe="now 30-d", geo="US")
          
          # 獲取趨勢數據
          trend_data = pytrends.interest_over_time()
          trend_data = trend_data.drop(columns=["isPartial"])
          
          # 輸出 CSV
          csv_filename = "llm_trends.csv"
          trend_data.to_csv(csv_filename)
          
          print(f"已成功儲存 LLM 搜尋趨勢數據至 {csv_filename}")
          print(trend_data.head())
          
          1. 修改 geo="US""TW"(台灣)或 ""(全球),重新運行並比較結果。
          • 成果檢查:打開 llm_trends.csv,確認包含日期與關鍵字搜尋熱度。

          4. 各國趨勢數據實作(20 分鐘)

          講解(10 分鐘)

          • 介紹 interest_by_region()
            • 用途:比較不同地區的搜尋熱度。
            • 數據結構:以國家為單位顯示熱度。
          • 展示範例:顯示 LLM 在美國與台灣的搜尋差異。

          實作活動(10 分鐘)

          • 學生任務
            1. 執行以下程式碼,獲取各國 LLM 搜尋趨勢:
          # 取得各國趨勢數據
          region_trends = pytrends.interest_by_region()
          
          # 輸出 CSV
          csv_filename = "llm_trends_by_country.csv"
          region_trends.to_csv(csv_filename)
          
          print(f"已成功儲存各國 LLM 搜尋趨勢數據至 {csv_filename}")
          print(region_trends.head())
          
          1. 檢查 llm_trends_by_country.csv,找出搜尋熱度前 5 名的國家。
          • 成果檢查:確認 CSV 包含國家名稱與各關鍵字的熱度。

          5. 總結與討論(10 分鐘)

          • 教師總結
            • interest_over_time() 適合分析時間趨勢。
            • interest_by_region() 適合比較地區差異。
            • 數據用途:市場分析、SEO、技術趨勢研究。
          • 學生討論
            • 「哪個 LLM 在你選擇的地區最熱門?為什麼?」
            • 「這些數據能用來解決什麼實際問題?」

          四、評量方式

          1. 實作成果(70%)
            • 成功生成 llm_trends.csv(時間趨勢)。
            • 成功生成 llm_trends_by_country.csv(地區趨勢)。
          2. 參與討論(30%)
            • 在總結時分享觀察或提出問題。

          五、延伸應用

          1. 進階挑戰
            • 修改 keywords,加入其他 AI 技術(如 “Quantum Computing”)。
            • 使用 timeframe="2023-01-01 2023-12-31",分析 2023 全年趨勢。
            • 將 CSV 匯入 Excel 或 Tableau,製作視覺化圖表。
          2. 實務專案
            • 分析不同國家的 AI 教育熱度(如搜尋 “AI Course”)。
            • 研究某產品(如 “ChatGPT”)的全球市場接受度。

          六、教學資源

          2025-02-23
        5. 使用 Python 爬取 BigGo RTX 4090 顯示卡價格資訊

          使用 Python 爬取 BigGo RTX 4090 顯示卡價格資訊

          一、教學目標

          1. 知識目標:理解網站爬蟲的基本原理及靜態與動態網頁的差異。
          2. 技能目標:學會使用 requestsBeautifulSoup 爬取靜態內容,以及 Selenium 爬取動態內容,並將資料整理為 CSV 格式。
          3. 態度目標:培養學生對價格比較與市場趨勢分析的興趣,並認識資料擷取的實用性。

          二、前置準備

          適用對象

          • 對象:高中生、大學生或對 Python、網頁爬蟲與電商數據有興趣的初學者。
          • 先備知識:基礎 Python(檔案操作、套件使用),HTML 基本結構。

          所需軟硬體

          1. 硬體:具備網路連線的電腦。
          2. 軟體
            • Python 3.x(建議搭配 Anaconda)。
            • Python 套件:requestsbeautifulsoup4pandasseleniumwebdriver-manager
            • 文字編輯器(如 VS Code 或 Jupyter Notebook)。
            • Google Chrome 瀏覽器(用於 Selenium)。
          3. 其他:穩定的網路環境。

          教師準備

          • 預先安裝所有套件並測試程式碼。
          • 準備 BigGo 網站結構簡介(HTML 標籤、動態載入說明)。
          • 提供範例 CSV 檔案作為參考。

          三、教學流程

          時間分配:總計 120 分鐘

          • 導入(15 分鐘)
          • 方法 1:使用 requests 爬取(40 分鐘)
          • 方法 2:使用 Selenium 爬取(50 分鐘)
          • 總結與討論(15 分鐘)

          1. 導入(15 分鐘)

          活動:情境引導

          • 教師提問
            「如果你想買 RTX 4090 顯示卡,如何快速比較不同賣場的價格?」
          • 簡介 BigGo 與爬蟲
            • BigGo 是什麼?(台灣價格比較平台)。
            • 爬蟲用途:自動收集網頁資料(如價格、賣場)。
            • 靜態 vs 動態網頁:介紹 requests(靜態)與 Selenium(動態)的差異。
          • 目標導引
            「今天我們將學習兩種方法,從 BigGo 爬取 RTX 4090 價格,並存成表格,幫助你掌握市場動態!」

          2. 方法 1:使用 requestsBeautifulSoup 爬取(40 分鐘)

          講解(15 分鐘)

          • 環境設定
            • 安裝套件:
              pip install requests beautifulsoup4 pandas
              
          • 程式說明
            • requests.get():發送 HTTP 請求。
            • BeautifulSoup:解析 HTML,提取標籤內容。
            • pandas:整理資料並輸出 CSV。
          • 展示範例:運行程式並顯示部分結果。

          實作活動(25 分鐘)

          • 學生任務
            1. 執行以下程式碼,爬取 RTX 4090 價格:
          import requests
          from bs4 import BeautifulSoup
          import pandas as pd
          
          URL = "https://biggo.com.tw/s/?q=RTX+4090"
          HEADERS = {
              "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
          }
          
          response = requests.get(URL, headers=HEADERS)
          
          if response.status_code == 200:
              soup = BeautifulSoup(response.text, "html.parser")
              products = soup.find_all("div", class_="Product")
          
              product_list = []
              for product in products:
                  try:
                      title = product.find("h2").text.strip()
                      price = product.find("span", class_="price").text.strip()
                      seller = product.find("span", class_="seller").text.strip()
                      link = product.find("a", class_="title")["href"]
                      product_list.append([title, price, seller, f"https://biggo.com.tw{link}"])
                  except AttributeError:
                      continue
          
              df = pd.DataFrame(product_list, columns=["商品名稱", "價格", "賣場", "連結"])
              print(df)
              df.to_csv("biggo_rtx4090_prices.csv", index=False, encoding="utf-8-sig")
              print("✅ 已成功爬取並儲存 RTX 4090 價格資訊!")
          else:
              print("❌ 無法取得 BigGo 網頁資料,請檢查 URL 或 Headers 設定。")
          
          1. 檢查 biggo_rtx4090_prices.csv,確認包含名稱、價格等欄位。
          • 成果檢查:若資料不完整,討論可能原因(如動態載入)。

          3. 方法 2:使用 Selenium 爬取動態內容(50 分鐘)

          講解(20 分鐘)

          • 環境設定
            • 安裝套件:
              pip install selenium pandas webdriver-manager
              
            • WebDriver 說明:介紹 ChromeDriver 與 webdriver-manager
          • 程式說明
            • webdriver.Chrome():模擬瀏覽器。
            • --headless:無視窗運行。
            • find_elements():動態提取資料。
          • 展示範例:運行程式並比較與方法 1 的差異。

          實作活動(30 分鐘)

          • 學生任務
            1. 執行以下程式碼,爬取動態數據:
          import time
          import pandas as pd
          from selenium import webdriver
          from selenium.webdriver.chrome.service import Service
          from selenium.webdriver.common.by import By
          from selenium.webdriver.chrome.options import Options
          from webdriver_manager.chrome import ChromeDriverManager
          
          chrome_options = Options()
          chrome_options.add_argument("--headless")
          chrome_options.add_argument("--disable-gpu")
          chrome_options.add_argument("--no-sandbox")
          
          driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
          URL = "https://biggo.com.tw/s/?q=RTX+4090"
          driver.get(URL)
          time.sleep(3)
          
          products = driver.find_elements(By.CLASS_NAME, "Product")
          product_list = []
          
          for product in products:
              try:
                  title = product.find_element(By.TAG_NAME, "h2").text.strip()
                  price = product.find_element(By.CLASS_NAME, "price").text.strip()
                  seller = product.find_element(By.CLASS_NAME, "seller").text.strip()
                  link = product.find_element(By.CLASS_NAME, "title").get_attribute("href")
                  product_list.append([title, price, seller, link])
              except Exception as e:
                  print(f"❌ 抓取錯誤:{e}")
                  continue
          
          driver.quit()
          df = pd.DataFrame(product_list, columns=["商品名稱", "價格", "賣場", "連結"])
          df.to_csv("biggo_rtx4090_prices_selenium.csv", index=False, encoding="utf-8-sig")
          print("✅ 已成功爬取並儲存 RTX 4090 價格資訊!")
          
          1. 檢查 biggo_rtx4090_prices_selenium.csv,確認資料完整性。
          • 成果檢查:比較兩種方法的 CSV,討論 Selenium 的優勢。

          4. 總結與討論(15 分鐘)

          • 教師總結
            • 方法 1(requests):適合靜態網頁,快速但受限於動態內容。
            • 方法 2(Selenium):適合動態網頁,功能強大但較慢。
          • 學生討論
            • 「哪個賣場的 RTX 4090 價格最低?」
            • 「爬蟲數據可以用來做什麼?(如價格追蹤、市場分析)」

          四、評量方式

          1. 實作成果(70%)
            • 成功生成 biggo_rtx4090_prices.csv(方法 1)。
            • 成功生成 biggo_rtx4090_prices_selenium.csv(方法 2)。
          2. 參與討論(30%)
            • 在總結時分享觀察或問題。

          五、延伸應用

          1. 進階挑戰
            • 修改程式,爬取多頁資料(處理分頁)。
            • 加入時間戳記,定期爬取並追蹤價格變化。
            • 使用 matplotlib 繪製價格趨勢圖。
          2. 實務專案
            • 爬取其他商品(如 RTX 4080),比較價格差異。
            • 設計自動化腳本,定時更新價格並通知最低價。

          六、教學資源

          2025-02-23
        6. 使用 Selenium 爬取 Nasdaq 即時價格

          教案:使用 Selenium 爬取 Nasdaq 即時價格

          課程目標

          • 了解如何使用 Selenium 進行網頁爬取。
          • 學習 lxml 處理 HTML 資料。
          • 熟悉 WebDriver 的基本操作。
          • 掌握動態網頁數據爬取的技巧。

          先備知識

          • Python 基礎語法
          • HTML / XPath 知識
          • 瀏覽器開發者工具的使用

          教學內容

          1. 安裝相依套件

          本程式使用 Selenium 來控制瀏覽器,lxml 來解析 HTML。請執行以下指令安裝必要的套件:

          2025-02-23
        7. 使用 Yahoo Finance API 實現農產品交易數據的自動化擷取與儲存

          使用 Yahoo Finance API 實現農產品交易數據的自動化擷取與儲存

          一、教學目標

          1. 知識目標:理解 Yahoo Finance API、FastAPI 服務及自動化工具(如 Make.com)的運作原理。
          2. 技能目標:學會使用 yfinance 抓取農產品交易數據,建立 FastAPI 服務,並透過 Make.com 將數據自動存入 Notion。
          3. 態度目標:培養學生對金融數據分析與自動化流程的興趣,並認識其在市場研究中的價值。

          二、前置準備

          適用對象

          • 對象:大學生、資料科學初學者或對金融數據與自動化有興趣者。
          • 先備知識:基礎 Python(函數、字典)、API 概念。

          所需軟硬體

          1. 硬體:具備網路連線的電腦。
          2. 軟體
            • Python 3.x(建議搭配 Anaconda)。
            • Python 套件:yfinancefastapiuvicornpandasrequests
            • 文字編輯器(如 VS Code)。
            • Make.com 帳號、Notion 帳號。
          3. 其他
            • 穩定的網路環境。
            • Notion 資料庫(預先建立,包含相關欄位)。

          教師準備

          • 預先安裝所有套件並測試程式碼。
          • 準備 Notion 資料庫範例(包含欄位:開盤價、最高價、最低價、收盤價、成交量)。
          • 提供 Make.com 操作截圖或影片。

          三、教學流程

          時間分配:總計 120 分鐘

          • 導入(15 分鐘)
          • 方法 1:使用 yfinance 抓取數據(30 分鐘)
          • 方法 2:建立 FastAPI 服務(30 分鐘)
          • 方法 3:使用 Make.com 自動化(35 分鐘)
          • 總結與討論(10 分鐘)

          1. 導入(15 分鐘)

          活動:情境引導

          • 教師提問
            「如果你想追蹤農產品(如黃豆、玉米)的價格變化,如何快速獲取並記錄數據?」
          • 簡介內容
            • Yahoo Finance API:提供免費金融數據。
            • FastAPI:快速建立 API 服務。
            • Make.com:自動化工具,連接 API 與 Notion。
          • 目標導引
            「今天我們將學習如何用 Python 抓取農產品交易數據,建立 API,並透過自動化工具存入 Notion,實現全流程自動化!」

          2. 方法 1:使用 yfinance 抓取交易數據(30 分鐘)

          講解(10 分鐘)

          • 環境設定
            • 安裝套件:
              pip install yfinance pandas
              
          • 程式說明
            • yfinance.Ticker():獲取商品數據。
            • history():提取 OHLC 與交易量。
            • 數據結構:字典格式。
          • 展示範例:運行程式並顯示黃豆數據。

          實作活動(20 分鐘)

          • 學生任務
            1. 執行以下程式碼,抓取黃豆、玉米、小麥數據:
          import yfinance as yf
          import pandas as pd
          
          commodities = {
              "黃豆": "ZS=F",
              "玉米": "ZC=F",
              "小麥": "ZW=F"
          }
          
          def fetch_commodity_data():
              result = {}
              for name, symbol in commodities.items():
                  data = yf.Ticker(symbol).history(period="1d")
                  if not data.empty:
                      latest = data.iloc[-1]
                      result[name] = {
                          "開盤": latest["Open"],
                          "最高": latest["High"],
                          "最低": latest["Low"],
                          "收盤": latest["Close"],
                          "成交量": latest["Volume"]
                      }
              return result
          
          data = fetch_commodity_data()
          print(data)
          
          1. 修改 period="1d""5d",觀察多日數據變化。
          • 成果檢查:確認輸出包含 OHLC 與成交量。

          3. 方法 2:使用 FastAPI 建立 API 服務(30 分鐘)

          講解(10 分鐘)

          • 環境設定
            • 安裝套件:
              pip install fastapi uvicorn
              
          • 程式說明
            • @app.get():定義 API 端點。
            • uvicorn.run():啟動服務。
          • 展示範例:啟動服務並用瀏覽器訪問 http://localhost:8000/commodities

          實作活動(20 分鐘)

          • 學生任務
            1. 執行以下程式碼,建立 API:
          from fastapi import FastAPI
          import uvicorn
          from your_module import fetch_commodity_data  # 假設前述函數在另一檔案
          
          app = FastAPI()
          
          @app.get("/commodities")
          def get_commodities():
              return fetch_commodity_data()
          
          if __name__ == "__main__":
              uvicorn.run(app, host="0.0.0.0", port=8000)
          
          1. 在瀏覽器或工具(如 Postman)訪問 http://localhost:8000/commodities,檢查回傳數據。
          • 成果檢查:確認 API 回傳 JSON 格式的交易數據。

          4. 方法 3:使用 Make.com 介接並存入 Notion(35 分鐘)

          講解(15 分鐘)

          • Make.com 設定
            • HTTP 模組:發送 GET 請求。
            • Notion 模組:連接資料庫並映射欄位。
            • 排程設定:每日更新。
          • 展示範例:展示 Make.com 流程並檢查 Notion 更新。

          實作活動(20 分鐘)

          • 學生任務
            1. 在 Make.com 创建流程:
              • 添加 HTTP GET 模組
                • URL:http://localhost:8000/commodities(或公開伺服器 URL)。
              • 添加 Notion 模組
                • 選擇已有資料庫,映射字段(如 開盤價Open)。
              • 設定排程:每日 UTC 23:00。
            2. 執行流程並檢查 Notion 是否新增數據。
          • 成果檢查:確認 Notion 資料庫顯示最新交易數據。

          5. 總結與討論(10 分鐘)

          • 教師總結
            • yfinance:快速獲取金融數據。
            • FastAPI:提供外部存取介面。
            • Make.com:實現自動化與資料整合。
          • 學生討論
            • 「哪種農產品的價格波動最大?」
            • 「這個流程可以用在哪些實際場景?(如投資決策、市場報告)」

          四、評量方式

          1. 實作成果(70%)
            • 成功抓取並顯示交易數據(方法 1)。
            • 成功啟動 FastAPI 並訪問數據(方法 2)。
            • 成功設定 Make.com 並更新 Notion(方法 3)。
          2. 參與討論(30%)
            • 在總結時分享觀察或應用想法。

          五、延伸應用

          1. 進階挑戰
            • 修改 yfinance 程式,抓取多月數據並計算平均價格。
            • 在 FastAPI 中新增端點(如 /commodities/weekly)。
            • 在 Notion 中加入圖表視覺化。
          2. 實務專案
            • 追蹤其他商品(如黃金、原油)的價格趨勢。
            • 設計每周市場報告自動生成系統。

          六、教學資源

          2025-02-23
        8. 使用 yfinance 分析 NVIDIA 季度數據

          使用 Python 與 yfinance 分析 NVIDIA 季度數據

          課程目標

          1. 精熟 yfinance 套件,高效獲取 NVIDIA 股票的歷史數據。
          2. 深入理解季度交易數據,並進行財金視角的關鍵分析。
          3. 熟練運用 matplotlibpandas 進行專業數據可視化,解讀 NVIDIA 股價走勢。
          4. 進一步分析NVIDIA的報酬率與移動平均線,並視覺化。

          適用對象

          • 具備 Python 基礎(變數、套件導入等)。
          • 對科技股、半導體產業及財務分析有興趣的學員。
          • 具備基礎pandas與matplotlib的操作經驗。

          課程時間

          • 約 90 分鐘(含講解與實作)

          教案內容

          一、課程簡介(5 分鐘)

          • 主題介紹:本次課程將運用 Python 深入分析 NVIDIA 的季度數據,從財金角度解讀其股價表現,探討其在 AI 晶片市場的領先地位。我們將加入進階的資料視覺化,讓分析更具深度。
          • 工具說明:使用 yfinance(獲取股票數據)、matplotlib(數據可視化)和 pandas(數據處理)。

          二、環境準備(10 分鐘)

          步驟 1:安裝 yfinance 套件

          • 講解:於終端機執行以下指令,安裝 yfinance 套件:
          pip install yfinance
          
          • 實作:學員於終端機執行指令,確認安裝成功。

          步驟 2:檢查 Python 環境

          • 確認 matplotlibpandas 已安裝,若未安裝,執行:
          pip install matplotlib pandas
          

          三、核心實作:抓取 NVIDIA 季度數據(15 分鐘)

          程式碼講解與實作

          • 程式碼
          import yfinance as yf
          
          # 下載 NVIDIA(NVDA)股票數據
          nvda = yf.Ticker("NVDA")
          
          # 獲取歷年季度交易數據
          df = nvda.history(period="max", interval="3mo")
          
          # 顯示前 10 筆數據
          print(df.head(10))
          
          • 逐步解說
            1. import yfinance as yf:導入 yfinance 套件。
            2. yf.Ticker("NVDA"):指定股票代號為 NVIDIA(NVDA)。
            3. .history(period="max", interval="3mo"):獲取最大時間範圍的季度數據。
            4. print(df.head(10)):顯示前 10 筆數據,確認數據獲取。
          • 實作要求:學員執行程式碼,觀察 NVIDIA 自上市以來的股價數據。
          • 範例輸出(部分):
                           Open    High     Low   Close    Volume  Dividends  Stock Splits
          Date
          1999-01-01   0.424   0.449   0.364   0.403  66900000        0.0           0.0
          1999-04-01   0.403   0.509   0.380   0.490  45800000        0.0           0.0
          ...
          

          四、財金分析:解讀 NVIDIA 季度數據(20 分鐘)

          情境設計:NVIDIA 財報分析

          • 故事:假設我們是財金分析師,需要深入分析 NVIDIA 的季度數據,評估其投資價值。
          • 程式碼
          import yfinance as yf
          import pandas as pd
          
          # NVIDIA(NVDA)股票數據
          nvda = yf.Ticker("NVDA")
          
          # 獲取季度數據
          nvda_df = nvda.history(period="max", interval="3mo")
          
          # 顯示最近 5 筆季度數據
          print("NVIDIA 最近 5 筆季度數據:")
          print(nvda_df.tail(5))
          
          # 計算季度平均收盤價
          quarterly_avg = nvda_df["Close"].resample("Q").mean()
          print("\nNVIDIA 季度平均收盤價:")
          print(quarterly_avg.tail(5))
          
          # 計算季度報酬率
          quarterly_returns = nvda_df["Close"].resample("Q").last().pct_change()
          print("\nNVIDIA 季度報酬率:")
          print(quarterly_returns.tail(5))
          
          # 計算移動平均線 (2季)
          nvda_df['2季移動平均'] = nvda_df['Close'].rolling(window=2).mean()
          
          #計算移動平均線 (4季)
          nvda_df['4季移動平均'] = nvda_df['Close'].rolling(window=4).mean()
          
          print(nvda_df.tail())
          
          • 講解:引導學員從收盤價、成交量、報酬率、移動平均線等數據,分析 NVIDIA 的營運狀況、市場情緒與趨勢。
          • 實作:學員執行程式碼,觀察 NVIDIA 近期股價變化,並計算季度平均收盤價、季度報酬率與移動平均線。

          五、進階可視化數據:繪製 NVIDIA 股價走勢與分析(30 分鐘)

          程式碼講解

          • 程式碼
          import matplotlib.pyplot as plt
          
          # 繪製 NVIDIA 季度收盤價趨勢
          plt.figure(figsize=(12, 6))
          plt.plot(df.index, df["Close"], label="NVIDIA 收盤價")
          plt.plot(df.index, df["2季移動平均"], label="2季移動平均線")
          plt.plot(df.index, df["4季移動平均"], label="4季移動平均線")
          plt.title("NVIDIA (NVDA) Quarterly Closing Prices with Moving Averages")
          plt.xlabel("Year")
          plt.ylabel("Stock Price (USD)")
          plt.legend()
          plt.grid(True)
          plt.show()
          
          #繪製季度報酬率
          plt.figure(figsize=(12,6))
          quarterly_returns = df["Close"].resample("Q").last().pct_change()
          quarterly_returns.plot(kind='bar', color='skyblue')
          plt.title("NVIDIA Quarterly Returns")
          plt.xlabel("Quarter")
          plt.ylabel("Returns")
          plt.grid(axis='y')
          plt.show()
          
          • 逐步解說
            1. plt.plot():繪製收盤價與移動平均線趨勢圖。
            2. plt.figure(figsize=(12, 6)):設定圖表大小。
            3. plt.titleplt.xlabelplt.ylabel:添加圖表標題與軸標籤。
            4. plt.legend():加上圖示。
            5. plt.grid(True):加上網格線。
            6. quarterly_returns.plot(kind='bar', color='skyblue'):繪製季度報酬率的柱狀圖。
          • 實作:學員執行程式碼,觀察 NVIDIA 季度股價走勢圖與季度報酬率,並分析移動平均線的交叉。

          財金分析:解讀股價趨勢與報酬率

          • 討論:引導學員從股價走勢圖、移動平均線與報酬率,分析 NVIDIA 的成長趨勢、波動性、買賣訊號與潛在風險。

          六、課後練習與討論(10 分鐘)

          • 作業
            1. 分析其他科技股(如 AMD、TSM)的季度數據,比較其與 NVIDIA 的股價表現、報酬率與移動平均線。
            2. 嘗試計算 NVIDIA 的其他技術指標(如 RSI、MACD),並進行視覺化分析。
            3. 嘗試使用不同的資料視覺化圖表,例如盒鬚圖、散佈圖等,呈現 NVIDIA 的數據。
          • 討論問題
            1. 移動平均線的交叉,如何作為買賣訊號?
            2. 如何從報酬率分析 NVIDIA 的風險與報酬?

          2025-02-23
        9. 學習資料科學:Python 網拍資料清洗實戰

          Python 網拍資料清洗實戰課程

          本課程將從零開始,帶領您學習如何運用 Python 的 pandasNumPySciPyre 等套件,清洗並整理網拍資料。您將在本課程中掌握資料清理的完整流程與實用技巧。

          1. 準備工作與資料匯入

          1.1 環境設定

          • 確認 Python 版本:請確認您已安裝 Python 3.6 以上版本。
          • 安裝必要套件:使用 pip 安裝 pandasnumpyscipymatplotlibseabornscikit-learn 等套件。
          pip install pandas numpy scipy matplotlib seaborn scikit-learn
          

          1.2 匯入套件

          在 Python 程式碼中導入課程中將使用的套件。

          2025-02-23
        10. 學習資料科學:yfinance 金融數據擷取與 Pandas 分析實戰

          yfinance 專案介紹與實作範例

          本篇文章將根據 yfinance GitHub 連結介紹此專案,並示範如何使用它來擷取股票與期貨資料,並運用 Pandas 進行資料分析。

          專案簡介

          yfinance 是一個 Python 開源函式庫,其主要功能是從 Yahoo Finance! 網站上抓取金融市場數據。透過 yfinance,使用者可以輕鬆地取得股票、指數、貨幣、加密貨幣、ETF、基金以及期貨等金融商品的:

          2025-02-23
        11. 學習資料科學:中央氣象署地震資料清理與分析實戰

          中央氣象署地震資料處理

          處理從中央氣象署開放資料平台取得的地震資料 JSON 檔案,並進行資料清理與統計分析。

          API 參考連結:

          範例 Curl 指令 (屏東縣):

          curl -X 'GET' \
            '[https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0015-001?Authorization=您的驗證碼&format=JSON&AreaName=%E5%B1%8F%E6%9D%B1%E7%B8%A3](https://www.google.com/search?q=https://opendata.cwa.gov.tw/api/v1/rest/datastore/E-A0015-001%3FAuthorization%3D%E6%82%A8%E7%9A%84%E9%A9%97%E8%AD%89%E7%A2%BC%26format%3DJSON%26AreaName%3D%25E5%25B1%258F%25E6%259D%25B1%25E7%25B8%25A3)' \
            -H 'accept: application/json'
          

          Python 程式碼:

          import json
          import pandas as pd
          
          def process_earthquake_data(filepath):
              """
              處理地震資料 JSON 檔案,進行資料清理和統計。
          
              Args:
                  filepath: JSON 檔案路徑。
          
              Returns:
                  一個字典,包含清理後的 DataFrame 和一些統計結果。
              """
              try:
                  with open(filepath, 'r', encoding='utf-8') as f:
                      data = json.load(f)
              except FileNotFoundError:
                  print(f"錯誤:找不到檔案 {filepath}")
                  return None
              except json.JSONDecodeError:
                  print(f"錯誤:{filepath} 的 JSON 格式無效")
                  return None
          
              # 提取地震資料
              earthquake_list = []
              for earthquake in data['records']['Earthquake']:
                  earthquake_data = {
                      'EarthquakeNo': earthquake['EarthquakeNo'],
                      'ReportType': earthquake['ReportType'],
                      'ReportColor': earthquake['ReportColor'],
                      'ReportContent': earthquake['ReportContent'],
                      'ReportImageURI': earthquake['ReportImageURI'],
                      'ReportRemark': earthquake['ReportRemark'],
                      'Web': earthquake['Web'],
                      'ShakemapImageURI': earthquake['ShakemapImageURI'],
                      'OriginTime': earthquake['EarthquakeInfo']['OriginTime'],
                      'Source': earthquake['EarthquakeInfo']['Source'],
                      'FocalDepth': earthquake['EarthquakeInfo']['FocalDepth'],
                      'Location': earthquake['EarthquakeInfo']['Epicenter']['Location'],
                      'EpicenterLatitude': earthquake['EarthquakeInfo']['Epicenter']['EpicenterLatitude'],
                      'EpicenterLongitude': earthquake['EarthquakeInfo']['Epicenter']['EpicenterLongitude'],
                      'MagnitudeType': earthquake['EarthquakeInfo']['EarthquakeMagnitude']['MagnitudeType'],
                      'MagnitudeValue': earthquake['EarthquakeInfo']['EarthquakeMagnitude']['MagnitudeValue'],
                  }
          
                  # 展開 Intensity 資料
                  for area in earthquake['Intensity']['ShakingArea']:
                      for station in area.get("EqStation", []):
                          earthquake_data_copy = earthquake_data.copy()
                          earthquake_data_copy['AreaDesc'] = area['AreaDesc']
                          earthquake_data_copy['CountyName'] = area['CountyName']
                          earthquake_data_copy['AreaIntensity'] = area['AreaIntensity']
                          earthquake_data_copy['StationName'] = station.get('StationName')
                          earthquake_data_copy['StationID'] = station.get('StationID')
                          earthquake_data_copy['SeismicIntensity'] = station.get('SeismicIntensity')
                          earthquake_data_copy['WaveImageURI'] = station.get('WaveImageURI')
                          earthquake_data_copy['BackAzimuth'] = station.get('BackAzimuth')
                          earthquake_data_copy['EpicenterDistance'] = station.get('EpicenterDistance')
                          earthquake_data_copy['StationLatitude'] = station.get('StationLatitude')
                          earthquake_data_copy['StationLongitude'] = station.get('StationLongitude')
          
                          if 'pga' in station:
                              earthquake_data_copy['pga_EWComponent'] = station['pga'].get('EWComponent')
                              earthquake_data_copy['pga_NSComponent'] = station['pga'].get('NSComponent')
                              earthquake_data_copy['pga_VComponent'] = station['pga'].get('VComponent')
                              earthquake_data_copy['pga_IntScaleValue'] = station['pga'].get('IntScaleValue')
                              earthquake_data_copy['pga_unit'] = station['pga'].get('unit')
                          if 'pgv' in station:
                              earthquake_data_copy['pgv_EWComponent'] = station['pgv'].get('EWComponent')
                              earthquake_data_copy['pgv_NSComponent'] = station['pgv'].get('NSComponent')
                              earthquake_data_copy['pgv_VComponent'] = station['pgv'].get('VComponent')
                              earthquake_data_copy['pgv_IntScaleValue'] = station['pgv'].get('IntScaleValue')
                              earthquake_data_copy['pgv_unit'] = station['pgv'].get('unit')
                          earthquake_list.append(earthquake_data_copy)
          
                      if len(area.get("EqStation", [])) == 0:
                          earthquake_data_copy = earthquake_data.copy()
                          earthquake_data_copy['AreaDesc'] = area['AreaDesc']
                          earthquake_data_copy['CountyName'] = area['CountyName']
                          earthquake_data_copy['AreaIntensity'] = area['AreaIntensity']
                          earthquake_list.append(earthquake_data_copy)
          
              # 建立 DataFrame
              df = pd.DataFrame(earthquake_list)
          
              # 資料清理
              # 1. 轉換 OriginTime 為 datetime
              df['OriginTime'] = pd.to_datetime(df['OriginTime'])
          
              # 2. 轉換數值欄位為數值類型
              numeric_cols = ['FocalDepth', 'EpicenterLatitude', 'EpicenterLongitude', 'MagnitudeValue',
                              'pga_EWComponent', 'pga_NSComponent', 'pga_VComponent', 'pga_IntScaleValue',
                              'pgv_EWComponent', 'pgv_NSComponent', 'pgv_VComponent', 'pgv_IntScaleValue',
                              'BackAzimuth','EpicenterDistance','StationLatitude','StationLongitude'
                             ]
          
              for col in numeric_cols:
                  if col in df.columns:
                      df[col] = pd.to_numeric(df[col], errors='coerce')
          
              # 3. 處理缺失值
              for col in numeric_cols:
                  if col in df.columns:
                      df[col].fillna(df[col].mean(), inplace=True)
              for col in df.select_dtypes(include=['object']).columns:
                  df[col].fillna(df[col].mode()[0], inplace=True)
          
              # 統計分析
              # 1. 平均地震規模
              avg_magnitude = df['MagnitudeValue'].mean()
          
              # 2. 最大震度的地區
              max_intensity_area = df.groupby('AreaIntensity')['EarthquakeNo'].count().idxmax()
          
              # 3. 每個縣市的地震次數
              earthquake_count_per_county = df['CountyName'].value_counts()
          
              # 4. 地震總數
              total_earthquake_num = len(df.drop_duplicates(subset="EarthquakeNo"))
          
              #5. 最大PGA 的測站
              if 'pga_IntScaleValue' in df.columns:
                max_pga_station = df.loc[df['pga_IntScaleValue'].idxmax()]
              else:
                max_pga_station = None
          
              #6. 最大PGV的測站
              if 'pgv_IntScaleValue' in df.columns:
                  max_pgv_station = df.loc[df['pgv_IntScaleValue'].idxmax()]
              else:
                  max_pgv_station = None
          
              return {
                  'cleaned_df': df,
                  'average_magnitude': avg_magnitude,
                  'max_intensity_area': max_intensity_area,
                  'earthquake_count_per_county': earthquake_count_per_county,
                  'total_earthquake_num':total_earthquake_num,
                  'max_pga_station':max_pga_station,
                  'max_pgv_station':max_pgv_station,
              }
          
          # 範例使用
          filepath = 'api_earthquake.json'
          results = process_earthquake_data(filepath)
          
          if results:
              print("清理後的 DataFrame:")
              print(results['cleaned_df'])
              print("\n統計結果:")
              print(f"平均地震規模:{results['average_magnitude']:.2f}")
              print(f"最大震度地區:{results['max_intensity_area']}")
              print(f"每個縣市的地震次數:\n{results['earthquake_count_per_county']}")
              print(f"地震總數(獨立編號):{results['total_earthquake_num']}")
              if results['max_pga_station'] is not None:
                print(f"\n最大 PGA 的測站:")
                print(results['max_pga_station'])
              if results['max_pgv_station'] is not None:
                print(f"\n最大 PGV 的測站:")
                print(results['max_pgv_station'])
          

          1. 導入函式庫

          import json
          import pandas as pd
          
          • import json: 導入 Python 的 json 模組,用於處理 JSON (JavaScript Object Notation) 格式的資料。JSON 是一種輕量級的資料交換格式,常用于 Web API 數據傳輸。
          • import pandas as pd: 導入 pandas 函式庫並簡稱為 pdpandas 是一個強大的資料分析函式庫,提供 DataFrame 資料結構,便於進行資料清理、轉換與分析。

          2. 定義 process_earthquake_data 函式

          def process_earthquake_data(filepath):
              """
              處理地震資料 JSON 檔案,進行資料清理和統計。
          
              Args:
                  filepath: JSON 檔案路徑。
          
              Returns:
                  一個字典,包含清理後的 DataFrame 和一些統計結果。
              """
              # ... 程式碼 ...
          
          • def process_earthquake_data(filepath):: 定義名為 process_earthquake_data 的函式,接受 filepath 參數,代表地震資料 JSON 檔案的路徑。
          • """...""": 函式的docstring,用於說明函式功能、參數及回傳值,提升程式碼可讀性與維護性。
            • Args:: 說明函式接受的參數,filepath 為 JSON 檔案路徑。
            • Returns:: 說明函式回傳值,為一字典,包含清理後的 DataFrame 及統計結果。

          3. 檔案讀取與錯誤處理

              try:
                  with open(filepath, 'r', encoding='utf-8') as f:
                      data = json.load(f)
              except FileNotFoundError:
                  print(f"錯誤:找不到檔案 {filepath}")
                  return None
              except json.JSONDecodeError:
                  print(f"錯誤:{filepath} 的 JSON 格式無效")
                  return None
          
          • try...except: Python 的錯誤處理機制try 區塊內程式碼會先執行,若發生錯誤,則會跳至 except 區塊執行相應的錯誤處理。
          • with open(filepath, 'r', encoding='utf-8') as f:: 使用 with open() 語法安全地開啟檔案。
            • filepath: 檔案路徑。
            • 'r': 以讀取模式開啟檔案。
            • encoding='utf-8': 使用 UTF-8 編碼讀取檔案,確保能正確處理包含中文的 JSON 檔案。
            • as f: 將檔案物件賦值給變數 fwith 語法確保檔案使用完畢後自動關閉,即使發生錯誤亦然。
          • data = json.load(f): 使用 json.load(f) 將檔案 f 中的 JSON 資料讀取data 變數中。
          • except FileNotFoundError:: 捕捉 FileNotFoundError 錯誤,即檔案不存在。若發生此錯誤,印出錯誤訊息並回傳 None
          • except json.JSONDecodeError:: 捕捉 json.JSONDecodeError 錯誤,即 JSON 格式無效。若發生此錯誤,印出錯誤訊息並回傳 None

          4. 資料提取與轉換

              # 提取地震資料
              earthquake_list = []
              for earthquake in data['records']['Earthquake']:
                  earthquake_data = {
                      'EarthquakeNo': earthquake['EarthquakeNo'],
                      'ReportType': earthquake['ReportType'],
                      'ReportColor': earthquake['ReportColor'],
                      'ReportContent': earthquake['ReportContent'],
                      'ReportImageURI': earthquake['ReportImageURI'],
                      'ReportRemark': earthquake['ReportRemark'],
                      'Web': earthquake['Web'],
                      'ShakemapImageURI': earthquake['ShakemapImageURI'],
                      'OriginTime': earthquake['EarthquakeInfo']['OriginTime'],
                      'Source': earthquake['EarthquakeInfo']['Source'],
                      'FocalDepth': earthquake['EarthquakeInfo']['FocalDepth'],
                      'Location': earthquake['EarthquakeInfo']['Epicenter']['Location'],
                      'EpicenterLatitude': earthquake['EarthquakeInfo']['Epicenter']['EpicenterLatitude'],
                      'EpicenterLongitude': earthquake['EarthquakeInfo']['Epicenter']['EpicenterLongitude'],
                      'MagnitudeType': earthquake['EarthquakeInfo']['EarthquakeMagnitude']['MagnitudeType'],
                      'MagnitudeValue': earthquake['EarthquakeInfo']['EarthquakeMagnitude']['MagnitudeValue'],
                  }
          
                  # 展開 Intensity 資料
                  for area in earthquake['Intensity']['ShakingArea']:
                      for station in area.get("EqStation", []):
                          earthquake_data_copy = earthquake_data.copy()
                          earthquake_data_copy['AreaDesc'] = area['AreaDesc']
                          earthquake_data_copy['CountyName'] = area['CountyName']
                          earthquake_data_copy['AreaIntensity'] = area['AreaIntensity']
                          earthquake_data_copy['StationName'] = station.get('StationName')
                          earthquake_data_copy['StationID'] = station.get('StationID')
                          earthquake_data_copy['SeismicIntensity'] = station.get('SeismicIntensity')
                          earthquake_data_copy['WaveImageURI'] = station.get('WaveImageURI')
                          earthquake_data_copy['BackAzimuth'] = station.get('BackAzimuth')
                          earthquake_data_copy['EpicenterDistance'] = station.get('EpicenterDistance')
                          earthquake_data_copy['StationLatitude'] = station.get('StationLatitude')
                          earthquake_data_copy['StationLongitude'] = station.get('StationLongitude')
          
                          if 'pga' in station:
                              earthquake_data_copy['pga_EWComponent'] = station['pga'].get('EWComponent')
                              earthquake_data_copy['pga_NSComponent'] = station['pga'].get('NSComponent')
                              earthquake_data_copy['pga_VComponent'] = station['pga'].get('VComponent')
                              earthquake_data_copy['pga_IntScaleValue'] = station['pga'].get('IntScaleValue')
                              earthquake_data_copy['pga_unit'] = station['pga'].get('unit')
                          if 'pgv' in station:
                              earthquake_data_copy['pgv_EWComponent'] = station['pgv'].get('EWComponent')
                              earthquake_data_copy['pgv_NSComponent'] = station['pgv'].get('NSComponent')
                              earthquake_data_copy['pgv_VComponent'] = station['pgv'].get('VComponent')
                              earthquake_data_copy['pgv_IntScaleValue'] = station['pgv'].get('IntScaleValue')
                              earthquake_data_copy['pgv_unit'] = station['pgv'].get('unit')
                          earthquake_list.append(earthquake_data_copy)
          
                      if len(area.get("EqStation", [])) == 0:
                          earthquake_data_copy = earthquake_data.copy()
                          earthquake_data_copy['AreaDesc'] = area['AreaDesc']
                          earthquake_data_copy['CountyName'] = area['CountyName']
                          earthquake_data_copy['AreaIntensity'] = area['AreaIntensity']
                          earthquake_list.append(earthquake_data_copy)
          
          • earthquake_list = []: 建立空列表 earthquake_list,用於儲存提取出的地震資料。
          • for earthquake in data['records']['Earthquake']:: 迴圈遍歷 data['records']['Earthquake'] 中的每個地震資料。
          • earthquake_data = {...}: 建立字典 earthquake_data,儲存單個地震的基本資訊。
            • 字典的 key 為欄位名稱,value 從 JSON 資料中提取。例如 'EarthquakeNo': earthquake['EarthquakeNo'] 將 JSON 資料中 earthquake['EarthquakeNo'] 的值存入字典,鍵為 'EarthquakeNo'
          • for area in earthquake['Intensity']['ShakingArea']:: 迴圈遍歷每個地震的 Intensity 中的 ShakingAreaShakingArea 包含特定區域的震度資訊。
          • for station in area.get("EqStation", []):: 迴圈遍歷每個 ShakingArea 中的 EqStation (地震站)。使用 .get("EqStation", [])EqStation 不存在時提供空列表,避免程式錯誤。
          • earthquake_data_copy = earthquake_data.copy(): 複製原始地震資料至 earthquake_data_copy,以便在不影響原始資料下,新增或修改站點特定資訊。
          • earthquake_data_copy['AreaDesc'] = area['AreaDesc']earthquake_data_copy['AreaIntensity'] = area['AreaIntensity']: 將區域描述、縣市名稱及區域震度等資訊加入 earthquake_data_copy 字典。
          • earthquake_data_copy['StationName'] = station.get('StationName')earthquake_data_copy['SeismicIntensity'] = station.get('SeismicIntensity'): 從 station 字典提取站點名稱、ID 及地震強度等資訊,加入 earthquake_data_copy 字典。使用 .get() 方法安全處理可能不存在的鍵。
          • if 'pga' in station:if 'pgv' in station:: 檢查 station 字典是否存在 'pga' (峰值地面加速度) 或 'pgv' (峰值地面速度) 資訊。
          • earthquake_data_copy['pga_EWComponent'] = station['pga'].get('EWComponent')earthquake_data_copy['pga_unit'] = station['pga'].get('unit'): 若存在 'pga' 資訊,提取東-西、南-北、垂直方向分量、強度比例值及單位,並加入 earthquake_data_copy 字典。使用 .get() 處理可能缺失的鍵。
          • earthquake_data_copy['pgv_EWComponent'] = station['pgv'].get('EWComponent')earthquake_data_copy['pgv_unit'] = station['pgv'].get('unit'): 若存在 'pgv' 資訊,提取東-西、南-北、垂直方向分量、強度比例值及單位,並加入 earthquake_data_copy 字典。
          • earthquake_list.append(earthquake_data_copy): 將包含地震與站點特定資訊的 earthquake_data_copy 字典加入 earthquake_list 列表。
          • if len(area.get("EqStation", [])) == 0:: 檢查 area 中是否存地震站 (EqStation)。若不存在 (長度為 0),執行後續程式碼,處理區域可能缺少地震站資料情況,仍將區域描述、縣市名稱、區域震度等資訊加入 earthquake_list,即使缺乏具體站點資料。
          • earthquake_list.append(earthquake_data_copy): 將包含地震與區域資訊的 earthquake_data_copy 字典加入 earthquake_list 列表。

          5. 建立 DataFrame

              # 建立 DataFrame
              df = pd.DataFrame(earthquake_list)
          
          • df = pd.DataFrame(earthquake_list): 使用 pandas.DataFrame() 函式將 earthquake_list 轉換為 DataFrameDataFrame 是一種表格型資料結構,方便後續資料清理與分析。

          6. 資料清理

              # 資料清理
              # 1. 轉換 OriginTime 為 datetime
              df['OriginTime'] = pd.to_datetime(df['OriginTime'])
          
              # 2. 轉換數值欄位為數值類型
              numeric_cols = ['FocalDepth', 'EpicenterLatitude', 'EpicenterLongitude', 'MagnitudeValue',
                              'pga_EWComponent', 'pga_NSComponent', 'pga_VComponent', 'pga_IntScaleValue',
                              'pgv_EWComponent', 'pgv_NSComponent', 'pgv_VComponent', 'pgv_IntScaleValue',
                              'BackAzimuth','EpicenterDistance','StationLatitude','StationLongitude'
                             ]
          
              for col in numeric_cols:
                  if col in df.columns:
                      df[col] = pd.to_numeric(df[col], errors='coerce')
          
              # 3. 處理缺失值
              for col in numeric_cols:
                  if col in df.columns:
                      df[col].fillna(df[col].mean(), inplace=True)
              for col in df.select_dtypes(include=['object']).columns:
                  df[col].fillna(df[col].mode()[0], inplace=True)
          
          • df['OriginTime'] = pd.to_datetime(df['OriginTime']): 將 OriginTime 欄位轉換為 datetime 格式。 pd.to_datetime() 函式可將字串或數字轉為 datetime 格式,便於時間序列分析。
          • numeric_cols = [...]: 定義列表 numeric_cols,包含需轉換為數值類型的欄位名稱。
          • for col in numeric_cols:: 迴圈遍歷 numeric_cols 中的每個欄位名稱。
            • if col in df.columns:: 檢查 DataFrame 是否存在該欄位。
            • df[col] = pd.to_numeric(df[col], errors='coerce'): 使用 pd.to_numeric() 函式將欄位轉為數值類型。errors='coerce' 設定轉換失敗時設為 NaN (缺失值)。
          • for col in numeric_cols:: 迴圈遍歷 numeric_cols 中的每個欄位名稱。
            • if col in df.columns:: 檢查 DataFrame 是否存在該欄位。
            • df[col].fillna(df[col].mean(), inplace=True): 使用平均值填補數值欄位的缺失值 (NaN)。fillna() 函式用於填補缺失值,df[col].mean() 計算欄位平均值, inplace=True 直接修改 DataFrame
          • for col in df.select_dtypes(include=['object']).columns:: 迴圈遍歷 DataFrame 中所有字串類型的欄位。
            • df[col].fillna(df[col].mode()[0], inplace=True): 使用眾數填補字串類型欄位的缺失值。 df[col].mode()[0] 計算欄位眾數,inplace=True 直接修改 DataFrame

          7. 統計分析

              # 統計分析
              # 1. 平均地震規模
              avg_magnitude = df['MagnitudeValue'].mean()
          
              # 2. 最大震度的地區
              max_intensity_area = df.groupby('AreaIntensity')['EarthquakeNo'].count().idxmax()
          
              # 3. 每個縣市的地震次數
              earthquake_count_per_county = df['CountyName'].value_counts()
          
              # 4. 地震總數
              total_earthquake_num = len(df.drop_duplicates(subset="EarthquakeNo"))
          
              #5. 最大PGA 的測站
              if 'pga_IntScaleValue' in df.columns:
                max_pga_station = df.loc[df['pga_IntScaleValue'].idxmax()]
              else:
                max_pga_station = None
          
              #6. 最大PGV的測站
              if 'pgv_IntScaleValue' in df.columns:
                  max_pgv_station = df.loc[df['pgv_IntScaleValue'].idxmax()]
              else:
                  max_pgv_station = None
          
          • avg_magnitude = df['MagnitudeValue'].mean(): 計算平均地震規模df['MagnitudeValue'] 選擇 MagnitudeValue 欄位,.mean() 計算平均值。
          • max_intensity_area = df.groupby('AreaIntensity')['EarthquakeNo'].count().idxmax(): 找出最大震度的地區
            • df.groupby('AreaIntensity'): 依 AreaIntensity 欄位分組。
            • ['EarthquakeNo'].count(): 計算每組別中 EarthquakeNo 的數量。
            • .idxmax(): 找出數量最多組別的名稱 (即最大震度地區)。
          • earthquake_count_per_county = df['CountyName'].value_counts(): 統計每個縣市的地震次數df['CountyName'] 選擇 CountyName 欄位,.value_counts() 計算各縣市出現次數。
          • total_earthquake_num = len(df.drop_duplicates(subset="EarthquakeNo")): 計算地震總數 (獨立編號),以 EarthquakeNo 去除重複地震。
            • df.drop_duplicates(subset="EarthquakeNo"): 移除 EarthquakeNo 欄位值重複的列,僅保留首次出現的列。
            • len(...): 計算 DataFrame 列數,即地震總數。
          • if 'pga_IntScaleValue' in df.columns:: 檢查 DataFrame 是否存在 pga_IntScaleValue 欄位。
            • max_pga_station = df.loc[df['pga_IntScaleValue'].idxmax()]: 找出最大 PGA 的測站資訊
              • df['pga_IntScaleValue'].idxmax(): 找出 pga_IntScaleValue 欄位最大值的索引。
              • df.loc[...]: 使用索引選擇 DataFrame 相應列,即最大 PGA 測站資訊。
            • else: max_pga_station = None: 若 DataFramepga_IntScaleValue 欄位,max_pga_station 設為 None
          • if 'pgv_IntScaleValue' in df.columns:: 檢查 DataFrame 是否存在 pgv_IntScaleValue 欄位。
            • max_pgv_station = df.loc[df['pgv_IntScaleValue'].idxmax()]: 找出最大 PGV 的測站資訊
              • df['pgv_IntScaleValue'].idxmax(): 找出 pgv_IntScaleValue 欄位最大值的索引。
              • df.loc[...]: 使用索引選擇 DataFrame 相應列,即最大 PGV 測站資訊。
            • else: max_pgv_station = None: 若 DataFramepgv_IntScaleValue 欄位,max_pgv_station 設為 None

          8. 回傳結果

              return {
                  'cleaned_df': df,
                  'average_magnitude': avg_magnitude,
                  'max_intensity_area': max_intensity_area,
                  'earthquake_count_per_county': earthquake_count_per_county,
                  'total_earthquake_num':total_earthquake_num,
                  'max_pga_station':max_pga_station,
                  'max_pgv_station':max_pgv_station,
              }
          
          • return {...}: 將清理後的 DataFrame 及統計結果以字典形式回傳。字典的 key 為結果名稱,value 為對應值。

          9. 範例使用

          # 範例使用
          filepath = '/Users/aaron/Downloads/api_earthquake.json'
          results = process_earthquake_data(filepath)
          
          if results:
              print("清理後的 DataFrame:")
              print(results['cleaned_df'])
              print("\n統計結果:")
              print(f"平均地震規模:{results['average_magnitude']:.2f}")
              print(f"最大震度地區:{results['max_intensity_area']}")
              print(f"每個縣市的地震次數:\n{results['earthquake_count_per_county']}")
              print(f"地震總數(獨立編號):{results['total_earthquake_num']}")
              if results['max_pga_station'] is not None:
                print(f"\n最大 PGA 的測站:")
                print(results['max_pga_station'])
              if results['max_pgv_station'] is not None:
                print(f"\n最大 PGV 的測站:")
                print(results['max_pgv_station'])
          
          • filepath = '/Users/aaron/Downloads/api_earthquake.json': 設定 JSON 檔案路徑。請確保路徑正確指向您的地震資料 JSON 檔案。
          • results = process_earthquake_data(filepath): 呼叫 process_earthquake_data() 函式處理資料,結果存入 results 變數。
          • if results:: 檢查 results 是否為 None。若非 None,表示資料處理成功,執行後續程式碼印出結果。
          • print("清理後的 DataFrame:") print(results['cleaned_df']): 印出清理後的 DataFrame
          • print("\n統計結果:"): 印出統計結果標題。
          • print(f"平均地震規模:{results['average_magnitude']:.2f}"): 印出平均地震規模f 表示 f-string,用於格式化字串。 :.2f 保留兩位小數。
          • print(f"最大震度地區:{results['max_intensity_area']}"): 印出最大震度地區
          • print(f"每個縣市的地震次數:\n{results['earthquake_count_per_county']}"): 印出每個縣市的地震次數\n 表示換行。
          • print(f"地震總數(獨立編號):{results['total_earthquake_num']}"): 印出地震總數 (獨立編號)
          • if results['max_pga_station'] is not None:: 檢查 results['max_pga_station'] 是否為 None。非 None 表示找到最大 PGA 站點,執行後續程式碼。
            • print(f"\n最大 PGA 的測站:")
            • print(results['max_pga_station']): 印出 最大 PGA 測站資訊
          • if results['max_pgv_station'] is not None:: 檢查 results['max_pgv_station'] 是否為 None。非 None 表示找到最大 PGV 站點,執行後續程式碼。
            • print(f"\n最大 PGV 的測站:")
            • print(results['max_pgv_station']): 印出 最大 PGV 測站資訊

          2025-02-23
        12. 學習資料科學:如何收集與整理資料

          🎓 學習資料科學:如何收集與整理資料

          你正在修一門 資料科學課程,但在「資料收集」這一環節遇到了困難。這裡會以 第一性原理 拆解你的問題,並給出清晰的學習與實作方向。

          我們將探討了多種資料科學應用,涵蓋 開放數據擷取、API 介接、網頁爬蟲、資料處理與儲存技術。以下是摘要整理:

          開放數據來源舉例

          📊 開放數據與 API 介接

          • 金融市場數據:示範如何使用 Yahoo Finance API 擷取黃豆、玉米、小麥等商品的每日交易行情(OHLC & 數量)。
          • 趨勢分析:透過 Google Trends API 追蹤 LLM 領域(如 Qwen、DeepSeek、Claude)的熱門搜尋關鍵字與地區數據。
          • 健康數據:使用 CDC API 獲取全球 Covid-19、流感歷史數據。
          • 電商價格追蹤:串接 Keepa API(Amazon)與 PriceRunner API 追蹤 NVIDIA RTX 顯示卡價格與銷售波動。

          🕵️‍♂️ 網頁爬蟲與自動化

          • 價格追蹤爬蟲:示範如何用 Selenium 爬取 BigGo 上 NVIDIA RTX4090 顯示卡各電商的歷史價格與品牌型號。
          • 資料擷取自動化:整合 Yahoo Finance API + FastAPI + Make.com + Notion,排程擷取並存入 Notion。

          📄 AI 研究與文獻分析

          • 使用 Deep Research 收集 LLM 相關研究,並爬取各作者歷年發表的論文與文獻。
          • ArXiv 文獻翻譯與分析
            • 使用 OpenAI API 識別 ArXiv PDF 文獻
            • 解析並翻譯標題、摘要、發表日期、引用數、關鍵字、作者、模型名稱
            • 透過 Google Scholar API 獲取引用數
            • 使用 LangChain 解析與翻譯大規模 PDF 文本
            • 最終結果存入 SQLite 或 Notion API 以便後續查詢

          這些技術涵蓋 金融、電商、健康、學術研究 等領域,展示如何利用資料科學與 AI 工具來高效擷取、處理與分析數據,進一步實現自動化應用。

          2025-02-23
        13. 學習資料科學:資料清理實戰指南

          資料科學課程大綱

          課程簡介: 本課程旨在深入探討資料科學的基礎工具與應用,從資料處理、資料清理,到API應用、金融資料分析等,逐步帶領學生熟悉如何使用Python工具解決實際的資料科學問題。

          1. NumPy 數據處理與分析基礎

          • 課程目標:了解並掌握NumPy的基礎操作,熟練使用其數組、矩陣處理能力。
          • 內容涵蓋
            • NumPy陣列與Python內建列表的區別
            • 基本數學運算與數組操作
            • 向量化運算與性能優化
            • 高階數學函式與隨機數生成
            • 與Pandas等其他庫的協同工作

          2. Pandas 基本操作與資料清理

          • 課程目標:學習如何使用Pandas進行資料操作,並了解資料清理的重要性。
          • 內容涵蓋
            • DataFrame與Series的基本操作
            • 資料的過濾、選擇與清理
            • 處理缺失資料、重複資料與異常值
            • 資料合併與連接
            • 文字資料的處理與轉換

          3. 日期轉換工具

          • 課程目標:學習如何處理和轉換時間戳記與日期資料。
          • 內容涵蓋
            • 使用Pandas的to_datetime函式轉換日期
            • 日期與時間的格式化與解析
            • 時間序列資料處理與分析
            • 時間區域與時區處理

          4. API 應用-農產品交易行情-以甘藍為例

          • 課程目標:學會如何從API獲取資料並進行分析。
          • 內容涵蓋
            • API概述與使用方式
            • 設計API請求與解析JSON格式回應
            • 以農產品甘藍的交易行情為例,抓取並清理資料
            • 分析與可視化農產品交易趨勢

          5. API 應用-中央氣象局-顯著有感地震報告

          • 課程目標:了解如何從中央氣象局API中提取並分析地震資料。
          • 內容涵蓋
            • API介面介紹與資料提取
            • 地震資料的解析與處理
            • 有感地震報告的分析與可視化

          6. yfinance 金融市場函式庫

          • 課程目標:學習使用yfinance來抓取金融市場資料並進行基本分析。
          • 內容涵蓋
            • 安裝與使用yfinance
            • 股票資料抓取與時間序列分析
            • 市場指標計算(如:移動平均線、相對強弱指標)
            • 分析個別股票或市場指數的表現

          7. 實戰-網路拍賣資料清理

          • 課程目標:通過實戰案例學習如何清理和處理網路拍賣資料。
          • 內容涵蓋
            • 抓取網路拍賣資料(例如:商品名稱、價格、賣家評價等)
            • 資料清理技術:處理缺失值、重複項目、資料轉換等
            • 透過Pandas進行資料篩選與清理
            • 分析拍賣資料,挖掘有價值的市場洞察

          課程總結: 通過本課程的學習,掌握資料處理、API應用、資料清理及基本的資料分析技巧,並能將所學應用於真實的資料科學項目中,為未來的數據分析職業生涯打下堅實的基礎。

          2025-02-23
        14. 學習資料科學:農產品交易資料清理實戰

          1. 導入函式庫 (Import Libraries)

          import requests
          import json
          import pandas as pd