顯示具有 派森學院(Python3) 標籤的文章。 顯示所有文章
顯示具有 派森學院(Python3) 標籤的文章。 顯示所有文章

2022年1月15日 星期六

【python抓爬仔】~~簡單抓取呈現「氣象資料開放平台」資訊

 這篇很簡短~~主要就是紀錄一下如何使用設計完善、方便的「氣象資料開放平台」。

順道整理與介紹一下json的操作及迴圈操作概念。主要還是因為氣象資料實用、常見~相當適合作為練習之用。

這篇python程式內容很簡要,最主要的準備工作其實是:要先去完成「氣象資料開放平台」的會員註冊,並找到所需要的氣象資料API。這樣工作就差不多做完了~~剩下的就是Python的語法操作練習與迴圈概念。

好囉~~先看「氣象資料開放平台」這真是個設計得很完善的開放資料平台,先給個讚👍

程序上~~就是註冊→獲取使用者授權碼→尋找所需資料→設定資料→取得呼叫網址

幾個步驟~~本篇就以如何取得「三十六小時天氣與報資訊」為例進行操作。(平台操作內容就請自行參考下圖進行練習~~就是網站操作而已,就不多做說明了~~打字好累😓)




2021年11月25日 星期四

【簡單玩python】~~opencv(cv2)存取中文檔案發生錯誤的解決方案

 opencv是相當強悍、好用的影像、視覺模組,在python玩樂過程中,經常有他出場的機會!







最近在試著練習使用PyQT5結合cv2做個螢幕截圖及簡易標記工具時,遇到了cv2對於中文檔名檔案的存取會發生錯誤的狀況!

這個問題當然可以說:阿~~那就不要使用中文檔名就好了嘛...

但是本著「無事生非」的精神(呵~~程式設計好玩的地方就在這裡),還是要解決這個問困擾啊!

終於~~沒多大困難的尋求了解決方案如下,做個紀錄,給自己也給其他人參考!

一般情形下,我們會透過 cv2.imread(filename) 來讀取檔案,但若是遇到讀取中文檔名時,就會遇到類似的錯誤訊息如下:


解決「讀取中文檔名」的方法,如下圖。

基本上是改用cv2.imdecode() 的方式呼叫,整體修正方式,寫成個小函式,方便隨時呼叫....


這樣,就可以正常呼叫、顯示中文檔案了!

別忘了,要引入numpy喔!

===================================================

至於「存成中文檔名」的操作~~若是使用一般 cv2.imwrite(filename, image) 則會根本沒有反應,令你以為操作是ok的,實際上根本是沒有反應,檔案也未完成寫入。

「存成中文檔名」的解決方式,如下圖。

基本上是改用,cv2.imencode(ext, image)[1].tofile(filename) 的方式執行即可正常操作。



好囉~~cv2處理中文檔案的存取操作就是這樣囉!

沒啥好掰的了~~收工!

2021年5月10日 星期一

【python抓爬仔】~~簡單抓取政府公開資料(新北市UBike即時資訊)來玩玩

 玩抓取資料可以很技術,也可以很生活啊!

現今愈來愈多的政府及機關公開資料可供民眾及系統設計應用,很多都是與民生相關的實用資訊!而且相關資料內容也益加完善,對於有設計及應用需求的人們真是個福音啊!

使用上也相當簡便,這次就以「新北市公共自行車租賃系統(YouBike)」的公開資料為操作範例,來練習玩玩如何簡便的獲取ubike的資時資訊並加以操作。

有關新北市的相關公開資料可以到以下位置查閱!

https://data.ntpc.gov.tw/


https://data.ntpc.gov.tw/openapi/swagger-ui/index.html?configUrl=%2Fopenapi%2Fswagger%2Fconfig&urls.primaryName=%E6%96%B0%E5%8C%97%E5%B8%82%E6%94%BF%E5%BA%9C%E4%BA%A4%E9%80%9A%E5%B1%80(28)


這次的操作練習主要目標是了解如何擷取網路上的公開資料回來加以整理、篩選出自己想要的資訊,並未多加著墨在其他的應用或呈現方式。

好囉~~一樣直接上程式碼吧.......

import requests

# 設定新北市UBike公開資料連結位置(取用json格式資料)
# 設定擷取資料筆數為700筆(目前新北市共有654個站點),若未設定size則每次預設只截取前30筆站點資料
url = 'https://data.ntpc.gov.tw/api/datasets/71Cxxxxx-A2DF-xxxxx-BEF1-xxxxx5E8A/json?size=700'
r = requests.get(url)
data = r.json()


def transform_format(mday):  # 寫個轉換日期顯示格式小函式
    Y, M, D, h, m, s = mday[:4], mday[4:6], mday[6:8], mday[8:10], mday[10:12], mday[12:14]
    return Y + '/' + M + '/' + D + ' ' + h + ':' + m + ':' + s


print('擷取的資料筆數:',len(data))

ui = 0
for u in range(len(data)):  # 逐筆讀取json資料
    if data[u]['sarea'] == '土城區':    # 判斷是否為「土城區」,屬於土城區的資料才呈現
        ui += 1
        data[u]['mday'] = transform_format(data[u]['mday'])  # 轉化「資料更新時間」顯示格式
        print(data[u])

print("「土城區」共有:",ui,"筆資料!")


程式執行結果截圖如下供參:

2021年5月9日 星期日

【簡單玩python】~~整理python中有關檔案(File)的一些常用操作

 有關檔案(目錄)的操作,在程式設計中是常見的需求。

除了對檔案的存取、寫入等相關操作外,對於檔案的查詢、目錄(資料夾)的管理、操作也是重要的議題

