104學習精靈

Learn with Shin

Learn with Shin
公開教室關注者 4 人
關注教室
HsuShin

2022/05/31

找出最佳解 - Linear Programming
不論是生活中或是工作中,我們一直都在做各種決定。
今天要搭配什麼樣的衣服?中午要吃什麼?週末要去哪裡玩?要用多少時間花多少錢做哪些事情?會思考甚至煩惱,就是我們想要盡可能的追求最佳解,讓效益最大化。
當然,人生不(一定)會有最佳解,所以才有趣也值得去探索
但是在某種程度上,如果可以量化這些變數,理論上就有可能找到最佳的解答。
一些例子像是:
行銷部門如何在有限預算下決定廣告商來達到最好的效果;
控管供應鏈,決定我這一季要進多少貨,要雇用多少作業員,達到合理最大的產能;
老闆決定要關哪幾家工廠來最佳降低總成本(包含固定營運成本跟運輸成本)
理財顧問幫助客人如何在可接受的風險下選擇投資組合報酬最佳化;
如何在有限的資源下找出最佳化分配(resource allocation optimization),做出最好的決定,是大大小小企業一直不斷追求的目標。
有鑑於此,今天我們要來稍微看一下一個叫做Linear Programming的工具,以及如何搭配Python來使用它。
Linear Programming
Linear Programming,英文可能聽起來像什麼程式,其實不是😅。中文叫做線性規劃。簡單來說是一套數學工具,用來幫助我們在已知限制條件(constraints)下找到目標(objective)的最佳解。前提是問題的本質必須是線形系統(Linear system)以及不等式(Inequality)所組成的(我們就不多討論複雜的數學模型,有興趣的可以在網路上參考)。
基本上簡單的例子像是:
求x + 2y 的最大值,條件是
y <= 50
x + y <= 120
聰明的你可能很快就算出來了,最佳解就是:
x + 2y = 170
x = 70
y = 50
反過來把上面的式子(或稱之為model)用生活的例子帶入的話,可能就像是:
我想要買兩個玩具跟一本書,最多我可以花多少錢?條件是
玩具一個不能超過50元。
一個玩具加一本書不能超過120元
當然,現實中的情況往往是更加的複雜,設計一套模型通常沒那麼容易,加上如果模型的複雜度高(譬如說有很多變數),不但得高度仰賴專業(domain)的判斷,計算上也會變得吃重。
那麼接下來,我們稍稍來看一下如何用Python來幫我們model這些條件及目標,進而計算出最佳解吧~。
例子 1
首先,我們會用到一個第三方library -- pulp......
0 0 366 0
HsuShin

2022/05/31

Graph Database - 圖形資料庫
世上充斥著各種人事物以及其中錯綜複雜的關係。以公司為例子來看好了,有內部組織的上下(左右)關係,部門與部門間的合作關係,業務間的交流關係,甚至是與外部其他公司之間的競合關係。這些「關係」本身都是相當重要的資料,如果今天我想要快速的取得我想要的資料並了解他們之間的關係,該怎麼樣呈現一個這樣的概念呢?
今天想跟大家一起看一個有趣的資料庫類型,叫做Graph Database(圖形資料庫)。
首先,資料庫有分幾種。譬如說一般我們較常見的大概會是Relational Database(一般俗稱SQL資料庫),資料儲存的方式是有Columns跟Rows(就像表格)。相對的另外還有所謂的NoSQL (Not Only SQL)的資料庫,資料可以以Key/Value pair(就像Python的dictionary)形成一個document(譬如說關於單一User的各種資料是一個document)的方式儲存。
今天要來看的Graph Database也是屬於NoSQL的資料庫,但是儲存資料的方式跟上述的很不同。
舉個例來說,我們有看過連續劇中經常會出現的人物關係圖吧?....
0 0 430 0
HsuShin

2022/05/31

