2014/9/23

[筆記]R 與 Python 連接 MySQL 資料庫

[筆記]R 與 Python 連接 MySQL 資料庫方式

作業環境:Mac OSX
資料庫:本機 / 資料庫名稱 = a777
因為我個人對於 SQL 還蠻熟悉的,所以一些初步資料整理的工作我都會傾向在資料匯入時就完成,所以我很喜歡在 R 與 Python 中直接使用 SQL ,好處也是如果以後換轉到不同平台時,SQL 這個產業標準還能延用下去


R 連接  MySQL 資料庫

(1)安裝 RJDBC RMYSQL 套件
在Linux體系下安裝 RODBC 比較麻煩點,RJDBC 會省事很多

(2)語法範例程序:連接資料庫→取得資料→關閉連線→檢視資料

library(RJDBC)
library(RMySQL)

#定義連線字串
conn <- dbConnect(MySQL(), dbname = "a777", username="root", password="")

#將SQL查詢後的資料置於 data,資料型別為 data.frame
data = dbGetQuery(conn, "select * from MINING_BASE")

#關閉資料庫連線
dbDisconnect(conn)

head(data)
#進行資料初步檢視


python 連接  MySQL 資料庫

(1)安裝 MySQLdb pandas 套件
pandas 不是連接 MYSQL 的必要套件,但因為資料取得後也是要進行相關統計分析
所以也直接引用,pandas可以視為python中主要處理統計相關議題的重要套件

(2)語法範例程序:連接資料庫→取得資料→關閉連線→檢視資料

import MySQLdb
import pandas as pd
from pandas.io.sql import read_sql

# frame_query 是舊方法,pandas 建議大家改用新的 read_sql
# 引用 MySQLdb 用以連接 MySQL資料庫

#定義連線字串
mysql_cn= MySQLdb.connect(host='127.0.0.1',
                port=3306,user='root', passwd='',
                db='a777')

#將SQL查詢後的資料置於 data,資料型別為 pandas.core.frame.DataFrame
# rad_sql( "SQL語法"  , 連線字串)

data = read_sql("select * from MINING_BASE   "  , mysql_cn  )

mysql_cn.close()
#關閉資料連線

data.head()
#進行資料初步檢視

參考資料:
http://www.r-bloggers.com/mysql-and-r/


備註:


# Python 中還有一種方式是使用 sqlalchemy ORM
# 暫時用不到這種語法,但也做為一個補充放上來
# 參考網址   http://docs.sqlalchemy.org/en/rel_0_9/orm/
# 中文教學網址  http://chimerhapsody.blogspot.tw/2013/08/python-sqlalchemy-orm-part-1.html


import sqlalchemy
import csv
engine = sqlalchemy.create_engine('mysql://root@localhost/a777')
connection = engine.connect()
result = connection.execute("select MINING_DW_SUBSCR_NO from MINING_BASE")
row = result.fetchone()
#for row in result:
 #   print "your data in here ", row['MINING_DW_SUBSCR_NO']

fh = open('data77777.csv', 'wb')

outcsv = csv.writer(fh)
outcsv.writerow(result.keys())
outcsv.writerows(result)

fh.close
connection.close()


愈來愈討厭 big data 的字眼

愈來愈討厭 big data 的字眼

雖然本部落叫做 moe big data,目前看來好像是用來騙流量的…

主要的理由是目前有太多不切實際的理想都被歸入 big data

好處當然是相關領域會有大批的人力物力財力予以投入
但是缺點就變成什麼東西都是 big data,在討論事情的時候就變成雞同鴨講

好比最怕碰到一種人「不要和我談政治」,但是當你聽到他這樣說的時候,其實大部份的時候是很難理解他說的是「不要批判某一特定政黨」「不要批判某一候選人」「公司同事之間的相處之道」;因為廣義的來說,只要有人際關係、有利害,小則家庭可以有政治,中則公司有政治,範圍更廣的則有國家體制內的政治、國際政治,你說不要談是在講什麼哩

所以我轉念一想
也許本部落來談談一些基本 big data 下較為具體的技術與理論好了
畢竟太虛幻太美麗的事物,終究是鏡花水月…



Sublime text - 設定 SublimeREPL

目前使用 sublime text 3做為預設文字處理編輯器
主要使用的語言為 python 與 R


sublime text 預設支援 python 環境,只要設定[Tools]-->[Build system]-->[Python]
在編輯 python 的同時只要按下 cmd+b 就可以看到python檔案執行結果,
不過還是有些限制,所以需要單純的python作業環境

要達成這個目的最基本的就是安裝sublimeREPL 套件
(REPL指的是read-evaluation-print-loop)
簡單的想成就是在編輯器上面就直接可以執行 Python 與 R)

sublimeREPL相關設定如下:

(1)事先裝好 package control 這個套件
(2)安裝 sublimeREPL
(3)設定 user 使用檔
    sublime text 的使用邏輯是你先到預設檔案複製相關設定值到user設定,避免後續你反悔了想要改回預設值時找不到檔案(不過其實大部份的套件在github都直接找得到預設值)