這次就來整理一下,python中對於檔案及資料夾的一些重要操作,方便自己日後複習及應用。

好囉~~一樣直接上程式碼!相關語法及功能,可以參考程式碼中的註記。

import os
import time

print(os.getcwd())  # 獲取當前作用(執行)的目錄路徑

if os.path.exists('mkdir_test'):
    print("資料夾已存在,無須建立!")
else:
    os.mkdir('mkdir_test')     # 在當前目錄中建立新資料夾(若目錄已經存在則會出錯)

os.chdir('mkdir_test')  # 切換至指定的資料夾
print(os.getcwd())
os.chdir('../')  # 切換至指定的資料夾
print(os.getcwd())

# os.listdir()將指定目錄(若未指定則為當前作用中之目錄)中的物件都列出
print("資料夾中共有:", len(os.listdir()),"物件")

for f in os.listdir():
    if os.path.isfile(f):   # 檢查是否為檔案
        f_name, f_ext = os.path.splitext(f)  # 將檔案名稱資訊切割檔名及副檔名(類型)
        f_size = os.path.getsize(f)     # 取得檔案大小資訊
        f_time = time.ctime(os.path.getctime(f))
        print("檔名:", f_name, "| 檔案類型:", f_ext[1:], " | 檔案大小:", f_size, "Bytes | 檔案建立時間:", f_time)

# 檔案開啟模式參考網址:https://docs.python.org/zh-tw/3.6/library/functions.html#open
f = open("test1.txt", "a+", encoding='utf-8')  # 若無該檔案會建立,若有則會開啟並可在檔案末尾加上新的內容
str = "\n" + "Hello,歡迎進入Python世界"
fw = f.write(str)
print("本次寫入", fw, "個字元")
f.close()

f1 = open("test1.txt", "r+", encoding='utf-8')  # 讀取並開啟檔案,可在檔案末尾加上新的內容
print(f1.read())
f1.close()

有興趣及相關需求的朋友可以自行操作、執行,會更加了解相關的運作結果喔!

執行結果,部分截圖供參:



2021年1月24日 星期日

【python抓爬仔】~~小試pandas模組~用pandas簡單完成擷取台銀牌告匯率資料

 之前介紹過:[python抓爬仔]~~輕鬆擷取「台灣銀行即時匯率資料」

使用「twder」這支lib就可以輕鬆抓取台銀的即時牌告匯率資訊。

但這件事情到底是怎麼完成的呢??? 

這次~~練習、利用python中pandas這之強悍的套件,來練習一下自行抓取、分析台銀牌告匯率資料的方式,順道瞭解pandas的相關應用!

首先~~簡單認識一下:「pandas」是 Python 進行資料處理和資料分析一個好用的工具

有興趣可以到這裡去深入認識「pandas」

話說「pandas」有多強悍呢~~光是他的說明文件就有3000多頁....天啊~是要害死誰啊


好~~所以囉,別期望一次就把pandas掌握住...

這次我們主要透過抓取台銀網站中的牌告匯率資料,先玩一下已下的相關操作:

1.用pandas抓取網頁中的表格資料

2.使用pandas格式化抓取的表格資料

3.使用pandas將資料儲存至excel檔案

====================================================

好~~從哪著手起呢??

預備動作~當然先確認你已經裝好pandas這支套件囉

動作:pip install pandas  (應該很熟悉了吧~有裝過pandas會告訴你,沒裝過會幫你安裝pandas)

接著~~

1.先確認去哪裡抓取「台銀的牌告匯率資料」,別跑錯地方了~~~:

https://rate.bot.com.tw/xrt?Lang=zh-TW


2.查看一下,在台銀的網站中,牌告匯率表格是該網頁中第幾個「表格」!這個資訊,有助於等一下在設計程式時,指定(告知)pandas要抓取的資料位置(重要喔)。查看該網頁,我們初步確認「牌告匯率」資料位於該網頁中「第一組」表格的位置。

有了相關上述相關資訊後,就可以開始上程式碼了~~~很簡短的,別擔心

import pandas

# 指定pandas要抓取資料的網址
pds = pandas.read_html("https://rate.bot.com.tw/xrt?Lang=zh-TW")
table = pds[0]      # 解析抓取資料中「第一組」表格資料存放至變數中
table = table.iloc[:, 0:5]      # 重設要使用的表格資料
# table.iloc[:, 0:5]~表示要取用[前四個欄位]的[所有資料]

# table.columns~設定表格的欄位名稱
table.columns = ['幣別', '現金買入', '現金賣出', '即期買入', '即期賣出']
# 將表格中的幣別,以正則表達式(regular expression)重設只讀取中文幣別名稱
table['幣別'] = table['幣別'].str.extract('(\w+)')

# 完工~~列印抓取到的牌告匯率表格化資料
print(table)

# 將上述格式化的表格資料儲存成excel格式檔案
table.to_excel('twder.xlsx')

基本上~~就是這麼簡單、扼要就完成了資料抓取、表格化等相關工作!

【簡單玩python】~~使用 jieba 中文斷詞系統,輕鬆進行文章詞語分析

 假如今天你想要對一段文句或是文章內容進行中文詞語的分析與統計,做出類似「文字雲」的效果,要怎麼做呢?

個人簡略分析如下:

1.首先將文字(章)內容抓取下來

2.分析(分解)其中的詞語

3.統計每個詞語的使用頻率

然後...........思考如何美美的呈現囉

這其中最重要的核心關鍵,就在於如何進行詞語的分析工作,當然這也是分析自然語言的基礎啦~~不過目前先不管博大精深的這塊啦!

好~~所以這次我們就要來練習一下:中文的詞語分析及使用頻率統計