Spark - 窺探Big Data
最近這幾年Big Data(大數據)這個詞相當的流行,媒體新聞也會常常用到這個字眼。
當然,我們可以輕易的從網路上取得Big Data的定義,不過還是簡單的講一下,Big Data的Big(大)通常指的是資料的數量、速度以及類型(volume, velocity, variety),根據情況還有其他的特性。基本上當這些要素符合的時候,一般的單一電腦系統往往無法負荷。
因此,我們會利用所謂的分散式運算(distributed computing),簡單來說將資料拆成很多塊,並分給很多電腦來同時處理:一種團結力量大的概念。這些連在一起的大大小小的電腦形成一個所謂的Cluster。
實際上,一般來說自己會碰到Big Data的機會可能不多,大概也不會需要用到Cluster。但是這裡仍然希望給大家作一個參考,如果將來在工作上有遇到這個需求,或許可以提供一個方向。
今天要跟大家一起看的是在這種大數據概念下產生的一個工具(或是架構),叫做Spark(全名Apache Spark),或是更精準一點(因為我們用的是Python)-- 我們要來介紹PySpark(Python + Spark)....
0 0 273 0
HsuShin

2022/05/30

利用Python寄Email
今天要來跟大家介紹如何用Python來寄Email。
大家可能認為寄Email是一件很Personal的事情,為什麼有需要用Python來做呢?
想像我是一個大債主,有很多人向我借錢。我有一個報表,裡面記錄著欠我錢的人的名字,Email,以及欠款金額。涉及隱私問題我們不能將報表寄給所有人,因此必須各別寄Email給該欠債者的人提醒他們。
一般的作法大概就是手動拷貝報表裡面的內容,再一個一個寄Email給大家吧?
但是如果人數很多,而且三天兩頭就得做這件事的話,真的是一件很麻煩的作業。
類似上述的例子大家在工作或生活中可能也遇到過吧?
這時Python就可以派上用場了!
透過Python連結到Email伺服器,並自動化上述的流程,我們可以省下不少時間來追劇(誤
SMTP Server
首先第一步,往往也是令人感到困惑的部分,就是如何登錄到Email提供者的Server(譬如說Google的Gmail)。
我們會用到Python的內建模組 - smtplib來做這件事。
如同HTTP是專門用來傳輸網頁,SMTP(Simple Mail Transfer Protocol)是專門用來寄Email的規範(譬如說訊息的格式,加密,Server間的傳送等等)。而Python的smtplib所提供的功能就是來幫我們搞定這些事情。
每個Email服務提供者有他們自己的SMTP Server的網域名(Domain name)。譬如說:
Gmail - smtp.gmail.com
Yahoo - smtp.mail.yahoo.com
Hotmail - smtp-mail.outlook.com
一般來說,公司內部都會有自己的SMTP Server Domain Name,長得可能像 "smtp.mycompany.com"。要用公司系統寄信的話就必須要取得這部分的資訊(建議跟資安人員確認)。
0 0 149 0
HsuShin

2022/05/30

Decorator - 點綴我們的function
想像一下在萬聖節的時候,我們在門上,桌上,牆上,傢俱等各種物品上放上南瓜妖怪的裝飾品。
藉由這些裝飾品,原本平凡的門跟傢俱,在不需要改造它們本質的情況下,輕輕鬆鬆就增添了萬聖節的氣氛。甚至,我可以想裝飾哪裡就哪裡,就算是廁所🚽也沒問題。
如果,今天沒有這些萬聖節裝飾品,當我想要營造這個氣氛時,我搞不好得叫木工在牆上做個造型,或是把門的樣式都改掉,不用說廁所的難度又更高了。
聽起來很不符合經濟效益,是吧?所以裝飾品是很好用的
在Python中,有一個類似的概念,叫做Decorator。
它能讓我們去對指定的function增添一些東西,甚至是改變它的行為,而不需要去動到function本身。
聽起來好像有點神奇嗎?那麼,我們來看一個簡單的例子吧。
假設我有下面三個簡單的function:
這三個function分別return不同的字串:hello、hi、yo
今天,如果說我想要每個function的return值都加上一個南瓜的表情符號....
0 0 95 0
HsuShin

2022/05/30

時間序列資料 - Time Series
今天要跟大家簡單看一下如何利用Python處理跟時間有關的資料。
Time Series(時間序列)是一種資料的類型。簡單來說資料由一定的時間間隔方式呈現,譬如說每月的銷售金額、每天的股票價格、或是每個禮拜的網路造訪者流量,都屬於Time Series的資料。
遇到Time Series資料,當然必須要知道如何跟日期時間打交道....
0 0 96 0
HsuShin

2022/05/29

學程式需要英文很好嗎?
有一次我在介紹課程的時候,有人告訴我,他得先學好英文,再來學程式 。​這是一個常常被提到的狀況,也是不少想開始學程式的人會有的疑慮。​
今天就個人經驗淺談一下我的意見。​
先講我的回答是,Yes and no。​
為什麼呢?我想簡單的從將學程式需要的幾個重點來看:​
1. Syntax​
這就像是一般學語言中需要知道的文法,為了能夠寫出正確(能作動)的程式,必須要知道的規則。這部分當然大部分都是以英文的長相出現。​
你會看到像是​
If, then , else, try, while, …等等的關鍵字,就算你不懂該程式語言大概也猜的出來它就代表那個意思。​
但是,你絕對不需要高深的英文能力來理解或者是使用這些文法。​
2. Logic​
這部分是邏輯思考,在現實生活工作中叫做解決問題的能力。有人覺得跟數學能力比較有關係。
但是,就算撇開在學校的數學成績,我相信有許多人仍具備很好的邏輯跟解決問題的能力。​
所以,跟英文沒有一點關係。​
3. Computer Science Terminologies​
主要是一些電腦科學相關的專業用語。這部分其實是相當讓許多人敬而遠之的部分。當然,這裡有許多專業知識,一定會出現英文原文。​但是,就像任何專業一樣,一個沒聽過的專業術語,就算幫你翻成中文,還是很難理解那是什麼意思。​
專業術語是需要被解釋的。​
既然你遲早都要這樣,那為什麼不一開始就用原文(英文),然後你可以用中文來解釋。我相信對學習的人不會是太大的困擾。​
所以,專業術語需要很好的英文能力嗎?應該不用。​
所以,結論還是學程式不用英文很好囉?​
殘念的是,也未必是這樣。​
4. Read/Write Documentations​
學習程式到了中後半段,相當重要(或說是最重要的)的就是閱讀(或是撰寫)科技文件(technical documentation)的能力。​
大部分的工具都會有documentation,畢竟這些都是作者決定怎麼做出來的,要怎麼用,往往你猜也猜不到。​
所以,很多自己必須要有能力去尋找答案。​
這些documentation幾乎都是用英文,此外,一些主要論壇像是stack overflow也都是英文為主。如果不習慣英文,想要自我進修就容易受到限制。​
小結​
其實,學程式跟學習大部分的新東西一樣,是有分幾個階段性的。​
在剛開始的階段,如果感受到興趣並/或得到某種程度的回饋,信心會大幅成長,當然實質技術也會進步的很快。​
直到某一點,自信心反而開始降低,會進入所謂的低潮。這個低潮期有可能會持續一陣子。之後,會漸漸再重拾信心,並慢慢一直往上提昇。所謂的Dunning Kruger Effect。
​在前期,我們也許不需要很好的英文能力,就能夠掌握許多有用的技術。我個人覺得其實已經是非常好的投資了。如果希望能更進到下一個層級,那英文就會相對的重要。​
話說,今天我們沒有討論英文身為一個溝通工具在職場的重要性(下次可以討論),因為我們探討的點只是在於學習程式語言。你的經驗是什麼呢?
0 0 41 0
關於教室
Python and data analysis
學習發起人
HsuShin
0 回答 33 分享 1 教室
發起人簡介
目前還沒有關於老師的更多介紹 ...更多