我使用的環境是 mac osx,比較重要的設定如下提供參考:

    "default_extend_env":  {"PATH": "/Users/帳號/anaconda/bin:/Users/帳號/anaconda/bin:/Users/帳號/anaconda/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin"},

(4)切換檢視方式
[view] --> [Layout] --> [Col2] (我是選2欄的版面)

(5)叫出Python作業環境
個人習慣使用 ipython
    方法1:[Tools] --> [SublimeREPL] --> [Python] -->[IPYTHON]
    方法2:快速鍵 shift+cmd+p ,輸入 reip
    (因為sublime有支援 fuzzy 蒐尋所以可以省略部分英文字母)

結果如下:
左側是 python 文件編輯區
右側是 iptyhon作業環境  (iptyhon的左則 tab是 R 的作業環境)
下側是 python 執行結果






2014/7/2

我認為的資料科學家作業流程

之前有幾次機會到不同場合分享 Excel 在實務上應用,不過當時的標題大致上都是「樞紐分析」「資料分析」,感覺上就是不夠大器。
上網找了一下,原來當年針對 Data Mining 這個主題就有人提出了的作業流程:CRIPS-DM
我覺得定義的還蠻完整的,也符合實務上遇到的狀況,更重要的是它將Business Understanding 與 Deployment 也納入,就是要提醒玩弄資料的工程師,千萬不要只將眼界完全專注在單一課題(例如:新演算法的開發),而是要對實際商業環境做出價值。好比你是個管理顧問,接到了個賣牛肉麵的案子,那設法將牛肉麵多賣出個幾千碗就是你的價值所在;總不能資料分析到最後:成年男性牛肉麵吃的比較多
File:CRISP-DM Process Diagram.png

上圖引用自 wikipedia
可以看到主要分為6大階段

Business Understanding
Data Understanding
Data Preparation
Modeling
Evaluation
Deployment
我自己的記憶理解方式如下:
以某校新到任教師為例,各階段對應狀況如下:
(1)Business Understanding
學生們的學習狀況為何? 要做些什麼來協助提高低學習意願學生的動機?
(2)Data Understanding
蒐集那些資料可以協助瞭解這個問題? 筆試成績、家長背景、學生姓別、年齡、居住地、國籍、經濟狀況 ?
資料想要蒐集得愈多,成本會愈高哦

(3)Data Preparation
蒐集資料的過程中,有些資料可以直接計算得到。例如:只要知道出生年月日,自然可推算年齡;
但同樣填寫小康,有人是住在大安精華區,有人是在荒山野嶺...是否有其他方式提供資料的正確性?
(4)Modeling
決定要採用那些分析技術→繪製直方圖、敘述統計、差異分析、學習狀況分類
(5)Evaluation
評估→此例中只是一個教師想要執行的專案,以目前電腦的計算能力,不太有評估的需要...但如果是整個國家的資料,則選用的分析模型是否合宜就楚重要
(6)Deployment
因材施教? 改變教室經營方式? 改變家長心態? 改變筆試頻率?
我想在教育機構,重視的應該是第(4)項:Modeling;
所謂的統計學、計算機概論、機器學習、程式寫作,都可以視為是這塊...
不過其實在實務上,有些項目還真的不好畫分
比方說在 Big Data 時代,很多資料並不像是當年在喊 Data Mining 時資料是由廠商自行蒐集而來的結構化資料,現在有很多資料是屬於非結性構資料;所以說啦,Big Data是個強調混搭的時代
只要有心的話,廠商也可以設定一個 Facebook 粉絲頁;或是廠商可以利用程式監控敵對企業專利申請的狀況...再簡單一點,賣冰啤酒的廠商可以取得氣象預報的各項資料來研擬各種行銷策略
我把以上的流程,再和The input-process-output (IPO) model 結合如下:
Moe
資料科學家作業流程
CRIPS-DM IPO 對應技術分類
(個人意見)
Ⅰ-定義問題 Business Understanding Input 產業分析
商業知識/邏輯
Ⅱ-取得資料 Data Preparation + Data Preparation Input Databse System
Information retrieval systems
Ⅲ-模型分析 Modeling + Evaluation Process 統計學
機器學習
Social Network Anaysis
Ⅳ-行動應對 Deployment Output Visualization

這樣的畫分一定有很多爭議…
好比 Social Network Anaysis 中也會有大量的Visualization(視覺化)技術啊…不過我想在學習的過程中,這對於方向感的建立是相同重要的,所以我還是會將視覺化技術給獨立化出來。而實務上的確也會有那種面對複雜的問題,無法判斷各種指標的權重應該如何決定時,將所有資訊轉化成一張圖形就決定的狀況發生…
如果本網站是一本書的話,那我想這篇文章的重要性就如何目錄吧 微笑
備註:
資料科學家(data scientis)是 Big data 炒得火熱之後出來的新名詞;
最簡單的定義就是,資料科學家的統計學比程式工程師好,資料科學家的程式能力比統計學家好…

2014/5/16

在 PTVS 底下使用 IPython