使用python要完成以上目標,有多簡單、便捷呢~~底下就紀錄、分享供參囉!

要完成這次的中文分詞(斷詞)工作,我們可以使用這組強大的中文斷詞工具:jieba(結巴?)

同樣的~~我們先上完整程式碼,再做說明吧!

編輯前,記得先將「jieba」安裝起來:pip install jieba

# 使用 jieba 中文分詞程式
import jieba

# jieba.load_userdict('userdict.txt')   # 可視需要引入自定義詞語庫
text = "Ubuntu是以桌面應用為主的Linux發行版," \
       "相當受到Linux使用者歡迎!" \
       "PyCharm是相當容易上手且功能強大、" \
       "實用的python IDE工具,可安裝在各種主要作業系統平台" \
       "在Ubuntu上也可以在軟體庫中找到免費的PyCharm CE 跟 EDU版本,供下載安裝!" \
       "安裝Ubuntu最新的LTS版本:20.04版後," \
       "即會預設安裝、更新至Python3.8的開發環境,相當方便!" \
       "但一切安裝完成後,便會發現在Ubuntu下" \
       "執行PyCharm編輯python程式時,會發現以下「怪怪」的情形"

w_dic = {}

words = jieba.cut(text)   # 呼叫jieba函式進行斷詞作業

### 逐詞建立 字詞:使用次數 字典檔
for w in words:
    if w not in w_dic:   # 若未出現過的字詞則建立新的字詞並設定使用次數為1
        w_dic[w] = 1
    else:
        w_dic[w] += 1

### 將大於二個字元的字詞及使用次數顯示出來查閱
for w in w_dic:
    if len(w) >= 2:
        print(w, w_dic[w])

程式說明部分,大部分在程式碼中都有做備註說明了!!所以也不用囉嗦佔篇幅~~~

執行結果如下:

以下只針對比較特殊的部分做一些心得分享:

