# 效率神器:Python 協同 Gemini,辦公事半功倍(2)
[第二堂課後半部份,hugging face教材](https://hackmd.io/0HcFkeD5T4iQMxQWfYuuHA)
- 從0開始,透過 **政府公開資料csv、json檔案** 抓取天氣預報(外部訊息)
- 結合第一堂課筆記,結合Gemini,生成符合天氣狀況的廣告文案
- 利用Windows內建功能,自動驅動你的本地Pyhton程式碼
>[!Warning]在看此篇教材前
>此篇教材與[第一篇教材](https://hackmd.io/OL9QagF-QkmIYoDhepbgug)有非常緊密的連結,請先閱讀完前篇後再看!
## 政府公開資料
>[!Note]政府資料開放平台
>為各機關於職權範圍內取得或做成,且依法得公開之各類電子**資料**,包含文字、數據、圖片、影像、聲音、詮釋**資料**(metadata)等,以**開放**格式於網路公開,提供個人、學校、團體、企業或**政府**機關等使用者,依其需求連結下載及利用。
在各種網站當中,如果他想要公開收集到的資料,他們都會將資料轉為.csv檔案(逗號區隔檔案),或是.json檔案。
### CSV (Comma-Separated Values)
- ✅ 容易閱讀與編輯:
CSV 本質上是純文字檔案,**可以用任何文字編輯器(如記事本、Excel、Google Sheets)打開與編輯。**
- ✅ 通用性高:
幾乎所有資料庫(如 MySQL、PostgreSQL)和資料處理工具(如 Python 的 pandas、Excel)都能輕鬆匯入與匯出 CSV 格式。
### JSON檔案
- **✅ 結構化與可讀性**:
JSON 使用 **鍵值對(key-value pairs)** 儲存資料,並支援巢狀結構,能夠表達更複雜的資料關係。
>例如,天氣預報的 JSON 格式可能包含「城市 → 日期 → 各時段天氣狀況」的階層結構,這在 CSV 中較難表達。
- **✅ 適合 API 與網頁應用**:
現在已為 Web 開發、API 資料傳輸的標準格式。
>例如,許多政府的公開資料 **API 都會回傳 JSON 格式**,方便開發者直接在程式中解析與使用。
所以從這兩種可見,CSV 和 JSON 是目前最常見的開放資料格式,廣泛應用於商業與開發領域
## 那要如何使用?
### 1.先登入到[Colab範例教材](https://colab.research.google.com/drive/1OehEktVL8sE7_zAc-I8L5_1ywY26ar6W?usp=sharing)畫面當中
登入後,你會看到此畫面。
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/rkRnQbPiyx.png" style="width: 100%; border: 2px solid black; padding: 5px;" />
</div>
我們先將`GEMINI_API_KEY`建立起來,前兩步驟跟(1)教材一樣,點擊執行就可。
當第二步驟執行完後看到 `✅ GEMINI API Key 已成功載入!` 代表已經成功與Gemini連動了!
### 2.開啟政府公開資料網頁,抓取想要分析的資料
我們將下載兩種資料集:
- [PM2.5 日均值(CSV 格式)](https://data.gov.tw/dataset/91090)
- [一般天氣預報 - 新北市(JSON 格式)](https://data.gov.tw/dataset/9222)
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/BkFKe-Dsyg.png" style="width: 100%; border: 2px solid black; padding: 5px;" />
</div>
我們看到公開資料的畫面
a.對著`下載網址 -> CSV按鈕`點擊右鍵後,點擊`複製連結網址`
b.先將此連結隨意貼到Colab中,後續我們會利用網址來讓Python自動從網站下載資料到自身身上。
>[!Note]為何要這樣做,我可以下載檔案後再丟到Colab的Folder中不就好?
>雖然可以手動下載後上傳至 Colab,但若資料會隨時間變動,每次都要手動更新很麻煩。
>透過 Python 直接從網址下載,每次執行時都能重新獲取最新數據,省時又方便!
### 3.將複製好的網址分別貼到Colab中
#### 3-1 CSV檔案
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/BkforZDoke.png" style="width: 70%; border: 2px solid black; padding: 5px;" />
</div>
這樣的程式碼,你可能會很眼熟,這跟(1)教材中讀取Excel檔案的`pd.read_excel`非常像!
沒錯,在 Python 中,使用 pandas 套件處理 CSV 檔案 和 Excel 的單一 Sheet 具有相似性,因為它們都是以表格形式存儲數據,只有前處理(抓取檔案)程式碼不同而已,後續使用如同(1)教材對EXCEL一樣。
總之,只要利用這樣的程式碼,每次驅動,Python就會到此網址下載對應的CSV檔案。
#### 3-2 JSON檔案
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/S1HGeMDsJg.png" style="width: 70%; border: 2px solid black; padding: 5px;" />
</div>
讀取JSON檔案就相對不同,我們需要對其網址做request請求,我們請求成功後,該網址會吐一個指定的JSON檔案,我們將其儲存到變數`JSON_data`當中,每次驅動就會請求一次,則能夠每次取得最新資訊。
那我們要怎麼讀取需要的資訊呢?實際來看一次JSON檔案內部,以`一般天氣預報 - 新北市(JSON 格式)`為例:
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/ryBE-GvsJx.png" style="width: 70%; border: 2px solid black; padding: 5px;" />
</div>
還記得我們說過 **JSON檔案保留了"巢狀結構"敘述法** ,那我們如果要讀取相對應的Key所代表的值,那就要一層一層撥開他。
以上圖為例,如果我想要知道他"甚麼時候發送的",那我們要抓取Key值在
> `"cwaopendata" -> "sent"`
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/r1hvrfwi1x.png" style="width: 70%; border: 2px solid black; padding: 5px;" />
</div>
我們將訪問到的值放到變數`time_sent`當中,則可以看到結果
---
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/rJLU8Mvoye.png" style="width: 100%; border: 2px solid black; padding: 5px;" />
</div>
複雜一點,如果我們想要抓取的資料是"天氣描述",那我們要抓的Key值在
> `"cwaopendata" -> "dataset" -> "parameterSet" -> "parameter" `
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/S1akDfDiye.png" style="width: 100%; border: 2px solid black; padding: 5px;" />
</div>
這樣,我們就能透過"即時更新"的"政府資訊"以讓Gemini判斷
### 4.提取資訊,給Gemini判斷
#### 4-1 提取"JSON天氣預報",以生成"符合天氣的廣告文案"
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/BkZrIwDoJx.png" style="width: 100%; border: 2px solid black; padding: 5px;" />
</div>
跟之前一樣,我們要做的事情就是:
- a.指定我們要哪一個生成式Model
- b.將需要Gemini理解的Prompt準備好(將JSON檔案中的`parameter 天氣描述`放到Prompt當中)
- c.利用變數`response`接住model生成的結果
- d.print出生成的結果
而以上述案例中,我僅在Prompt中提到"請幫我整理",而他的結果與JSON檔案中給予的相似很多。
>[!Important]是時候挑戰一次看看
>我們現在是一間"服飾店",有賣各種衣服、褲子、帽子...等,那我們希望每天根據當天天氣狀況生成廣告詞
>**如果我們想要他生成"符合天氣的廣告文案",應該怎麼做?**
>(提示:(1)中有提到Prompt Engineering,應該要如何下"好的Prompt"?)
#### 4-2 提取"CSV空氣品質",以生成"符合天氣的個人管家"
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/SkstvbujJg.png" style="width: 100%; border: 2px solid black; padding: 5px;" />
</div>
在做這件事情之前,你可能要稍微注意一下,如果你查看此CSV檔案,你可能會被他的資料量嚇到。
他的資料量可到1000 Row左右,但如果我們只需要"與指定日期相同的資料"。
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/Bk0iIzuj1l.png" style="width: 100%; border: 2px solid black; padding: 5px;" />
</div>
這裡的程式相對複雜許多,我們一條一條慢慢講:
- `date.today()` 取得今天的日期,`timedelta(days=1)` 表示一天的時間差,`date.today() - timedelta(days=1)` 就是從今天的日期減去一天,得出昨天的日期。
- `CSV_df["monitordate"]` 這是你的 pandas DataFrame 中的 monitordate 欄位,`pd.to_datetime()` 用來將欄位中的 **字符串或其他日期格式轉換成 datetime 類型。**
`.dt.date` 會把 datetime 類型轉換為純粹的 date 類型,去掉時間部分,只有年、月、日。
這樣子,我們就能夠提取"指定日期"的表個資訊了!
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/BJOUsM_j1g.png" style="width: 100%; border: 2px solid black; padding: 5px;" />
</div>
跟之前一樣,我們要做的事情就是:
- a.指定我們要哪一個生成式Model
- b.將需要Gemini理解的Prompt準備好(將`CSV_df_yesterday`變數中的放到Prompt當中)
- c.利用變數`response`接住model生成的結果
- d.print出生成的結果
而以上述案例中,我僅在Prompt中提到"請幫我整理並以50字回報",而他的結果與CSV檔案中給予的相似很多。
>[!Important]是時候挑戰一次看看
>如果你希望你的model回應風格是"管家"風格,那我應該如何讓他理解資訊的同時,讓他回答風格更動?
>如果我現在除了看一天外,如果我想要比較好幾天的空氣品質,那應該怎麼準備資料?
## Windows環境,自動化腳本執行Python檔案
>[!Warning]
>這份教學僅限用於windows系統下,其他作業系統的使用者,抱歉了!
## 自動化執行--前言
這次教學會用到一些工具跟概念
**BAT 檔案(批處理檔案)是一種腳本文件**,主要用於在 Microsoft Windows 操作系統中自動執行一系列命令。
**工作排程器(Task Scheduler)是一種操作系統工具**,用於在預定時間或特定條件下自動執行程序或腳本。
> Windows 工作排程器是一個內建的工具,用於在 Windows 系統中設定和管理排程任務。它允許用戶定義何時執行某些程序或腳本,並提供了多種觸發條件和執行選項。
## 實際操作一次
>[!Tip]
>這份教學會用到 Colab 檔案 [testing_python_with_auto_execute](https://colab.research.google.com/drive/13fOS-lD5xOCJNnEMI9sONdheHD2Nao3-)
>此python執行功能:
>>當沒有文件的時候,建立一個新的文件.txt檔案
>>如果檔案存在,就在文件裡寫"執行時間"到.txt檔案當中
### 1. 點擊上方連結進到colab,並且選擇下載檔案
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/H1nbdGNT0.png" style="width: 70%; border: 2px solid black; padding: 5px;" />
</div>
### 2. 將其檔案放在自己想要放的地方(本文範例是將其放在桌面上自己創建的一個文件夾當中,如下所演示)
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/BJcA_GVaR.png" style="width: 60%; border: 2px solid black; padding: 5px;" />
</div>
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/B1RktMV6C.png" style="width: 60%; border: 2px solid black; padding: 5px;" />
</div>
>[!Warning]
> 1. 檔案位置非常重要,之後建立腳本檔案的時候會用到
>2. 檔案夾盡量不要打中文字,有時候讀取會出現錯誤
### 3. 下載Python安裝包,這樣電腦才能跑動.py檔案
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/HyYQoMV60.png" style="width: 100%; border: 2px solid black; padding: 5px;" />
</div>
### 4.自動化腳本編寫
- 先建立一個.txt檔案
- 在.txt檔案中寫入兩行程式
```
cd 剛剛建立的檔案夾位置
python 檔案名稱.py
```
以我為例:
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/rJ5E9fV6A.png" style="width: 100%; border: 2px solid black; padding: 5px;" />
</div>
那我會在我的.txt檔案中寫到:
```
cd C:\Users\user\Desktop\自動化
python testing_python_with_auto_execute.py
```
- 將其.txt檔案轉成.bat檔案(轉成腳本檔案)
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/SJ_GjzVaR.png" style="width: 20%; border: 2px solid black; padding: 5px;" />
</div>
當你完成以上任務後,可以點擊.bat看看,如果點擊完後,python如果有創立一個.txt檔案的話,那就是成功了!
### 5.讓電腦自動去跑動.bat檔案
- 打開**工作排程器**(通常windows有內建此功能)
>[!Warning]如果你找不到
>按下 Windows 鍵 + R,輸入`taskschd.msc`,然後按下 Enter 鍵。
- 點擊"建立工作"
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/HyN_szNTR.png" style="width: 100%; border: 2px solid black; padding: 5px;" />
</div>
- 輸入工作名稱(取自己看得懂的敘述)
- 點擊觸發程序,編寫觸發條件(我們設定"每五分鐘就驅動一次")
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/BJd6jG4pR.png" style="width: 100%; border: 2px solid black; padding: 5px;" />
</div>
- 點擊動作,並將剛剛的.bat檔案加到裡面
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/HJExnzVT0.png" style="width: 100%; border: 2px solid black; padding: 5px;" />
</div>
- 按下確定之後,就大功告成啦!!
- 接下來,你可以去看"工作排程器程式庫",就能看到我們新增的指令了!
<div style="text-align: center;">
<img src="https://hackmd.io/_uploads/H1lDhzEpC.png" style="width: 100%; border: 2px solid black; padding: 5px;" />
</div>
## 影片教學版
如果文字看得不夠清楚,可以跟著下方的影片一起做一遍,約5分鐘就能設置完成
{%youtube q8F4yLrZrEA %}