PTVS 指的就是微軟 Visual Studio 底下的Python開發環境,只是微軟喜歡再搞個簡寫,證明他們為了這個東西有弄出一個專案;

而IPython是Python底下一個很出的 IDE ,後來上網查原來 REPL 是有特殊意義在的 ,維基的說明如下

「讀取-求值-輸出」循環英語Read-Eval-Print Loop,簡稱REPL)是一個簡單的,互動式的編程環境。這個詞常常用於指代一個Lisp的互動式開發環境,但也能指代命令行的模式和例如 APL, BASIC, Clojure, F#, Haskell, J, Julia, Perl, PHP, Prolog, Python, R, Ruby,Scala, Smalltalk, Standard ML, Tcl, Javascript 這樣的程式語言所擁有的類似的編程環境。這也被稱做互動式頂層構件(interactive toplevel)

而在 PTVS 使用 IPython 其實也蠻簡單的,只要看底下這篇文章就可以

Using the IPython REPL with PTVS

但我還是將個人心得說明如下

在 Visual Studio 2013 中,你可以裝好幾個 Python 的編譯器,例如像我就裝了:

image

其實我不是要展現我個人任重道遠,而是常常會發生一些奇怪的狀況最終就變成了這種情形;

我來說一下我目前主要的心得,我不知道微軟用了什麼機制去區分 Python 32 bit 與 64 bit版本,因為就我個人的狀況是2套都有裝,而在套件上,有些套件是 32bit 有些又是64bit ,所以如果你是用32 bit的Python 但是配上 64 bit的套件光是在 import 階段就會出現問題….

但是好在 Visual Studio 可以隨時切換你要的編譯器,因為我把 IPython 要安裝的套件下載成 64bit 但是安裝在 32 bit 的Python 資料夾中,但是只要我選擇 64 bit 的Python 編譯器就不會出現問題….

另外在 Using the IPython REPL with PTVS 的連結中,有建議直接下載 SicPy 編譯好的 exe 套件,就直接依他的指令下載回來安裝吧;因為Python的套件,很多都有相依性,就好像你要去參加婚禮一樣,要穿的服裝都要照一件的規定來….而這種編譯好的套件,就好像直接像禮服公司拿衣服,減少了很多相依性上的麻煩

最終安裝好了,再記得到 Visual Studio 中將互動介面改為 Ipython這樣子就比原先純文字型的互動模式更加棒了

另外這個套件中,有提供在互動介面中就直接輸出圖形的能力

image

我覺得這真的是很棒的功能

可以多試試看,畢竟 Python 在科學運算上因為資料結構可以實作很多在 R 中不容易實現的功能,可以多加利用一下

另外 IPython 另一個重要的功能就是可以轉成網頁編寫 Python 的平台(即為:IPython Notebook),我只能說因為少了微軟的加持再加上還有眾多網路系統設定要調整,我決定等到以後買了 Mac 與工作中確實有此需求才會進行實作…

Python 的 BeautifulSoup4 在Visual Studio 2013異常處理方式??

先說結論:

不要理它,但是要確實的告訴 visulal studio 2013 不要理它

如下,在例外狀況將 python 的選項給取消…

image

 

 

開始說故事時間囉:

在資料蒐集階段中,我們常會借助 Python 來進行網頁資料系統性的取得

因為 Python 有提供蠻多這類相關的套件

只要在google 上面打入 “web scraping” python 等相關字樣就會出現很多的結果;BeautifulSoup 算是其中蠻出名的一套,雖然後續有後起之秀

不過這套最大的好處是容易安裝,我有測試過另外一套,因為相依的套件太多了,所以一直無法安裝成功,但這一套就簡單多了

我想為了後續 open source 體系的編程學程之路,6月後就會開始進行新一輪的mac book 物色了… 因為很多 open source 的東西都是基於 linux 系統,移植到windows的時候總是會漏東漏西的,否則就是相依性的問題一直搞不太起來

像是 BeautifulSoup 我在Visual Studio 2013的環境中執行程式碼時就會一直報錯,後來是找到這一篇

Can't import bs4

image

嗯,說穿了就是一個一直解不掉的Bug … 因為其他的套件就不會有這樣的情形….

好吧,至少這個狀況是能被處理的

在此做個紀錄

另外其實還在微軟體系下的朋友,visual studio 2013提供的程式環境是真的還不錯用…可以到 http://pytools.codeplex.com/ 下載最新版本進行安裝

它提供了不同版號的 visaul studio 的安裝檔

2014/5/1

Visual Studio搭配Azure發行網站

我很喜歡Azure的一點就是,他簡化了很多學習網站架設的功夫

如果是之前的話,你要架設 .Net 架構的網站,要花蠻多功夫的,而我個人又不太喜歡為了一個小專案還在那邊安裝 SQL Server 管理工具…

現在Visula Studio 2013可以很方便的和Azure相結合;我紀錄一下我自己的心得

(1)新增Web Forms專案 -- 可以看到已經與 Azure 做了整合

image

(2)在Visual Studio中設定資料庫連結

image

