顯示具有 Python 標籤的文章。 顯示所有文章
顯示具有 Python 標籤的文章。 顯示所有文章

2018年7月6日 星期五

Coursera - Applied Data Science with Python 學習筆記 05 - Social Network Analysis

到了這系列課程的最後一門課-社會網絡分析 (Social Network Analysis) ,原本以為是研究 FB、Twitter 等平台的文字資料;原來是運用圖論中的節點和線邊構成的『圖』去代表社會網絡中的人和關係。純圖論的一些經典實施問題包括:7橋問題(path)、最短路徑問題(distance)、4色問題(labeling)。圖論伸廷到今天的社會網絡分析,研究的方向可能是社群的結構、資訊如何流通等等,社交平台做成的網絡是這個方向的一大推動力,正如 Facebook 提供讓開發者使用的 Graph API 就是以 物件-關係 來處理資訊。Python中有 NetworkX 套件特別用來處理這些Social Network Analysis 問題的工具。

Week1 是圖論上的基礎,和一些特別的圖例如 bipartite graph, 它的L-Bipartite graph (weighted) projection。解釋過什麼是Graph、Node、Edge、Degree等基本詞彙後,網絡和圖的稱呼會交替出現。

要引用一張圖,可以有以下方法:
https://networkx.github.io/documentation/networkx-1.10/reference/readwrite.html
import networkx as nx
import numpy as np
import pandas as pd
%matplotlib notebook

G1 = nx.Graph()
G1.add_edges_from([('A', 'B'),
                   ('A', 'C'),
                   ('A', 'D'),
                   ('A', 'E'),
                   ('B', 'D'),
                   ('B', 'E'),
                   ('D', 'E'),
                   ('C', 'F'),
                   ('C', 'K'),
                   ('F', 'H'),
                   ('F', 'K'),
                   ('F', 'J'),
                   ('J', 'K')])

G2 = nx.read_edgelist('G_self_edgelist.txt', delimiter=',', data=[('Weight', int)])

G_df = pd.read_csv('G_self_edgelist.txt', delimiter=',', 
                   header=None, names=['n1', 'n2', 'weight'])
G3 = nx.from_pandas_dataframe(G_df, 'n1', 'n2', edge_attr='weight')

nx.info(G)
G.nodes(data=True)
G.edges(data=True)
nx.draw_networkx(G)

Week 2

「群聚分析」研究的是,網絡中的點互相連結形成群聚的程度。典型由多人形成的群聚,會是圖中一部分由所有點互相連結的完全子圖。而最簡單的一個群聚是由互相認識的三個人形成的「Triadic Closure」,對更複雜的圖的幾種群聚系數,量度的設計是由這形式推展出來的。

首先是圖中某個頂點的「局部群聚系數」-Local Clustering Coefficient,它的大概主意是去計算:與某頂點相連的近鄰們,能夠互相連結成配對的比例。即以下兩者之比:
$v$的近鄰間實際形成的邊數:$|(X,Y)| s.t. X,Y \in N(v)$
$v$的近鄰間最大可能形成的邊數:$\frac{d_v(d_v - 1)}{2}$

當考慮整個圖的整體群聚程度-「全局群聚系數」時,有兩種方法,一個是所有點的局部群聚系數平均起來-「Average Local Clustering Coefficient」。另一個稱為 「Transitivity」 的量度方法是數算圖中由三點形成的「閉三角組」和「開三角組」的比例:
Transitivity = 3 * number triangle / number of opera triad
而兩套方法的分別是對 Transitivity 對 高Degree 的點有較大比重。
nx.average_clustering(G)
nx.transitivity(G)

2018年6月18日 星期一

Coursera - Applied Data Science with Python 學習筆記 04 - Text Mining

《山林道》-「當初說這裡有天 會由樹變成路 一醒覺經已殺出這條路....
我只盼這裡有天 變回樹 撤回路 疏忽了趕快去補趁還未老... 」

Applied Data Science with Python的第四課-Applied Text Mining in Python,是更多有關文字、語言的處理,可以想像最後一課的social network應該有機會處理網絡社交平台上獲取的資料?

