Use uv to create a python project for finance text sentimental analysis

references: https://www.youtube.com/watch?v=EeoCcjPuJwE&list=PLDdSOnH0h1PpCo1novB32KXP5mbpCw-s5&index=19

使用 uv 快速建立財務文字情感分析專案

uv 是一個簡單高效的 Python 專案初始化工具,結合了虛擬環境管理和依賴配置,適合開發者快速啟動專案。在這篇文章中,我將分享如何使用 uv 建立 Financial Text Sentimental Analysis 專案。


什麼是 uv

uv 是一款輕量級工具,專注於:

  • 快速初始化專案:透過一行指令生成清晰的專案結構。

  • 基於 **pyproject.toml**:完全符合 Python 現代化的標準配置。

  • 虛擬環境自動管理:自動為每個專案創建虛擬環境,簡化操作流程。

它適合希望以簡單方式管理專案的開發者,並能提升開發效率。


使用 uv 開始專案

步驟 1:安裝 uv

在 macOS 上,您可以透過 Homebrew 安裝 uv

brew install uv

步驟 2:初始化專案

執行以下指令以初始化專案:

uv init Financial-Text-Sentimental-Analysis

執行後,uv 將生成以下的初始專案結構:

├─ README.md
├─ hello.py
└─ pyproject.toml

步驟 3:配置專案依賴

pyproject.toml 中設定專案所需的依賴:

[project]
name = "financial-text-sentimental-analysis"
version = "0.1.0"
description = "A project to analyze the sentiment of financial text"
readme = "README.md"
requires-python = ">=3.12"
dependencies = [
    "torch",
    "transformers",
    "feedparser",
    "requests",
]

這些依賴分別用於:

Read more

CICD 是什麼?如何透過 CI(持續整合)CD(持續部署) 增加程式多人開發協作效率及安全穩定性?

1. 持續整合(Continuous Integration, CI)

目標:將開發者的代碼頻繁合併到主分支(如 prodmain),並保證代碼的質量和穩定性。

  • 核心過程
    1. 開發者提交代碼到 develop 或其他開發分支。
    2. 觸發測試
      • 自動化工具執行構建和測試(單元測試、靜態代碼分析、Lint 檢查等)。
    3. 反饋結果
      • 測試成功:代碼準備好可以進行合併。
      • 測試失敗:通知開發者修復問題。
    4. 合併代碼
      • 通過測試的代碼可以被手動或自動合併到主分支(如 prodmain)。

簡單說

  • CI 的核心是讓多名開發者的代碼頻繁集成,並確保集成後的代碼仍然穩定。
  • 不一定會部署代碼,重點是驗證代碼的品質。

2. 持續部署(Continuous Deployment, CD)

目標:將通過測試的代碼自動部署到伺服器或生產環境,實現真正的端到端自動化。

  • 核心過程

    1. 觸發部署
      • 通過 CI 驗證的代碼自動進入部署階段。
    2. 部署流程
      • 構建應用程序。
      • 部署應用到測試環境或直接部署到生產環境(根據你的配置)。
    3. 上線驗證
      • 執行最小程度的檢查(如健康檢查)。
      • 確保服務已正確運行。
  • 區分持續交付和持續部署

    • 持續交付:代碼準備好部署,但需要手動按下按鈕完成最後一步。
    • 持續部署:整個過程完全自動化,包括上線。

簡單說

  • 持續部署的目的是讓已通過測試的代碼自動進入伺服器或生產環境。

流程結合範例

以下是一個典型的 CI/CD 流程:

  1. 提交代碼

    • 開發者將代碼提交到 develop 分支。
  2. 持續整合(CI)

    • 構建代碼。
    • 運行單元測試、靜態分析。
    • 通過測試後,代碼被合併到 prod 分支。
  3. 持續部署(CD)

    • 自動構建應用。
    • 自動將代碼部署到測試伺服器進行驗收測試。
    • 如果啟用了持續部署,將代碼自動推送到生產環境。