在Azure中的概念,是同一個使用者擁有一個相同的資料庫伺服器

而你每建一個新的網頁服務就可以同時指定一個新的資料庫,簡單的說在Azure中的階層觀念大概是這樣

資料 >> 資料表 >> 資料庫 >> 資料伺服器;雲端的好處就是微軟負責將資料伺服器的正常營運,我們只需要著重在資料報表如何呈現的邏輯即可。

另外要注意的就是,由本機端的資料庫轉換成可以匯入Azure資料庫不能直接轉換,還需要透過 SQL Azure Migration Wizard 進行移轉…

(3)依照正常的開發流程,就可以 建置 → 發行網站

我採用的是懶人法,其實微軟有提供多樣化更新網站的方式;如果你願意的話,也可以採用最傳統的 ftp 上傳方式

image

這裡記得要設定資料庫連結,Visual studio還沒有聰明知道要指向那一個(因為我連線的是遠端資料庫)

image

網頁程式的開發,我覺得對於資料科學是相當重要的一環。因為你的分析演算法再如何的漂亮,最後還是需要呈現讓其他人能夠理解你說的故事是什麼?而網頁就算是一種最通用的呈現方式 (另一種方式則為 Excel 試算表)

2014/4/30

C#捉取網頁資料-其一

在C#建一個簡單的Console專案

然後安裝以下套件                   

image

image

image

語法上其實還蠻單純的

不過在建立新物件時,因為會用到套件的東西所以需要自己手動指定解析,IWebDriver 與 PhantomJSDriver(),將游標移至這2個項目旁邊按右鍵即可

image

此處一個簡短範例如下

            IWebDriver driver = new PhantomJSDriver();
var url = "http://en.wikipedia.org/wiki/Web_scraping";
driver.Navigate().GoToUrl(url);
var tocElements = driver.FindElements(By.CssSelector(".toctext"));



在我這個範例中,最重要的是那個 FindElements有s與沒有s …顧名思義,有s指的是複數的狀況,沒有s指的是單數的狀況;而在CssSelector中的參數要如何取得呢? 簡單就使用Firefox中的FireBug+FirePath即可


image


另外一個小技巧就是在C#的程式中設定適當的中斷點,然後利用「即時運算視窗」再確認我們捉下來的資料是不是我們需要的


因為有時候需要的文字資料裡面會有不需要的東西,則可以事先運用文字相關函數加以整理….

2014/4/29

Big Data 作業流程技術資源

因為Blogger系統的限制要放在側邊有點麻煩,我直接另開一篇

將我個人蒐集在 Onenote 的資料也整理到這邊

後續會陸續更新… (因為Big Data 的議題熱度高啊~)

更新log:

(1)2014-4-29

(2)2014/4/30 更新Web Scraping資料

Moe
資料科學家作業流程
相關技術連結
Ⅰ-定義問題  
Ⅱ-取得資料 Web_scraping 相關技術

利用網站:
https://import.io/
捉取網頁資料

自己寫程式:
https://developer.yahoo.com/yql/ Yahoo的YQL
Python套件 Beautiful Soup、Scrapy

RUBY套件 Watir   Nokogirl

C#套件  Html Agility Pack、 WatiN 、 CsQuery

JavaScript 套件 PhantomJS、CasperJS

我個人有試過在C#底下使用過jQuery+PhantomJS+WebDriver的方式捉取網頁資料
  方式如下:在C#開一個Console專案→安裝以上套件→在Firefox中觀察網站結構確定要捉取資料型態→匯出 ;另外安裝一套 CsvHelp可以簡化輸出作業

輔助工具:
另外由於HTML不是很標準化的語化,所以可以套過FireFox下的Firebug、Firepath來快速掌握網站架構(可快速瞭解DOM與CSS)

可參考書籍:
Mining the social Web

Ⅲ-模型分析  
Ⅳ-行動應對  

2014/4/27

Azure安裝Rstudio

Azure安裝Rstudio

前提:Ubuntu已架設完成

主要分成2個部分

(1)安裝Apache伺服器
   執行以下指令
   sudo apt-get install apache2
   sudo apt-get install libapache2-mod-proxy-html
   sudo apt-get install libxml2-dev

(2)安裝Rstudio 安裝很簡單,但記得在Azure管理介面中將8787 Port打開

   安裝R
   sudo apt-get install r-base
  
   安裝Rstudio(For Ubuntu)
   sudo apt-get install gdebi-core
   sudo apt-get install libapparmor1  # Required only for Ubuntu, not Debian
   wget http://download2.rstudio.org/rstudio-server-0.98.507-amd64.deb
   sudo gdebi rstudio-server-0.98.507-amd64.deb

原廠安裝說明:
http://www.rstudio.com/ide/download/server

打網址後面加上:8787 就可以登入 Rstudio介面
http://<server-ip>:8787
帳號權限管理方式就如同一般Ubuntu指令語法 useradd
 
 
*** 幾乎沒有什麼難度,想想如果這是在以前的話,這會是多麻煩的一件事呢?!

Azure中Ubuntu安裝桌面環境與遠端桌面連線

 