最基本的是文字的 Regular Expression 處理,在第一課時已略有使用過,幾個常用方法包括:

### Regular expression
import re
text = '@UN @UN_Women "Ethics are built right into the ideals and objectives of the United Nations" \
UNSG @NY @NY_Society for Ethical Culture bit.ly/2guVelr'   # 字串
text_list = text.split(' ')   # 分拆字串
[w for w in text_list if re.search('@[A-Za-z0-9_]+', w)]   # 查找吻合的pattern

# Dataframe 的字串處理
time_sentences = ["Monday: The doctor's appointment is at 2:45pm.", 
                  "Tuesday: The dentist's appointment is at 11:30 am.",
                  "Wednesday: At 7:00pm, there is a basketball game!",
                  "Thursday: Be back home by 11:15 pm at the latest.",
                  "Friday: Take the train at 08:10 am, arrive at 09:00am."]
df = pd.DataFrame(time_sentences, columns=['text'])

df['text'].str.split().str.len()   # find the number of tokens for each string in df['text']
df['text'].str.findall(r'(\d?\d):(\d\d)')   # group and find the hours and minutes
df['text'].str.replace(r'\w+day\b', '???')   # replace weekdays with '???'
df['text'].str.extractall(r'((\d?\d):(\d\d) ?([ap]m))')   # extract the entire time, the hours, the minutes, and the perio

然後就開始自然語言處理器 NLTK。課程是英語為主,但香港地更實際的一定是中文的處理,從前在 R 就聽過 Jieba 套件,Python世界似乎也是 Jieba 最廣為人所認識,當然這個 Jieba套件之後也要找機會試試。

所以,還是先溫習課程上所學習對英文的流程。首先是把文章進行分詞 (Tokenization),然後針對英文文法上的不同時態/詞型,分辨詞性 (Noun/Verb/Adj/...) 及縮減成詞根的提取 (Stemming) 或還原Lemmatization)。 這樣以後才可以做一些詞頻統計、Vectorization 後做預測模型、兩篇文章內容的相似度的比較。

2018年6月6日 星期三

Coursera - Applied Data Science with Python 學習筆記 03 - machine learning

第三課, Coursera上的最後一課已經開課,加快記完這篇就要再追一追進度了。機器學習隨著人工智能近年變成流行Buzzword,其實在引入神經網路(Neural Networks)前,一些模型例如Regression, logistics regression, KNN Classifier 等 迴歸 或 分類 模型; K means 的叢集;PCA 的縮減維度方法;Decision Tree的決策指引;很多概念都是統計和數學所已有的,只是一個機械學習的課程會對實作更有重視。

今次只是在有課程框架下去學python。當以<第一課>的技巧處理好數據成合用的格式, <第二課>繪圖後對數據有視覺化的印象, 可以進入第三課建立模型去做數據的形容/預測。其他例子可以參考之前幾篇,例如早期用 R 的:
[R] ML4B 課堂重溫 - 淺談 KNN (K-th Nearest Neighbors) 算法
[R] Show Me The Code - Machine Learning的簡易入門

在課堂的練習中,所有今次用到有關的scikit-learn library。從library的架構中可以留意到model selection, preprocessing, models, metrics幾大類別,對應著建立模型過程中的不同需要:
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import validation_curve

from sklearn.preprocessing import MinMaxScaler
from sklearn.preprocessing import PolynomialFeatures

from sklearn.neighbors import KNeighborsClassifier 
from sklearn.linear_model import LinearRegression, Ridge, Lasso, LogisticRegression
from sklearn.svm import LinearSVC, SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.dummy import DummyClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.neural_network import MLPClassifier

from sklearn.metrics.scorer import SCORERS
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.metrics import classification_report
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import roc_curve, auc
from sklearn.metrics import mean_squared_error, r2_score

from sklearn.datasets import make_classification, make_blobs, make_friedman1, load_breast_cancer

2018年5月29日 星期二

Coursera - Applied Data Science with Python 學習筆記 02 - matplotlib

香港2018年對比以往10年的極端氣溫 - 現在 5月尾 (至27/5) 已經連續出現破記錄的高溫

