跳到主要內容

發表文章

目前顯示的是 2022的文章

【AI技術新知】 ChatGPT - 與AI共筆的協作方法

  對於時常寫作的朋友們, 相信協助我們產生文案的主要工具莫過於Google搜尋吧! 早期的搜尋技術侷限於某些關鍵字, 而非真正理解我們的意圖, 舉例來說, 我們在搜尋「今天天氣很好」時, 通常會拆成「今天 + 天氣」兩種關鍵字組合去進行搜尋, 但現在的Google可以將「今天天氣很好」的所有可能羅列出來, 並以排名方式呈現給我們, 這樣看似美好, 卻會花費不少時間過濾資訊並決策。 假如有個貼心的AI能夠理解我們說的話該有多好, 又能夠幫助我們自動撰寫文章那就更棒了, 這些訴求都已經被OpenAI聽到了! 沒錯, 就是最近非常火紅的 ChatGPT , 出自美國舊金山的 Open AI 所開發的一套AI引擎, 早期常常出現答非所問的狀況, 但現在已經能夠很靈活的回答我們的問題了, 我們來試著玩玩看這個AI新寵兒到底有多厲害吧。 什麼是ChatGPT? 主要使用「GPT-3」的統計語言模型, 那什麼又是「GPT-3」呢? 作者也不是非常清楚, 這時候我們就讓ChatGPT來幫我們回答吧: GPT-3(Generative Pretrained Transformer 3)是一種大型語言模型, 由OpenAI訓練而成。它可以用於自然語言理解和生成任務, 例如文本生成、機器翻譯和問答系統。GPT-3擁有巨大的詞彙量和訓練數據, 因此它能夠高效地理解和生成人類語言。 簡單來說就是讓機器讀懂我們的語言, 並進行回應。 怎麼用? 動手來玩玩看吧! 首先我們可以到「 ChatGPT 」的官網先註冊一組帳密, 註冊完畢之後, 介面也相當直觀, 就像我們平常在使用的通訊軟體一樣, 以最自然的對話來詢問我們的問題吧! 這邊我們就先來問問「要怎麼寫好一份優質的文章?」, 可以看到AI回答的非常到位, 非常自然的對答, 如果我們事先不知道背後服務的其實是個AI的話, 甚至會誤以為是真人在回應呢! 什麼樣的難題是ChatGPT無法勝任的呢? 當然ChatGPT也不是萬能的智能客服, 由於它能理解的資料僅限於歷史資料(ChatGPT的資料庫目前僅更新至2021年), 流行語對它來說或許並不擅長, 再來是決策也不是它擅長的任務, 甚至假若訓練的資料是有害的, 回答出來不是我們能夠完全相信的資訊, 因此不能完全依賴於ChatGPT的回答, 目前仍需我們大腦進行進一步的判

🖋 【Google Colab Python系列】 視覺化資料Matplotlib 如何繪製出中文?

  我們前篇有介紹到如何讓資料視覺化「 📈 【Google Colab Python系列】以Goodinfo為例,將資料視覺化吧!」,過程中雖然我們的報表呈現皆使用英文字眼,但假若欲繪製中文進行呈現時就會發生以下狀況: import matplotlib . pyplot as plt data = [ lYield , cYield , hYield ] # 這裡繪製出中文 labels = [ '中文' ] plt . boxplot ( data , labels = labels ) plt . show () /usr/local/lib/python3.8/dist-packages/matplotlib/backends/backend_agg.py:214: RuntimeWarning: Glyph 20013 missing from current font. font.set_text(s, 0.0, flags=flags) /usr/local/lib/python3.8/dist-packages/matplotlib/backends/backend_agg.py:214: RuntimeWarning: Glyph 25991 missing from current font. font.set_text(s, 0.0, flags=flags) /usr/local/lib/python3.8/dist-packages/matplotlib/backends/backend_agg.py:183: RuntimeWarning: Glyph 20013 missing from current font. font.set_text(s, 0, flags=flags) /usr/local/lib/python3.8/dist-packages/matplotlib/backends/backend_agg.py:183: RuntimeWarning: Glyph 25991 missing from current font. font.set_text(s, 0, flags=flags) 由上述的訊息可以推估可能是某些字型缺失,因此無法正常顯現,這時候我們就需