Azure是微軟提供的雲端解決方案,微軟目前很認真的在推這塊領域
微軟的大頭目已經喊出了「Mobile First, Cloud First」
很明顯的要將微軟主要的獲利來源往這塊領域移動,所以Azure提供的不只是微軟自家產品、作業庫系統、資料庫系統的解決方式,已經成為了跨平台方案的提供者

一般人比較會使用到的是自建虛擬主機的方案
設定起來蠻簡單的
就是每台主機都是各自獨立,所以需要設定如下
(1)主機名稱
(2)使用帳號
(3)使用者密碼

其實就想成是從前利用Vmware在自己的電腦再另外安裝一套作業系統一樣
只是安裝的速度更快,例如安裝好一套可以用的 Ubuntu 大約只要10分鐘吧
如果是在自己的電腦上安裝並且要自訂主機名稱,很難這樣快速達成
你設定好的主機名稱,後續在微軟的網域底下 cloudapp.net
想像一下從前自架主機還要搞定IP之類的麻煩事,現在微軟全部幫你搞定

當然一開始架好的 Ubuntu 是Server版本的沒有桌面環境可以使用,如果你和我一樣是GUI派的,就請再自行安裝桌面環境吧

在登入前記得先在Azure管理介面中設定以下Port

(1) 22 port 指定給 SSH (文字介面的遠端連線);

(2) 3389 Port 指定給 RDP  (遠端桌面連線)

利用 SSH (使用 Putty)的方式遠端登入你的 Ubuntu 主機

執行以下指令
sudo apt-get update   (先確定目前Update是最新版)
sudo apt-get upgarde  (這個step會安裝很久...)
sudo apt-get install ubuntu-desktop   (接近2Gb的檔案待安裝,安裝圖形介面)
sudo apt-get install xrdp  (安裝遠端RDP登入)
sudo /etc/init.d/xrdp start (執行xrdp)

OK,打完收工

後續再從Azure管理介面中下載連接檔,就可以在Windows中利用內建的遠端連線進行連接囉

資料科學的入門試題

在資料科學中,怎樣是一個好的第一步呢?

最近在做 Social network Anaysis,可以發現這種重視連線(點與點之間)關係的案例具備有一定的實用性;不過也因為太過複雜,我認為初學者最多就是利用現成套件描繪出圖形,對於進階議題的探討幫助可能不大。不過在Social network Anaysis中,計算距離的概念,其實在很多初階的多變量課本中都有提到,我認為是相當好的入門題,有趣卻又不失直覺 (總不能一開始就叫初學者去學時間序列分析吧…)

想像一個簡單的例題如下:

  A B C D E F
核四興建 1 2 10 9 5 9
反服貿 9 8 1      
破音歌神 2   9 4 5 4
石虎保育 10 10 1 2 5 2

這是一個蠻常見的例子,有7個人對於4種議題的贊同程度予以評分。分數由1~10分進行評比,為了簡化,先假設都是整數…1表示非常不同意,10表示非常同意… 而常常會有人針對特定議題不想要表態,所以有的資料有所缺漏。

在實務上,我們可以把議題置換為其他主題;例如你是一個電子商務老闆,你應該會支持特定的人應該會特別支持特定的商品的這種想法。那些沒有填資料的人,你可以想像是有潛力的客戶,但到底會不會購買呢?? 以我的例子來看 B 應該是比較接近A,而比較不接近 C ,如果你花了大筆的錢針對 B 促銷 “破音歌神” 這項產品,應該是沒有太大的效果…

當然因為我給的例子很簡單,如果今天是有20萬筆資料呢?有1000項商品呢? 那我們適必需要資料科學加以協助…

(1)個體間的差異?最簡單直覺的想法就是用距離的方式

例如 A與C的距離程度 = 9+8+7+9 > A與b的距離程度=1+1+0

  A C 差異(取絕對值)
核四興建 1 10 9
反服貿 9 1 8
破音歌神 2 9 7
石虎保育 10 1 9

 

  A B 差異(取絕對值)
核四興建 1 2 1
反服貿 9 8 1
破音歌神 2   跳過去不算
石虎保育 10 10 0

當然你事後會發現這樣的方式有很多問題,但是反過來說在 Big Data 的狀況下,很多時候不特別採用抽樣技術,反正我手邊的資料就是母體,只要分析的結果具備商業價值也就夠了… 一般來說距離求算的技術至少有3種。

在此例中,我們也發現在計算距離中,處理 Null 值的議題…同樣的東西如果要在Excel不利用VBA方式而用函數直接處理的話,往往要寫成很長的公式。而且Excel Sheet對於任意抽2個來計算並不是很擅長,所以我們會使用類似 Python或是R這種語言來協助。

在算出了距離後呢?

(2)接下來就是要找出那些是相似的?

舉例來說,如果以A為例的話,平均距離計算如下 (定義=總歫離/有評分的議題)

image

可以將 A B 視為是較接近的族群,而A C 之間的距離最遠,彼此間的差異最大