1.由於jieba是由大陸團隊建置的,所以部分詞語可能會不夠精準,若想要(或避免)詞語上的誤判,可以將一些重要或常用的詞語建立在自定義的詞語庫檔案(如:userdict.txt)[記得該檔案須以utf-8編碼儲存]。引用自定義詞語庫方式,如程式碼第四行!(記得去除標記的 # 號喔)

2021年1月20日 星期三

解決Ubuntu下PyCharm無法正常輸入中文的困境

Ubuntu是以桌面應用為主的Linux發行版,相當受到Linux使用者歡迎!

PyCharm是相當容易上手且功能強大、實用的python IDE工具,可安裝在各種主要作業系統平台,在Ubuntu上也可以在軟體庫中找到免費的PyCharm CE 跟 EDU版本,供下載安裝!

安裝Ubuntu最新的LTS版本:20.04版後,即會預設安裝、更新至Python3.8的開發環境,相當方便!

但一切安裝完成後,便會發現在Ubuntu下執行PyCharm編輯python程式時,會發現以下「怪怪」的情形:

1.Ubuntu下「新酷音」的中、英文切換(shift鍵)功能失效

2.中文輸入產生錯亂~~無法正常運作

由於僅發生在PyCharm情形,在其他應用程式中,中文輸入及操作正常!所以可以判斷為是PyCharm的相關設定問題。

查了一些網路上的資訊,各有說法~~一番操作之下,將自己覺得最單純、便捷的方法,紀錄、分享一下,供有興趣、需要的朋友參考囉!

先總結一下:就是去選用、更新PyCharm的「JetBrains Runtime」。

具體的作法及步驟如下:

預備動作:先去下載適用的「JetBrains Runtime(JBR)」檔案:

到下載網址:https://confluence.jetbrains.com/pages/viewpage.action?pageId=173178989

下載適用系統版本的JBRSDK檔,下載下來的是.gz的壓縮檔,無須先行解壓縮


以下皆為PyCharm中的操作及設定:

1.安裝「choose runtime」的plugin:

點選「File」→「Settings...」


進入Piugins頁面,在搜尋框中輸入:choose runtime找到該plugin點選「install」安裝完成後,「ok」退出設定頁面。


2.呼叫「Choose Runtime」選用、並安裝之前下載的JBRSDK壓縮檔:

2021年1月17日 星期日

[python抓爬仔]~~如何一次把整個月份的Google Doodle(Google塗鴉)全部抓取下來

 Google塗鴉(英語:Google Doodle)是Google為慶祝節日、紀念日、成就以及紀念傑出人物等而對Google首頁商標的一種特殊的臨時變更。

這些Google Doodle的設計通常都很吸引人,也相當有創意~很值得收藏細細品嘗啊!

這次,延續之前談的【簡單玩python】~~如何下載指定的網路圖片(資料),進一步結合對Google Doodle網站的分析,來實作如何一次將整個月份的Google Doodle圖檔全部下載下來!

通常要實作這類抓取網站資料的操作,都必須要先「分析」一下,該網站是怎麼將資料(圖檔)傳送到你的瀏覽器讓你看到相關的資訊!

由於每個網站的設計不盡相同,對於資訊的提供方式(或隱藏方式)也都各異,所以很難講說有甚麼一套標準方式,所以也只能且戰且走~~碰碰運氣了啦~~哈!(💪不知道就承認啦~還掰!)

以Google Doodle的展示頁面來看,可以依下列步驟分析:

1.從「Google首頁」點選「好手氣」進入

2.進入前(或進入後點選「重新整理」),開啟進入「開發人員工具」頁面

3.而後點選進入「Network→XHR」頁面,可以觀察到Google Doodle頁面是以json模式,按月份分別將Google Doodle圖檔資訊傳送。


4.傳送資訊的網址就是類似下列的型式(以2020/12月份,繁體中文資料為例):

https://www.google.com/doodles/json/2020/12?hl=zh_TW

而提供的json格式及內容,也可以在「preview」頁面中加以察看


5.其中對我們這次想要處理的:下載Google Doodle圖檔的操作而言,最重要的就是圖檔網址:「url」這個資料了!

【簡單玩python】~~如何下載指定的網路圖片(資料)

 網路資料擷取中,如何大量或抓取網頁(站)中的圖片,是網路資料擷取常被應用的區塊之一。

而要如何「爬取」網站中的圖檔,這部分涉及到:

1.如何解析網站內容,抓取網戰中的圖檔資訊,這部分涉及到網站的讀取及解析工作。

2.解析出網站中的圖檔資訊後,即可以網站圖檔的url進行圖檔的抓取(下載、儲存)

這次呢~~我們依然先從分解動作中,比較單純的網路圖檔的下載及儲存(也就是上述的第2階段)下手!

瞭解了網路圖檔如何下載儲存後,後面再來介紹如何爬取、解析網站中的圖檔資訊(例如:解析google Doodle的歷史圖檔),二者結合起來之後~~就可以驅動程式去自動抓取指定網站中的所有圖檔了!

好~~這次主要就是針對如何將網路資料(本次以下載圖檔為例)下載到本地端為操作目標。

主要的工具就是python中 urllib.request 的 urlretrieve() 函數

有關  urllib.request 的 urlretrieve() 函數  的詳細說明,可以參考以下網站資料:

https://docs.python.org/3/library/urllib.request.html#module-urllib.request

我們這次就是使用 urllib.request 的 urlretrieve() 函數 來下載、儲存指定的網路圖檔,並使用OpenCV來讀取並顯示下載後的圖檔,作為整個操作的設計目標。

這次示範預設要下載的圖檔是google Doodle 網站中的:

https://www.google.com/doodles/first-day-of-school-2021-january-04

圖檔位址:

https://www.google.com/logos/doodles/2021/first-day-of-school-2021-january-04-6753651837108833-2x.png

好囉~~~上程式碼囉:

# 抓取指定網路圖片的方法
from urllib.request import urlretrieve
import cv2

# 網路圖片url
img_url = 'https://www.google.com/logos/doodles/2021/first-day-of-school-2021-january-04-6753651837108833-2x.png'
fpath = "imgs/"+img_url.split("/")[-1]      # 設定儲存位置並以網路圖檔名稱為儲存檔名
urlretrieve(img_url, fpath)     # 將遠端(網路)資料下載到本地

r_img = cv2.imread(fpath)   # cv2讀取下載的圖檔
cv2.imshow("Net ImageUrl", r_img)   # 以cv2呈現讀取的圖檔

cv2.waitKey(0)
cv2.destroyAllWindows()

程式執行後,就可以看到呈現下載的圖檔視窗,並在指定的路徑中看到下載的圖檔囉!

2021年1月14日 星期四

【簡單玩python】~~使用「dlib」讓python簡單、快速完成人臉辨識

 人臉辨識一直是號稱AI應用的熱門(入門)議題~~尤其是幾年前微軟的用照片辨識年紀的推波助瀾下,大家更是樂此不疲~~呵!

既然如此~~那就也玩玩看如何用python來達成人臉辨識及標記的目標吧!

其實這塊之前就結合OpenCV跟dlib這組套件,並串接雲端微軟的年齡、情緒辨識技術,一起玩過整套的~~不過之前沒有記錄下來,時間久了~~也容易忘掉,所以,這次就納入自己整理、分享的議題之一!只是一開始,還是一樣~~先拆解從簡單的應用入手介紹,後續再依序加入其他整合性的應用!

要達成人臉辨識的目標,我們可以借助「dlib」這支相當成熟、易用的套件,結合OpenCV來著手設計!

首先在Windows系統上,要安裝「dlib」套件時,為避免缺乏CMAKE導致安裝失敗的窘境,建議安裝時直接指定「dlib」套件版本

安裝「dlib」:pip install dlib==19.8.1(個人在win10上可正常安裝無誤)

當然別忘了安裝OpenCV這支影像視覺處理的強大套件:

pip install opencv-python

安裝完成後,就可以開始進行程式設計的部分了~~~

好囉~~又到了直接上程式碼的步驟了:

import dlib
import cv2

# 讀取照片檔
img = cv2.imread('imgs/faceo8.jpg')

# 呼叫 dlib 人臉偵測器
fd = dlib.get_frontal_face_detector()

# 偵測圖檔上的人臉資訊
fs = fd(img, 0)
print(f"偵測到{len(fs)}組人臉資訊")

# 將偵測結果以序列方式取出
for i, f in enumerate(fs):
    x1 = f.left()
    y1 = f.top()
    x2 = f.right()
    y2 = f.bottom()

    # 以上列四點數據,繪製人臉區域綠色矩形框
    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)