小結

  • 持續整合(CI)

    • 核心是確保代碼在合併時的質量穩定。
    • 重點在「構建、測試、合併」。
  • 持續部署(CD)

Read more

Python 與 SQL 日期時間轉換處理

在做資料清洗和轉換時,時常會需要進行日期時間的清洗和轉換,用來篩選特定時間的資料或統一格式。

在 Python,可以透過 datetime 物件的 strptime 和 strftime 函數來實現,而在 PostgreSQL 中則可以利用內建的日期函數和格式化工具達成。

本教學將介紹如何分別使用 Python 和 PostgreSQL 處理日期的各種轉換操作,包括今天日期、昨天日期與上個月的格式化處理。


Python 範例

以下使用 datetime 模組來完成日期轉換:

from datetime import datetime, timedelta

# 1. 得到今天日期,格式(yyyymmdd),型態 date
today_date = datetime.today().date()
print("今天日期 (date):", today_date)

# 2. 將今天日期轉為字串
today_str = today_date.strftime('%Y%m%d')
print("今天日期 (字串):", today_str)

# 3. 取得昨天日期,型態 date
yesterday_date = today_date - timedelta(days=1)
print("昨天日期 (date):", yesterday_date)

# 4. 將昨天日期轉為字串
yesterday_str = yesterday_date.strftime('%Y%m%d')
print("昨天日期 (字串):", yesterday_str)

# 5. 取得上個月,格式(yyyymm),型態字串
last_month = (today_date.replace(day=1) - timedelta(days=1)).strftime('%Y%m')
print("上個月 (字串):", last_month)

輸出範例:

今天日期 (date): 2024-12-08
今天日期 (字串): 20241208
昨天日期 (date): 2024-12-07
昨天日期 (字串): 20241207
上個月 (字串): 202411

PostgreSQL 範例

在 PostgreSQL 中,可以使用 SQL 查詢進行類似的日期操作:

Read more

OpenMetadata - logrotate problem

OpenMetadata 會將日誌文件自動存儲到指定的 log 目錄中,但目前無法透過官方提供的 openmetadata.yaml 配置文件直接實現 logrotate 功能。這導致當日誌文件(如 catalog.log)不斷增長時,可能會造成存儲空間壓力和管理困難。

原本考慮利用 Linux 系統內建的 logrotate 工具解決這一問題,但發現一個限制:當 catalog.log 被刪除後,即使重新建立(如通過 touch catalog.log),OpenMetadata 的應用程式無法繼續將日誌寫入新生成的文件。因此,無法使用傳統的 logrotate 方法將 catalog.log 重命名為例如 catalog-{yesterday-date}.log 並重新創建新的日誌文件。

解決方案

為了解決刪除 catalog.log 後無法繼續記錄日誌的問題,採用以下方法:

  1. 將現有的 catalog.log 文件內容複製到備份文件中。

  2. 清空原始 catalog.log 文件,而不是直接刪除。

  3. 壓縮備份文件,並刪除七天以上的舊備份。

以下是具體實現的 Bash 腳本:

#!/bin/bash

# 設定日誌文件路徑
LOG_FILE="/opt/openmetadata/logs/catalog.log"
BACKUP_DIR="/opt/openmetadata/logs"  
TODAY=$(date +%Y-%m-%d)
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)

# 1. 複製當前的 catalog.log 為 catalog-{前一天日期}.log
cp "$LOG_FILE" "$BACKUP_DIR/catalog-$YESTERDAY.log"

# 2. 清空 catalog.log
> "$LOG_FILE"

# 3. 壓縮前一天的 log
gzip "$BACKUP_DIR/catalog-$YESTERDAY.log"

# 4. 刪除七天前的日誌備份
find "$BACKUP_DIR" -name "catalog-*.log.gz" -mtime +7 -exec rm {} \;

腳本說明

  1. 複製日誌文件

Read more