(3)進階處理 Null ? Null值可以用其他值加以取代嗎

回到原先的範例(把一開始的表格再複製一次)

  A B C D E F
核四興建 1 2 10 9 5 9
反服貿 9 8 1      
破音歌神 2   9 4 5 4
石虎保育 10 10 1 2 5 2

B D E F 都有不願意表態的項目

但是我們可以試著將 B 在”破音歌神”的Null值用A的值來取代?

Why 為什麼不用D的值來取代呢? 這樣子的演算法的規則是什麼?主要是因為在這例中,B與A的距離最為接近,自然是採用最接近的來進行取代。

 

其他衍生議題

(1)D 與 F 之間的距離最短為0,但是他們同意都不對「反服貿」議題表態..違反了一開始我們設定的簡易演算法規則

(2)E這位仁兄看來是採取二手政策對於各項議題都採取相對中立的態度…有什麼手法可以將這種誤差予以排除?

(3)在這個範例中,每個人只針對一個議題表達一項意件。而在實務中,往往一個人對於一項產品,不會只購買一次;例如:愛打籃球的高中男生 A,可能在一年內就消費了5雙nike籃球鞋…

所以我說這樣的例題,可以一再衍生很多資料科學中的進階議題;而隨著問題的複雜化,在程式語法中所要熟悉的東西就會從基本的變數設定、資料輸入/輸出、一定延伸至函數、Class撰寫等等議題…

否則對一個半路出家但有志於資料科學的人卻和資工系的學生進行一樣的訓練方式,這樣不是很奇怪嗎?

Python對dictionary資料結構進行排序

在Python 中可以針對 dict 資料結構進行排序,最簡單的做法是使用 lambda

因為在 VBA 中沒有這種類似的用法,所以特別紀錄如下

在 sorted 函數中,key = 你要排序的欄位

如果用 t:t[0] 這樣的表示法表示是針對 dict 中的key 進行排序

如果用 t:t[1] 這樣的表示法表示是針對 dict 中的value 進行排序

這似乎是 lambda 最為常見的使用方式…

而為什麼要這樣做呢? 其實最重要的原因是偷懶…因為其實也可以另外寫成函數另外呼叫,不過如果是排序這種這樣直覺的東西都還要另外寫個函數,實在是太麻煩了…

資料來源參考:http://stackoverflow.com/questions/9001509/python-dictionary-sort-by-key

This question has already been answered, but because it's popular on Google, here's what Python's documentation uses:

>>> from collections import OrderedDict