# 顯示結果
cv2.imshow("Face", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

相關程式碼的說明,都標註在其中了!

所以也就不必再贅敘了~~~

執行程式結果如下:

其中最重要的當然就是:第8行~呼叫dlib的人臉偵測函式的部分囉!

fd = dlib.get_frontal_face_detector()

好囉~~這次人臉偵測標示的紀錄就到這告一段落了!

dlib還有個相當強悍的人臉68個特徵偵測標示的訓練模型可供應用,後續再紀錄、分享上來囉!

2020年11月22日 星期日

[python抓爬仔]~~抓取指定股票前31天股價資料並使用Matplotlib繪製圖表

 好的視覺化圖表可以讓人迅速掌握資料的特性及重要意涵,是在資料處理中相當重要的一環!

前面分別介紹過台銀即時匯率資料及股票交易資料的抓取操作範例!

也介紹過將資料儲存至sqlite資料庫的方法,當資料日積月累的儲存一段時間後,也就可以進行資料的分析及圖表繪製工作了!

這次我們延續之前台灣股票套件(twstock)的操作,利用其套件進行抓取指定股票(本次操作以「廣達(2382)」為例)前31天的股價資料,並將其資料利用python視覺化圖表工具:Matplotlib,進行圖表繪製操作,作為練習Matplotlib及資料視覺化的入門。

首先確定你已經安裝本次操作所需的套件:twstock, matplotlib

若尚未安裝或不確定,可以透過以下指令進行安裝或檢測:

pip install -U twstock
pip install -U matplotlib

想對Matplotlib有更完整的認識,可以到這裡逛逛



這次的操作練習我們分成二個層次進行操作:

第一階段:我們著重將資料抓取後,迅速繪製出圖表並加以儲存、呈現。

第二階段:我們則進一步,將重點放在圖表的設定操作上,讓圖表呈現更具個性化!

好囉~~現在就先看第一階段目標如何達成囉...........

from matplotlib import pyplot as plt
from twstock import Stock

tw2382 = Stock("2382")  # 設定指定的股票(代號)

x = list(range(-31, 0))     # 產生一組[-31~-1]的列表(list)作為對應
y1 = tw2382.price    # 抓取指定股票前31天收盤價
y2 = tw2382.high    # 抓取指定股票前31天最高價
y3 = tw2382.low     # 抓取指定股票前31天最低價

plt.title("廣達(2382)前31天交易價格變動趨勢圖")   # 設定圖表標題
plt.xlabel(f"日期區間")     # 設定x軸標籤
plt.ylabel("價格(元)")        # 設定y軸標籤

plt.plot(x, y1)     # 繪製第一組數線
plt.plot(x, y2)
plt.plot(x, y3)

plt.savefig('tw2382_o.png')
plt.show()   # 顯示圖表

執行結果,會將繪製的圖表以檔名:tw2382_o.png儲存於程式目錄下,如下圖所示:(驚不驚喜~~意不意外...簡單吧?!呵~~)

基本上,這樣就可以完成將資料視覺化的初步工作!

在第一階段中~~你唯一可能遇到的問題,就是中文無法正常顯示(變成亂碼)的狀況,這問題我在之前就有先描述談論過了,有中文無法正常顯示困擾的請看這裡參考!

假如你已經滿意以上的結果,就可以打完收工~~吃飯睡覺去了!

========== ******************* ============

若是你跟我一樣有點「龜毛」~~想要對圖表進行一些個人化的設定工作,那就歡迎繼續看下去~~~

第二階段:我們會進一步設定包括~~標題格式、X,Y軸標籤設定、折線線條設定、圖例等相關操作設定。

2020年11月19日 星期四

[python抓爬仔]~~輕鬆抓系列之「輕鬆獲取台灣股票交易資訊」

 之前介紹過如何輕鬆抓取台銀即時匯率資料,可以想像如果有個好用的套件,可以讓資料抓取這件事輕鬆許多啊~~~!

這次呢~~我們延續簡單學、輕鬆用的精神,為大家隆重介紹~~獲取台灣股票交易資訊的好工具:「twstock」套件!

這個套件~可以讓我們輕鬆獲取各項股票交易的歷史資料、股票即時交易資訊及相關交易判斷訊息!是個想要試著認識股票交易的好工具!

大家可以到這裡觀看及瞭解twstock的相關資訊及應用技巧!

那我們這邊當然就不會把所有的操作走一遍~~沒必要!

這裡呢~~我們主要是透過以下範例來認識twstock這個好用的套件外,也是透過這個套件的操作,來進一步認識有關資料擷取後的字典檔,及其相關操作!

好囉~~一樣照慣例,直接上程式碼:

# 先安裝twstock套件: pip install twstock
import twstock

# ========================================
# 四大買賣點判斷指數函數應用
stock_sid = twstock.Stock('2382')
b4p = twstock.BestFourPoint(stock_sid)
print("數據四大買賣點判斷報告:")
print(f"是否為四大買點:{b4p.best_four_point_to_buy()}")
print(f"是否為四大賣點:{b4p.best_four_point_to_sell()}")
print(f"指數綜合判斷:{b4p.best_four_point()}")

# ======= 取得單一股票之即時交易資訊 =======
stock = twstock.realtime.get('2382')
print("獲取資料類型:" + str(type(stock)))
# stock字典檔輸出方式設定範例(詳細內容可參考第28行輸出內容)
print(f"=====以下為[{stock['info']['name']}]即時交易資訊=====")
print(f"資料取得時間:{stock['info']['time']}")
print(f"股票代號:{stock['info']['code']}")
print(f"成交張數:{stock['realtime']['accumulate_trade_volume']}")
print(f"開盤價:{stock['realtime']['open']}")
print(f"最高價:{stock['realtime']['high']}")
print(f"最低價:{stock['realtime']['low']}")
print(f"最新一筆交易價:{stock['realtime']['latest_trade_price']}")
print(f"最新一筆交易張數:{stock['realtime']['trade_volume']}")

# ======= 取得多支股票之即時交易資訊 =======
stock2 = twstock.realtime.get(['2382', '1216'])
print(f"\n=====多筆股票獲取之資料格式=====\n{stock2}")

程式運行結果:

其中多筆股票獲取之字典檔(dict)資料格式部分,由於資料長度過長,整理如下供參:

2020年11月15日 星期日

[python抓爬仔]~~將抓取的資料存入sqlite資料庫

 前面介紹過如何使用twder模組抓取台銀即時匯率資料的操作

但光是抓取資料來呈現,對於網路資料的擷取實在是可惜了~~若是能將資料儲存下來,作為後續資料分析、追蹤之用,那才是資料抓取之重點啊!

那麼~~抓取回來的資料要如何儲存?存在哪裡呢?

這個問題~~見仁見智啦~~你要簡單儲存在一個文字檔(*.txt)可以嗎?可以啊.....;儲存在MySQL資料庫咧~~很好啊....,端看你準備怎麼用、如何用、好不好用這些資料而定!你自己用的開心、滿足自己所需最重要!

這次,為了方便應用~使用了python安裝時即內建的sqlite資料庫(我自己是習慣使用MySQL啦),作為資料擷取儲存的工具!著眼點就是:內建~~無須在涉及資料庫的安裝、設定...等等!

OK~~這次目標是:

一、擷取台銀指定幣別(日幣)即時匯率資料(前面介紹過請自行參考)

二、使用pandas模組將擷取的資料格式化

三、使用sqlite3配合pandas進行sqlite指定的資料庫-資料表的讀寫操作

好囉~~基本上也是直接看程式碼即可~~~上吧...程式馬(呵!~無聊)

# 先確認已安裝所需之模組
import twder
import sqlite3
import pandas as pd

n_der = twder.now('JPY')   # 擷取目前指定幣別(日幣)報價
tc = ["資料時間",  "現金買入",  "現金賣出",  "即期買入", "即期賣出"]    # 設定一組資料表欄位之列表
t_data = []     # 設定一組空列表(list)做為儲放資料集之用
t_data.append(n_der)    # 將查詢結果儲存至資料庫之資料列表(list)

t_df = pd.DataFrame(t_data, columns=tc)    # 組合為pandas 之 DataFrame

with sqlite3.connect('twder_demo.sqlite') as db:        #連結sqlite之twder_demo.sqlite資料庫
    t_df.to_sql('twder_demo', con=db, if_exists='append')     # 使用pandas to_sql將資料集(t_df)寫入資料表:twder_demo
    print("=======資料寫入完成=======")
    # 使用pandas read_sql_query讀取資料表內容並格式化
    read_df = pd.read_sql_query('select * from twder_demo', con=db)    

print(read_df)
# =======使用iloc索引選擇輸出內容
print(read_df.iloc[:, 1:])

執行結果如下:

簡單補充說明:

2020年11月13日 星期五

[python抓爬仔]~~輕鬆擷取「台灣銀行即時匯率資料」

 前面介紹過分析網頁來獲取資料的操作。

先再來看看python另一個令人喜愛、歡迎的特質:大量優質的外掛模組,可供使用!

這次就先帶來~~如何使用「台灣銀行即時匯率資料」模組,無痛抓取台銀即時匯率資料

首先當然是先安裝「台灣銀行即時匯率資料」模組:pip install twder

「台灣銀行即時匯率資料」相關資訊,可到這裡參考

在這次的範例中~~你將發現透過良好的外掛模組,可以讓目標如此輕易達成.....!(程式技術控表示~~我不同意!!~呵)

好囉~~這次內容簡單到廢話都不知道怎麼掰了....直接上程式碼:

# 安裝台灣銀行即時匯率查詢模組:pip install twder
import twder

n_derall = twder.now_all()   # 擷取目前所有幣別報價
n_der = twder.now('JPY')   # 擷取目前指定幣別(日幣)報價

print(n_derall)   # 輸出觀察「所有幣別報價」擷取結果
print(n_der)    # 輸出觀察「指定幣別報價」擷取結果
print(f"美金(USD)即時匯率報價:{n_derall['USD']}")   # 從所有報價中提取特定幣別報價資料

# =========格式化輸出資料============ #

n_title = ["資料擷取時間:",  "現金買入:",  "現金賣出:",  "即期買入:", "即期賣出:"]    # 設定標題的list供格式化輸出對應之用

for n in range(len(n_der)):
    r1 = n_title[n]+str(n_der[n])
    print(r1)

for n in range(len(n_derall['USD'])):
    r2 = n_title[n]+str(n_derall['USD'][n])
    print(r2)

輸出成果如下圖:

重點提示:

2020年11月8日 星期日

[python抓爬仔]~~python BS4初體驗(抓取udn熱門新聞)

 python的確是個相當好玩、實用的工具!快又有效的特質讓他在程式語言的喜好度迅速攀升。

不管是小酌或大宴兩相宜啊!網路資料的擷取或是所謂的爬蟲也是個有趣且實用的議題,值得開個「抓爬仔」專區(呵~~ ^^|||)來記錄一下學習歷程。

這次呢~~就簡單先以安裝這支著名的Beautiful Soup 4(bs4)模組,並簡單看看如何應用在網路新聞的擷取應用上。

認識更多關於Beautiful Soup 4(bs4)的知識

本次學習目標~~:

一、如何將目標網站(以聯合新聞網(UDN)為例)內容擷取下來。

二、分析擷取的網站內容,分析並條列出我們所需的內容(本次以條析熱門新聞標題及網址為例)。

首先~~由於bs4並非python安裝的標準程式庫,所以必須要先安裝bs4,而後再進行目標網站的擷取、分析與整理、輸出工作,大致上可分成以下步驟進行:

step1.安裝Beautiful Soup 4(bs4)pip install beautifulsoup4

step2.在程式中引入bs4模組 from bs4 import BeautifulSoup

step3.應用requests模組引入並擷取目標網站內容: requests.get('目標網站網址')

step4.整理、解析目標網站擷取之網頁內容

BeautifulSoup(擷取的網頁內容, 'html.parser')

soup.find_all('查找的html Tag(標籤)')

step5.整理並輸出解析結果

大致上就是這樣啦~~~(但非絕對喔~程式存乎一心啊!)

===========================================================

好~~基本的心得介紹完,直接上這次的練習程式碼:

2020年10月31日 星期六

【簡單玩python】~~如何將python程式打包成exe執行檔

 介紹了一些python及pygame的學習心得,但有個小問題~那就是:如何將寫好的小程式或遊戲分享給其他未安裝python環境的朋友使用呢?

首先要先認識一下,當你使用python或pygame編寫了一些程式或遊戲時,一般而言你的這些程式只能在具備python的環境下去執行,若是你的程式中使用了一些非標準安裝具備的模組那你還得確認執行的環境中必須具備這些(或是先安裝)模組,才能確保程式能夠順暢正確的執行。在這樣的條件下,你所編寫的程式或遊戲,通常就只能自己玩得開心了,而很難與他人分享成果!

所以囉~~若是想將成果便利的讓其他未安裝python環境的朋友能夠正常的執行、操作,就必須要先克服執行環境這一點,所以如何將程式中所需要的python執行環境及所需模組打包成一支可以獨立執行的執行檔,就成為想將程式或遊戲分享給他人之前必須要學會的一環。

這次就紀錄、分享一下,如何將python寫好的程式或遊戲打包成可以分享、獨立執行(無須安裝python環境)的執行檔(.exe)!

好囉~~廢話說完了,現在就開始談談如何將程式打包成執行檔(for Windows)這件事:

我們這次介紹使用的是:pyinstaller 這支lib

想完整認識pyinstaller這支好用的lib可以到這裡看看

一、首先你必須先安裝pyinstaller:pip install pyinstaller

 若是要升級(原先已安裝舊版):pip install --upgrade pyinstaller


安裝過程會自動檢查相依性,將相關需要的lib自動下載一併安裝,方便!
安裝完成,接著就可以進入「命令提示字元」模式,將目錄切換至python程式所在的目錄

二、開始進行打包程序:pyinstaller -F -w 要打包的程式.py

其中打包的設定參數中:(這是我個人習慣的設定)
-F:表示要將與程式有關的需求整個打包成單一的執行檔
-w:設定程式執行時不要有「命令提示字元」的背景視窗

想多認識一下各種設定參數,可以使用:pyinstaller --help 自行查詢閱讀

2020年10月23日 星期五

pygame玩遊戲系列(10)~在遊戲中偵測是否發生碰撞並進行計分、顯示分數

 前面已經介紹了如何在遊戲中如何隨機出現指定數量的物件,也介紹了遊戲中的碰撞偵測原理及作法,基本上有了這些法寶,已經可以開始玩一些比較像遊戲的設計了!

這次,我們就在上一篇:pygame玩遊戲系列(9)~在遊戲中隨機出現指定數量的物件的程式基礎上,來看看如何改進遊戲中的元素。

此次目標如下:

一、能夠偵測小車是否接到從天而降的禮物(碰撞偵測原理)

二、若小車接到禮物,則加一分並於遊戲視窗中顯示目前得分

為完成上述目標,我們除了應用之前介紹過的經驗外,會多認識一個pygame中顯示文字內容及區塊的操作及相關語法。

好囉~~不囉嗦了!

我們直接在上一篇:pygame玩遊戲系列(9)~在遊戲中隨機出現指定數量的物件的程式碼中加上並加註相關程式碼如下:

首先在原程式碼中的第20行位置,加上統計得分的變數:score = 0 並預設初始分數為0分




接著就是比較關鍵的檢查每個禮物是否與小車發生碰撞狀態(也就是小車是否接到禮物)?

這部分原理,在這裏就不再贅述了,想了解碰撞偵測(建議一定要了解啦)原理的請自行參照之前的文章!

了解碰撞原理後,重點是要檢查「每一個禮物」是否跟小車發生碰撞,所以我們可以考慮將碰撞的偵測行為放進原先檢查禮物狀態及位置的for迴圈中。

2020年10月22日 星期四

pygame玩遊戲系列(9)~在遊戲中隨機出現指定數量的物件

 之前已經介紹過如何在遊戲視窗中隨機出現物件(禮物)並自動落下的操作

但之前因為一些觀念尚未介紹,且考慮到初學者需按部就班了解各個遊戲中(程式)元素的操控及設計核心,所以只設計了產生一組禮物從天而降的設計。

這樣的操作,當然沒有辦法滿足設計遊戲元素的需求,通常遊戲中的元素會有數量及個別「屬性」設定的操作需求,而這也是遊戲設計中最重要、最精采也是最燒腦的核心。

而對於這樣一種既有共同特性(例如:從天而降的禮物),又需要有個別化的「屬性(參數)」或「行為」(例如:降落的速度,顯示的位置...等等),有經驗的設計者自然會想到使用所謂的「物件導向模式」(OOP)中的類別(Class)設計模式,來為每個遊戲中的物件元素進行「屬性」及「行為」的設定。

但是同樣的,我們現階段依然採用「土法煉鋼」方式進行遊戲中物件元素的設計方式進行操作及說明,為的依然是讓學習者及自己能夠更為精確的理解「物件」設計的核心思維及關鍵概念,為日後的「函式(Function)」及Class(類別)學習及操作建立良好的基礎知能。

好囉~~~現在正式進入主題!

本次的目標有二:

一、可以在遊戲中設定出現指定數量的物件(禮物),這次我們預設遊戲視窗中保持有五個從天而降的禮物物件。

二、上述各物件(禮物)會隨機出現在遊戲視窗中,並各自落下。

為了達成以上的目標,我們必須先從前面的各篇文章取思考以下的設計關鍵點:

1.遊戲中的物件(禮物、小車等)是如何藉由(rect)矩形座標物件將圖形繪製(顯示)在視窗中的!

   範例語法:  screen.blit(gift_img, gift_rect)    # 在視窗中的gift_rect座標繪製gift_img圖形

2.如何能夠隨機設定禮物(物件)的矩形座標(rect),讓物件隨機出現在視窗中。

    範例語法: gift_rect.centerx = random.randrange(0, screen_rect.width)

3.如何偵測視窗中的物件數量,並讓這些物件能夠保持在設定的數量並出現在視窗中並落下?

    (也就是保持有五個禮物物件並讓這些禮物自動落下)

    ---關鍵來了~~(個人習慣)若發現有「一批」物件要做同樣的事

    (例如:隨機產生五個禮物的出現位置、五個禮物都要自動落下...等),

    就可以考慮使用串列(list)+for(條件式迴圈)來進行思考及設計。

~~~串列(list)可以將一組物件加以組合,並透過for迴圈進行同樣的行為(動作)設計

好囉~~所以,我們在之前隨機出現單一物件並自動落下的設計基礎上,持續強化程式如下,達成上述的目標及設計理念。

2020年10月20日 星期二

【OnCode大叔簡單玩python】系列~認識一下 for + list + range 的操作

 這次再來練習、整理一下有關串列(list)的一些組合應用及操作

有別於之前單純介紹串列(list)的說明

這次更著重於在程式設計中的操作及應用

好了~~直接上操作、應用的程式碼及相關說明吧!

# for 是一個條件式迴圈的語法
# list 是python中的串列物件,可將一組或數組相關,不相關的物件加以組合成為一組集合物件
# list 是個人認為在python操作中相當重要、實用的工具,建議大家好好認識他、學習應用他
# range 是一組指定數值範圍的物件
# 將 for list range 這三者組合起來,可以在程式設計中發揮相當大的力量及應用面,建議大家好好熟悉、認識一下

# 先來看一個單純的 for + list的操作
list1 = ["python", "kotlin", "node.js", "Go", "C++"]    # 設定一組串列(list)物件
print(list1)

for i in list1:     # 將列表list1中的元素一個一個依序取出,儲存於 i 這個變數中,進行後續操作
    print("你學習的程式語言是:" + i)    # 將列表取出的元素,列印出來

print("="*30)   # 輸出(列印) =符號 30次

# 接著看一下 for range的組合應用
for i in range(5):  # 從0~5(不含5)
    print(i)

print("="*30)

for i in range(1, 5, 2):    # 從 1~5 間隔 2
    print(i)

print("="*30)   # 輸出(列印) =符號 30次

list1_num = len(list1)      # 計算list1列表長度(元素數量)
print("list1列表物件長度(元素數量):", list1_num)  # 觀察、比較一下這二種輸出方式有何差別?
print("list1列表物件長度(元素數量):" + str(list1_num))
# ↑因為list1_num是數字型態,若要使用 + 符號進行文字串接,必須先將數字變數使用str轉換為文字型態

print("="*30)

for i in range(len(list1)):
    print("list1[" + str(i) + "]元素內容:" + list1[i])

print("="*30)

# 在串列末端新增元素
list1.append("Java")
print(list1)

# 移除串列中指定的元素
list1.remove("C++")
print(list1)

串列(list)真的是程式設計中相當實用、好用又重要的物件

上列程式碼結果如下供參:

2020年10月18日 星期日

pygame玩遊戲系列(8)~談談pygame中二個物件是否發生「碰撞」的檢核機制

 前面已經談過一些pygame遊戲中的物件操控及設定的概念

但是遊戲中很基本的一個「碰撞」檢核,一直沒有介紹的~~所以遊戲只能很無聊的動動滑鼠、鍵盤,以及想辦法讓物件自動移動(飄落、上升...)等等,當然更不用談所謂的「計分」、「射擊」等等遊戲元素的設計!

所以囉~~這次就趕緊先來談一下pygame中所謂的是否發生「碰撞」這個概念!

當然,pygame本身就已經有所謂的「(群組)碰撞檢核」模組可供呼叫使用

但是對學習程式本身而言,「知其所以然」個人認為是相當重要的~不然很可能發生你自己寫了些甚麼東西,自己都不知道的窘境(我自己以前就是如此)!以至於想要做一些精進或改寫一些需求或設計時,根本不知從何下手!只有自己對其基本概念有所釐清,才能充分掌握內建模組的設計及設定理念,遇到問題時也才知道如何思考、或精進!

好了~~這次就單純以遊戲視窗中二個物件是否發生碰撞來做簡單的概念說明及操作示範!

所謂的二個物件發生「碰撞」,其實就是檢查二個物件的「區塊(矩形座標物件)」是否發生「重疊」在一起的狀態!

所以要檢核二個物件是否發生「重疊」就是遊戲中二個物件是否發生「碰撞」的核心!

好囉~~那剩下的問題就是:在程式中如何去檢核二個物件是否發生重疊呢?

(大家可以自己先思考看看~~~二個矩形物件是否重疊的條件是甚麼呢?如何寫出一個完整的判斷式呢?)

先參考以下的幾張圖表,在思考看看~不一定要受限圖表上的說明及參數,你也可以用自己的思考模式去創造自己的檢核機制!(但記得一定要從二個物件「前、後、左、右」不同的相對關係去進行多重檢核喔!)




以上~那些是發生重疊(碰撞)的狀態呢?條件是甚麼?