📈【Google Colab Python系列】以Goodinfo為例,將資料視覺化吧!

  上一篇我們有介紹如何爬取Goodinfo的資訊並統計分析,還沒閱讀的朋友建議先行閱讀,再進入此篇章會比較容易上手唷,傳送門如下: 🚪 【Google Colab系列】以Goodinfo!為例,統計一段時間內的最高、最低殖利率 為什麼要做資料視覺化? 相信圖文甚至影音箱對於文字來說更為吸引我們進行知識的汲取,一張好的圖表讓我們一眼就能看出資料的趨勢、分布,提升整體效率,因此當資料、統計都準備好之後,下一步就是以圖表來進行分析並決策。 那這次的主題會使用到的套件為「 Matplotlib 提供了靜態、動態與互動式圖表,是python語言中資料視覺化的強大利器。 我們應該選用哪一種圖表呢? 不同的情境下選用不同的圖表,就像戰場上根據戰況選用不同的武器甚至策略,因此並沒有一個標準答案,不論是時序、量化...都有其擅長與短處,看看這篇今周刊的文章就有提到「 不同圖表不同使用時機,我的報表適合什麼圖形?你用對了嗎? 」。 而我們的情境是要分析目前股價屬於偏貴還是便宜,因此會有最高、最低以及目前錨定位置,那以這樣的情境我們可以選用了箱型圖來做表述: 因為我們並沒有時序上的需求,因此也不適用於折線圖、長條圖這種常見的圖表,反而是箱型圖可以表述目前的價格偏高還是低。 開始實作的旅程 上一篇」我們已經統計出最高/最低殖利率了,這次我們進行延伸,以最新成交價搭配圖表來評估目前股價的位階,因此會抓取最新成交價、計算目前殖利率、繪製圖表這幾個步驟,以下將逐步說明。 抓取最新成交價 我們一樣使用dom分析的工具來抓取指定表格,如何抓? 請參閱「 🚪 【Google Colab系列】以Goodinfo!為例,統計一段時間內的最高、最低殖利率 」,以下是主要抓取的部分: # 這一段是「成交價」區塊 price_data = bs . find ( class_ = 'b1 p4_2 r10' ) 接著我們試著取得成交價,並進行轉型為float以利後續計算。 import pandas dfs = pandas . read_html ( price_data . prettify ()) node = dfs [ 0 ] # 僅留下第一列 node . columns = node . columns . get_level_values

【Google Colab Python系列】以Goodinfo!為例,統計一段時間內的最高、最低殖利率

圖片來源   上一篇我們有介紹Google Colab Python的爬蟲基礎概念與技巧,還沒閱讀的朋友可以先進行閱讀,並建立基礎概念之後再接著進行實戰演練會比較容易上手唷! 這裡就附上連結「 【Google Colab系列】該如何設計自己的爬蟲來抓取Html資料? 」供各位參考囉! 這一篇章會以捕魚的四大步驟進行比喻,由淺入深,逐步完成屬於自己的統計程式,目標是能夠以生活化例子建立撰寫爬蟲的基礎概念,未來假若我們需要進一步蒐集資料進行統計分析時,就將這套心法搬出來舞弄,相信概念與技巧熟練之後,遇到任何奇耙的網站資料也都能夠迎刃而解。 圖片來源 上一次我們已經示範如何抓取目標表格,這次的主軸會圍繞在如何切換表格內容並抓取某幾個cell的資料進行程式運算,因此這個篇章我們會學到以下幾個重要技能: 抓取某段範圍內的cell內容。 過濾標題。 使用pandas進行計算與統計。 觀察: 分析切換「顯示依據」的行為 我們先打開F12並切到Network來觀察操作行為過程中會發送哪些網路封包。 圖片來源 這時候就得考驗我們的觀察能力了,有沒有發現圖片上請求的URL已經有點不太一樣了,我們拿這段URL去試著請求看看,果不其然,刷新後的頁面就是股利發放政策的相關資訊了。 https://goodinfo.tw/tw/StockDividendPolicy.asp?STOCK_ID=xxx 圖片來源 撒網: 定義明確目標 首先我們成功抓到表格之後,下一步就是定義我們今天要統計的數值,以這次的目標為例,統計的為N段時間內的最高、最低殖利率。 因此我們需要抓取的元素有「股利發放年度」、「現金股利」、「年度股價」這些資訊輔助我們進行每一年殖利率的計算。 收網: 撰寫程式進行抓取重要區塊 這時候我們就可以大膽的將這串URL寫到程式碼中,進一步進行抓取。 import requests STOCK_ID='3231' headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36' } res = requests.get(&#