>>> # regular unsorted dictionary
>>> d = {'
banana': 3, 'apple':4, 'pear': 1, 'orange': 2}

>>> # dictionary sorted by key -- OrderedDict(sorted(d.items()) also works
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('
apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('
pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

>>> # dictionary sorted by length of the key string
>>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
OrderedDict([('
pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])


2014/4/26

Python Dictionary 資料結構中文輸出解決方式

 

為了整理目前 python 在資料科學上學習的進度,自擬了一個輸入資料如下

以 Dict 的資料結構進行輸入

 
people_point = {"A": {"核四興建": 1 , "反服貿":9 , "破音歌神":  2  ,  "石虎保育": 10  },
         "B":  {"核四興建":2 ,  "反服貿":8   ,  "石虎保育":  10 },
         "C":  {"核四興建": 10 ,  "反服貿": 1 , "破音歌神":  9  ,  "石虎保育":1   },
         "D": {"核四興建": 9   , "破音歌神":  4  ,  "石虎保育": 2  },
         "E": {"核四興建": 5    , "破音歌神":  5  ,  "石虎保育":5   },
         "F": {"核四興建":9 ,    "破音歌神": 4   ,  "石虎保育":  1 }
             }

然後在輸出時遇上了問題:

{'A': {'\xa4\xcf\xaaA\xb6T': 9, '\xa5\xdb\xaa\xea\xabO\xa8|': 10, '\xaf}\xad\xb5\xbaq\xaf\xab': 2, '\xae\xd6\xa5|\xbf\xb3\xab\xd8': 1}, 'C': {'\xa4\xcf\xaaA\xb6T': 1, '\xa5\xdb\xaa\xea\xabO\xa8|': 1, '\xaf}\xad\xb5\xbaq\xaf\xab': 9, '\xae\xd6\xa5|\xbf\xb3\xab\xd8': 10}, 'B': {'\xa4\xcf\xaaA\xb6T': 8, '\xa5\xdb\xaa\xea\xabO\xa8|': 10, '\xae\xd6\xa5|\xbf\xb3\xab\xd8': 2}, 'E': {'\xa5\xdb\xaa\xea\xabO\xa8|': 5, '\xaf}\xad\xb5\xbaq\xaf\xab': 5, '\xae\xd6\xa5|\xbf\xb3\xab\xd8': 5}, 'D': {'\xa5\xdb\xaa\xea\xabO\xa8|': 2, '\xaf}\xad\xb5\xbaq\xaf\xab': 4, '\xae\xd6\xa5|\xbf\xb3\xab\xd8': 9}, 'F': {'\xa5\xdb\xaa\xea\xabO\xa8|': 1, '\xaf}\xad\xb5\xbaq\xaf\xab': 4, '\xae\xd6\xa5|\xbf\xb3\xab\xd8': 9}}

一開始上網查詢,確定是編碼的問題

但無論我如何將 dict 轉換成 str 格式就是無法轉成 unicode 格式

我想這可能是 dict 資料格式先天上的限制,我是使用 Python 2.7 的版本

後來查詢到解決方法如下:

在程式的最前頭加上 import json

在輸出時用這樣的語法輸出

print json.dumps(people_point["A"], encoding="utf-8", ensure_ascii=False) #指定

print json.dumps(people_point, encoding="utf-8", ensure_ascii=False) # 輸出整個 dict

則結果如下:

輸出結果1:

{"反服貿": 9, "石虎保育": 10, "破音歌神": 2, "核四興建": 1}

輸出結果2:

{"A": {"反服貿": 9, "石虎保育": 10, "破音歌神": 2, "核四興建": 1}, "C": {"反服貿": 1, "石虎保育": 1, "破音歌神": 9, "核四興建": 10}, "B": {"反服貿": 8, "石虎保育": 10, "核四興建": 2}, "E": {"石虎保育": 5, "破音歌神": 5, "核四興建": 5}, "D": {"石虎保育": 2, "破音歌神": 4, "核四興建": 9}, "F": {"石虎保育": 1, "破音歌神": 4, "核四興建": 9}}

嗯… 看得到中文,還是比較親切的 

==備註==

我在 Python IDEL 輸出是正常

image

在 Visual Studio 2013 的Console輸出視窗中,卻一樣會有亂碼

image

但是在 Visual Studio 2013 裡的 IronPython 2.7 Interactive 中執行的結果也是正常

image

嗯 … 一定是 Visual Studio 2013 那邊的設定沒有調整好… 不過我想這不是資料科學分析的重點,就不深入研究了

題外話:如果是一般字串與物件間的轉換,就不需要這樣麻煩

[筆記]物件導向-其二

物件導向裡面有三大特性

其實這三大特性,是相對於過往的純程序性語言而來…這樣被認定的優點,就是對過往的歷史所持的反對票;不過有時候是文人相輕,事實上程序性語言也不是什麼壞東西。只能說色色樣樣的程式語言只是工具,而不是目的,這是學習過程中要特別注意的…反正物件導向語言的重點就是在於物件彼此間的互動狀況。

(1)封裝性

很單純就是為了隱藏,只留下介面供存取;並且解決了全域變數的議題

這樣的東西在日常生活中也常常發生,例如:應該沒有幾個人明確的知道電梯的運作原理吧? 但是每個人進了電梯後,都知道依據狀況,按下不同按鈕,例如:「開門」、「關門」、「開門延長」,當然最重要的是「到達樓層」,而且當電梯到達了目的地,電梯門還會自動打開哩…

例如:在C#中,你可以特意將class中的各式屬性給予隱藏(都設成previate),只留下介面讓使用者使用;反過來說,其實電腦完美的將個別不同的物件分別綁住不同的變數與方法,將整理的麻煩工作直接交給電腦…

(2)繼承性

很多書都用什麼父親、兒子之類的舉例;或是鳥類 vs 公雞、企鵝啦….我覺得只會愈看愈火大。

其實不用想這麼多,就從實務的狀況來想就是,繼承性只是為了少寫程式碼而做出來的對策;舉例來說,你今天想要寫一個 RPG 遊戲,而其中最大的賣點是 轉職系統。可能有多種職業,像是勇者可以到處偷東西而不被關、魔法師可以使用高級黑魔法、格鬥家可以裝備拳擊手套、弓箭手可以裝備弓箭…等等。在沒有物件導向的年代,你就要這樣寫

class 勇者{   }

class 魔法師{   }

class 格鬥家{   }…

諸如此類的,可是你會發現除了職業間的差異外,其實有很多共通的特性啊,像是 HP、MP、物理攻擊力、智力、魔法攻擊力、魔法防御力、速度之類的屬性都是共通的;或是像 逃跑() 這類的方法應該也是共同的。重複的複製貼上動作真的很辛苦。所有人有想到,那我就將這些相同的特性給獨立出來,也許新建一個基本類別叫

class player(  }就解決一切…而再針別針別職業特殊性進行物件設定即可

所以說穿了,就是想要 Reuse 就是要做好環保的工作;實務上也有讓程式碼好維護的作用…

(3)多型

物件導向相對於過往的程序語言,這算是一個很特別的機制,就是讓你有用相同的呼叫端來做不同的事(舉例:求算面積時,計算長方形的面積、計算圓形面積的公式並不相同,前者不需要圓周率、後者需要圓周率的介入,但對於使用者而言,只要在程式執行時告訴電腦你要算的是什麼,然後需要你想要計算的值,事情就解決…後續就算再增加一些奇奇怪怪的2D面積計算需求,也只需要再新建新的class加以定義即可。你的呼叫端基本上無需進行任何改變。這對於程式的維護有很大的幫助;

可以想像在遊戲中,隨著遊戲時間的增加,多了更多職業可供轉職;但此時,你一定只需要在相同的介面下進行轉職即可…你不需要去擔心會因此在操作上有所不同

而在 C# 中要實做這個,常常會在基本類別使用 virtual 關鍵字,而在衍生類別中使用 override(改寫);並利用基本類別的陣列來存取子類別的參考 (因為實際上子類別因有繼承行為,所以所佔的記憶體空間一定大於基本類別,所以陣列實際上是有紀錄記憶體位址而已,而這一切都是要程式執行時才會發生,所以討論多型時常常會看到”動態”這2個字。

 

….

2014/4/25

[筆記]物件導向-其一

因為是自學程式,所以在學習的過程中,往往一個簡單的範例要想好幾次才想得通

所以覺得有必要將一些學習心得寫下來做個紀錄

在目前主流的程式語言中,可以聽得到物件導向這個名詞

其實「路過」的程式語言愈多,就會覺得很多名詞的發明好像只是為了追求一種流行做為一種標榜,好像什麼多層次搭配,說穿了就是因為身材不夠完美,所以利用視覺上的錯覺來讓外表更符合想要傳達的印象。反過來,只要你的腿夠長,身材夠完美,其實是不太需要類似的技巧,根據你需要的場合來進行決策即可

好比物件導向,我一開始學習的時候也覺得蠻恐怖的;當然,我相信事情如果要深究到完美,一定有很多事情需要注意。但並不是每個人都是資工背景。有時候我只是需要針對一個中型的計量問題進行處理,程式寫得笨一點速度比人家慢了好幾倍,在現在CPU不是很值錢的年代,似乎也不是什麼大問題?? 注意哦,我寫的是中小型的問題,如果是超大型而複雜的問題,光是演算法的學問就可以寫成好幾本論文….

我對於物件的認識如下

(1)為了簡化程式語寫的複雜度

(2)物件導向的要件

   定義一個類別 (class) → 描述物件裡面的變數 → 編寫建議程序 → 編寫方法

我覺得大致上就是如此

例如:你知道想要做一個類別叫做蜘蛛;一定是你的程式中,有需要用到各種類型的蜘蛛是吧?? 然後再針對你需要的物件特性,例如可能是顏色、大小、攻擊力、魔法攻擊力進行定義。然後再看看沒有什麼方法,好比物件攻擊()、魔法攻擊()

(3)使用物件

   物件都是需要宣告後才能使用;就像一般程式語言中,你要使用一個變數也要先告訴電腦,這個變數x是整數,那個變數y是浮點數哦。同樣的,物件也有類似特性;就把自己定義好的類別想像成一種資料型態,你只是在確定需求的狀況下,予以實體化。

   在Fate/stay night的故事中,主角使用的是一種叫做「投影」的魔法技巧。在劇情中只要魔力充足的狀況下,就可以將看過的武器予以無限制的仿製後再利用。我覺得這個和程式語言其實還蠻像的啊,只要你的記憶體與運算資源是充足的,而你又能完美的瞭解到每個仿製對象(類別)的使用方式,並且予以適當的安排,就可以充分達到你要的效果…

    進而達到無限劍製(Unlimited Blade Works)的境界

嗯…果然是個人心得啊

自訂網域名稱

在購入了 Moebigdata.com 網域後,首先就是要將常用的網站給指向過來

設定的概念如下:

你所持有/維護的網站,與所購買的網域供應商往往不是同一家廠商,所以要進行指定。好比你訂了一件新衣服,但賣你衣服的店家,不一定是製造衣服的廠商;所以你要說明清楚你想要的是怎樣的衣服,最簡單的狀況就是同時通知這2個廠商就絕對不會有錯。

你可能會問,一般實務上我不是直接向賣衣服的那家公司說明就好了嗎??但在網路世界,你應該不會想要隨便想要把在A廠商的帳號與密碼告訴B廠商吧…

好在目前的設定都還算是蠻純的,基本上就是進入網域販賣公司的管理介面進行新增設定即可,主要集中在 CNAME(Alias)與A(Host)

所以設定上的邏輯就是,先去查詢你要轉向網域的指導說明,依設定說明進行設定。

 

image

例如 Bogger的設定方式:

在Blogger中啟用自定網域→依Google指定方式自行到Godaddy進行設定(新增2組CNAME與4組A) →打完收工

 

而Azure上托管的網站服務也是一樣的邏輯,只是微軟需要大家大力支持 Azure 的營運,所以免費等級的網站是不能夠自訂網域 (新增1組CNAME與1組A)

 

延申說明:

如何在網誌使用自訂網域名稱?

Configuring a custom domain name for an Azure Web Site-Azure

Live Writer多重帳號切換 bug

微軟推出的Windows Live Writer 應該還是目前地球上最好的Blog寫作軟體

(因為根本沒有其他競爭對手,大家都轉成玩Facebook囉)

也支援多重帳號,但是今日使用發現異常

解法之道:

把程式關掉再重新執行就可以了…