第二課:<Applied Plotting, Charting & Data Representation in Python> 學的是繪圖,倚重 Jupyter Notebook 中的 %matplotlib 功能來直接顯示繪圖的輸出。以上的圖就是其中一功課改用香港數據表示出來,詳細coding看本文的最後部份。 Jupyter Notebook 以前稱為 IPython notebook,從前安裝 Anaconda 應該是預設了Jupyter,只是一直未有使用。今次先檢查兩個2.7和3.6的python環境中的package,未有Jupyter的話就重新安裝/更新。

# 當前環境的套件
conda list
# 更新 pip
pip install --upgrade pip

# 安裝 jupyter
pip install jupyter

之後當執行jupyter,電腦會打開一個瀏覽器視窗,預設會連到localhost的 port:8888。新增或打開課程的 .ipynb 檔,當中的內容以一個個的「Cell」顯示。按 [Shift+Enter] 執行這個 Cell ,某個 Cell 的 in[?] 的結果會顯示在相應的 out[?] 之中,這樣可以選擇文件中的某部分來執行、逐步去測試。 其他功能可以在文件上方的選項,經常用到 Kernal 中的 Restart, Restart+Run all。在用完某 .ipynb 後可以把它 Shutdown;要離開 Jupyter 就可以在 Terminal 中按 [Ctrl+C] x2

# Use Jupyter
python -m jupyter notebook

用瀏覽器的 localhost:8888/tree/ 作為開頭的路徑,前往電腦中的檔案夾

打開 Jupyter Notebook 的 .ipynb 檔


2018年5月17日 星期四

Coursera - Applied Data Science with Python 學習筆記 01 - Introduction

5月初的放假期間開始了一個Coursera 的 Python Specialization 課程-<Applied Data Science with Python>, 暫時完成了3/5的課,在5月尾開始下一課前,先重溫一下第一課:<Introduction to Data Science in Python> 一些值得記著的codings.

1. 例子

# 關於資料結構
x = (1, 'a', 2, 'b')  # Tuple
x = [1, 'a', 2, 'b']  # List
      # set(x['name'] for x in df).   elist = [n for n in range(0,100) if n%2==0]
x = {1: 'a', 2: 'b'} # Dict
      # x[name], x.values(), x.items()
x = np.array([[7, 8, 9], [10, 11, 12]])     # Array:   import numpy as np.
x = Series(['item1', 'item2', 'item3'], [0, 1, 2])   # Series:  import pandas as pd
x = Dataframe(array, index, columns)   # Dataframe:  import pandas as pd
type()

# 字串 及 正則表示式
x = 'This is a string'
x[0:2]   # 從第 0th 元素開始,停止在第 2nd 元素之前
'This is a string'.split(' ')[0]  # 以空格 '  ' 分拆字串,提取第 0th 元素
re.findall(r'\w+', 'This is a string')  # 以正則表示式尋找特定字符。需要先 import re

# Numpy 中的 Array,用於使用 Vector、Matrix 的時候
a = np.arrange(start, end, step)  # 從 start 至 end,數值間隔為 step 的 Array
a = np.linspace(start, end, count)  # 從 start 至 end,count 個數值的 Array
amax = a.argmax()  # Array 中的最大值
a = np.vstack([array1, array2])  # 垂直合併兩個 Array
arrar2 = array1.copy   # 複製出獨立的 Array


# Pandas 中的 Series/Dataframe, 從 Numpy 的 Array衍生出來,處理數據的資料表時可以用到
a.argmax()
s.loc['name']   # index 為'name'的資料
df.reset_index()  # 重設 index 為 0:len(df)
df.set_index('time').sort_index()  # 以Column 'time' 為 index,並排序
df.dropna()  # 除去包含 NA 的行-Row
df.apply(min_max, axis=1)  # 進行 Row 運算
df.pivot_table(values, index, columns, aggfunc=[np.mean,np.min], margins=True)  # 製作Pivot Table綜合資料表
df= df.set_index('Col1') .groupby(level=0)['Col2'].agg({'avg': np.average}) 
pd.cut(df['avg'],10)

2018年2月4日 星期日

[Web] Digital Ocean升級 和 部署到One-click app時修改的 Nginx、Gunicorn 設定。

Digital Ocean 升級

之前的一篇記錄過如何在 Digital Ocean 建立一個雲端主機後,不久的某天早上在查看電郵時,留意到 Digital Ocean 為它的服務升級了。以最低價格每月5美元一個標準主機的Droplet 為例,就有以下更新:從 512MB -> 1GB RAM、 20GB -> 25GB SSD。

但如電郵標題已經講明,這是[Action Required]。這個自製網站的規模不怕暫時離線,也未看到有復原到小容量,或預留那 5GB Disk的需要,所以也沒理由不放心進行 Disk, CPU and RAM 的升級。以 Control Panel 的方式升級也非常容易。



參考:https://www.digitalocean.com/community/tutorials/how-to-resize-your-droplets-on-digitalocean

 

2018年1月16日 星期二

[Web] 為網站準備的 雲端主機 (Digital Ocean) 和 域名註冊 (Hosting speed)

按此推薦網址註冊,可獲得10美元Credit的優惠【 https://m.do.co/c/586afef63cee 】。

為老闆娘做網頁,自從寫好基本的網頁框架,就把它放下了一段日子,十二月尾至一月初忙著做線下的工作,為訂單起貨。現在網頁仍欠一些產品照和字型配色等的外觀設計,還有要等待和店主討論希望如何展示定價和包裝等等。在這個等待的時候,為了準備之後的正式部署上線,12月中開始租了一個Digital Ocean的雲端主機作虛擬專用伺服器(VPS) 用來寄存和運行網站;1月初還在 Hostingspeed.net 買了一個 .hk 的域名。

Digital Ocean

當開發階段有了雛型時,就向身邊的朋友示範和搜集意見,"上線"這部分就推介了DigitalOcean (D.O.) 這個VPS主機商。作為個人運作的網站,還要是對寫網頁仍在學習中的階段,它的好處是入門門檻相對很低。DO 有不同的租用計劃選擇,最便宜的只需每月$5美金,(新用戶用朋友的邀請連結去註冊,有$10的credit,如上),可以分到一個在新加坡的伺服器, 512mb記憶體,20GB硬碟空間,我選擇 1-click app的版本,預設好 Ubuntu 16.04, Python 2.7.12, Django 1.8.7。


按邀請 [連結] 建立帳戶:

2016年1月15日 星期五

[Python] Facebook page 的 Like 與 Crawling

網上找Facebook上做Web crawling 的方法,記得之前試過某Coursera教Twitter上的Crawling,用到服務本身提供的API和Authentication Token。Twitter/Google map的教學的都有Coursera上的課堂,但FB提供的只有網上找到零碎的教學,當時是一個外國Vlogger like Emma Watson posts的Script。試明白後把這段code貯起來做參考,想不到這星期剛好有用得上的時候。用到以下的第三方SDK, 安裝後用 import facebook 載入。


Python 的facebook SDK: https://github.com/pythonforfacebook/facebook-sdk

更多的Facebook SDK: https://developers.facebook.com/docs/apis-and-sdks

了解背後的FB Graph API的用法: https://developers.facebook.com/docs/graph-api/overview


找取 & like page 的post:
- 'toke here' 的token 可以在GRAPH Explorer中得到, (Keep it secret!!)
- "ejmonthly" 是信報財經月刊的Facebook name, 看網址就會找到了。

對於ejmonthly 這個profile, 當用get_connections連繫上它的posts資料, 就可以對它的資料內容
資料做事了。抓取內容時,其本上是一層層的dictionary 結構。做動作時就用到sdk內的function, 如put_object() 去對某個post 給like。

2015年12月27日 星期日

[Python] wxpython: import wx 找不到模組

 
《用Python玩轉數據》最後一個星期的課是用Python 寫GUI,例子整合了之前所學的東西寫成一個道指成份股的價格查詢工具:
 

GUI用的套件是wxpython,可惜當 import wx 時,Python都會出現錯誤,回應說找不到module,一直重裝都是這樣,到發覺一件奇怪的事:用 which python 指令找到的不是Mac/Lib/Python2.7,而是指向一條Anaconda的路徑。

$ which python
/Users/ryanli/anaconda/bin/python