2019年2月18日 星期一

Python的虛擬環境 (Virtual Environment)

工欲善其事,必先利其器。在寫 python 程式的時候是否有曾經為了裝某些套件時,但是因為被其他套件的版本或是本身 python 的版本限制住,而無法順利安裝完成呢? 我自己目前有使用兩個python的虛擬環境來解決這個問題,一個是 virtual environemnt,另一個是 anaconda (或 miniconda)。
虛擬環境可以提供開發不同程式的時候,使用各自專案所需的開發環境,不會造成相互影響。或是如果有多人在相同平台上面開發程式時,也可以使用虛擬環境來區隔彼此所需的環境。

Virtual Environment

如果你的開發環境還沒有 virtualenv 的話,可以透過 easy_install virtualenv 的指令來安裝。

建立新的虛擬環境使用方式如下

    virtualenv -p /usr/bin/python venv


其中的 -p /usr/bin/python 這段參數是在指定這次建立的虛擬環境要使用哪一個的 python 執行檔;venv 這個參數是在指定這次建立的虛擬環境要放到哪邊。

如何套用建立的虛擬環境

    source venv/bin/activate

透過 source 的指令來指定到剛剛建立的 venv 裡面的 bin/activate 即可。若要離開現在的虛擬環境時,只需要輸入 deactivate 即可。
使用虛擬環境前與使用後的差異如下

如上圖所示,可以發現使用虛擬環境時所使用到的 python 路徑會一併跟著改變了。

如何在虛擬環境安裝套件

    當套用了虛擬環境之後,想要安裝任何的套件時,只需要透過 pip 這個指定直接安裝。

Anaconda (Miniconda)

另一個我有在使用的虛擬環境是 Anaconda/ Miniconda。Anaconda與Miniconda中間的差異主要在於預設的安裝套件,Anaconda 預設安裝的套件較多,許多 machine learning 會使用到的套件都會預設安裝,而 Minicoda 只會預設定裝 python 基本套件。

如何安裝

    Anaconda 與 Miniconda 安裝的說明可以參考下面連結。
    Anaconda - https://docs.anaconda.com/anaconda/install/
    Miniconda - https://conda.io/en/latest/miniconda.html

如何建立虛擬環境

    conda create -n py2 python=2.7

其中的 -n py2 是設定要建立的虛擬環境名稱,後面的 python=2.7 是拿來指定這次環境中 python 的版本。

如何查詢已建立過的虛擬環境

    conda env list

如何使用虛擬環境

    source activate py2

在 conda 裡面要使用虛擬環境跟 virtualenv 有一點點不同,指令 source 後面需要先加上 activate 之後,再加上之前建立的名稱,要離開目前 conda 的環境是要輸入 source deactivate。

如何在虛擬環境安裝套件

    當套用了虛擬環境之後,想要安裝任何的套件時,在 conda 下也可以直接透過 pip 這個指定直接安裝。或是 conda install PACKAGE_NAME。

虛擬環境的應用還蠻方便的,尤其是在開發多個專案的時候又遇到有不同的套件需求時,透過虛擬環境可以避免掉相互影響的問題。

2019年2月13日 星期三

用Python打造一個中文語音入輸入

參考SPEECH TO TEXT首先要安裝下列套件:
1.pip install SpeechRecognition
2.pip install PyAudio
然而怎麼裝都無法成功地裝PyAudio
試了許久都未能成功,很想放棄


在這個網站中
https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyaudio
下載PyAudio-0.2.11-cp37-cp37m-win32.whl檔案
然後輸入下列指令
pip install PyAudio-0.2.11-cp37-cp37m-win32.whl
居然成功安裝

然後輸入下列程式
import speech_recognition as sr
r=sr.Recognizer()
with sr.Microphone() as source:
    print("SAY SOMETHING")
    audio=r.listen(source)
    print("TIME OVER, THANKS")
try:
    print("Text"+r.recognize_google(audio, language='zh-tw'))
except:
    pass
執行結果:
測試成果感覺很好。

2019年2月10日 星期日

以茶文化生活科技打造初鄉茶間

[敏哥和熊學院的于萍(左1)和博淵(右1)合影]



以南開科技大學為中心學校的「智慧科技與產業創新跨校教學聯盟」(簡稱智創聯盟),自104年起執行教育部「智慧生活整合創新教學聯盟推動計畫」,經歷四年即將於今(108)年1月底告一段落。特於108年1月12日(星期六)舉辦計劃總成果展,邀同教育部智慧生活整合性人才培育計畫總計畫主持人蘇朝琴教授、教育部指導委員陳正然先生,教育部資訊及科技教育司藍曼琪女士等,來賓南投市宋市長、鹿谷鄉邱鄉長、資策會李組長、逢甲大學資電學院竇院長、中興新村營北里戰姵鈴里長、光榮里陳武強里長、熊學院家族等,以及南開科技大學許聰鑫副校長、計畫主持人林正敏、智創聯盟教師夥伴等,聚集在南投縣鹿谷鄉初鄉村,為初鄉茶間成為智創聯盟合作的示範場域舉行揭牌儀式,同時為此成果展揭開序幕。

[教育部藍曼琪科長、智活二期計畫主持人蘇朝琴、南開科大許聰鑫副校長、鹿谷鄉邱如平鄉長]

活動過程穿插各計畫主持人以說故事的方式分享執行成果,與聯盟創新團隊為初鄉茶間設計魚腥草AR/VR、貓頭鷹塗鴉AR等作品體驗活動,展示智慧科技與場域的結合,讓與會者透過體驗遊玩,回顧智創聯盟從「文化導向生活科技」重點領域為基礎,以「智慧科技改善弱勢場域,融入在地社區常民生活,以深度旅遊活化在地特色與產業創新」的目標,透過年輕人的創意與活力,最終達成場域與聯盟合作的永續經營。午膳時間,初鄉茶間創辦人李光曜先生準備魚腥草入菜的美食佳餚,讓大家齊聚品嘗。

[初鄉茶間最新的魚鯹草產品以及製作VR的團隊]

[計畫主持人林正敏講解成果]

[大合照]

[大合照,中興新村光榮里陳武強里長(左1)]

[宋市長、資策會李組長、南開科大民生學院林淑份合影]

[營北里戰姵鈴里長(左2)與大家合影]

[虎科大許永和主任正在調整智慧農業的展示成果]

中文字文字轉語音(CN-TTS)模組測試心得

前些日子到廣華電子購買一顆CN-TTS中文字文字轉語音模組,利用春節假期測試一下,該顆IC只需要4條連接線,分別是VCC、TX、RX、和GND,其文件手冊可以在:https://docs.google.com/viewerng/viewer?url=http://shop.cpu.com.tw/upload/2018/06/VOICE-TTS.pdf下載。
由於中文只支援GBK,因此必須經由轉碼才能使用,首先利用WORD把繁體中文轉換成簡體中文,然後經由漢字字符集編碼查詢,如下圖。


再把上圖得到資訊,利用Arduino軟體以及NodeMCU 晶片來設計中文字文字轉語音模組測試程式,程式碼如下:

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
Serial.print(' ');
Serial.print('\xC4');
Serial.print('\xFA');
Serial.print(' ');
Serial.print('\xBA');
Serial.print('\xC3');
Serial.print(' ');
Serial.print('\xC2');
Serial.print('\xF0');
delay(5000);
Serial.print("\xCE\xD2\xBA\xDC\xBA\xC3");
delay(5000);
}

2019年1月9日 星期三

Python網路爬文收集教師發表期刊、論文、專利

資料收集往往要花費許多心力,透過Python網路爬文可以減輕一些人力,本文以網路爬文來協助收集某一位教師的研發能量。
若您沒有網路爬文的經驗,可以先參考Python網路爬文
接下來您可以在網頁上按右鍵,選擇檢視網頁原始碼,如下圖。


從上圖中可以發現,在期刊部份是使用表格來呈現,因此我們可以用for row in soup.find_all('table'),找出所有表格,再用state變數來記得第幾個表格,以期刊論文是在第6表格,所以使用 elif state == 6,我們再利用for column in row.find_all('tr')找出每一篇期刊論文,最後再用for paper in column.find_all('td')來找出期刊論文的資訊。


程式如下:
import requests
from bs4 import BeautifulSoup

url = "http://dli.nkut.edu.tw/people/bio.php?PID=7"
re = requests.get(url)
re.encoding='utf8'
state = 0
sub_state = 0

soup = BeautifulSoup(re.text, 'html.parser')
print(soup.title.string)
for row in soup.find_all('table'):
    if state == 0:
        print(soup.find('td').string)
    elif state == 1:
        substate = 0
        for column in row.find_all('tr'):
            if substate == 1:
                print(column.find('td').string)
            substate+=1
    elif state == 6:
       print(row.find('div').string)
       substate = 0
       for column in row.find_all('tr'):
            if substate > 0:
                print(substate)
            for paper in column.find_all('td'):
                print(paper.string)
            substate+=1
    elif state == 9:
       print(row.find('div').string)
       substate = 0
       for column in row.find_all('tr'):
            if substate > 0:
                print(substate)
            for paper in column.find_all('td'):
                print(paper.string)
            substate+=1
    elif state == 12:
       print(row.find('div').string)
       substate = 0
       for column in row.find_all('tr'):
            if substate > 0:
                print(substate)
            for paper in column.find_all('td'):
                print(paper.string)
            substate+=1
    state+=1

2019年1月2日 星期三

使用matplotlib用python畫出股票交易曲線

import requests
import json
import datetime as dt
import matplotlib.pyplot as plt
import matplotlib.dates as mdates

url = 'http://www.twse.com.tw/exchangeReport/STOCK_DAY?date=%s&stockNo=%s' % ( '20181201', '2892')
r = requests.get(url)
data =json.loads(r.text)

dates = []
y=[]
for row in data['data']:
    dateArr =row[0].split("/")
    date4=dateArr[1]+"/"+dateArr[2]+"/"+str(int(dateArr[0])+1911)
    dates.append(date4)
    y.append(row[6])

x = [dt.datetime.strptime(d,'%m/%d/%Y').date() for d in dates]


plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m/%d/%Y'))
plt.gca().xaxis.set_major_locator(mdates.DayLocator())
plt.plot(x,y)
plt.gcf().autofmt_xdate()
plt.show()

執行結果:

用python撰寫查詢股票當月交易情形

Python在資料讀取以及資料操作上,充份展現其簡單易學的特性,台灣股票交易網站網址為:http://www.twse.com.tw/exchangeReport/STOCK_DAY
採用GET操作方式,只要輸入日期和股票號碼(date=%s&stockNo=%s)即可以讀取當月交易情形。

完整的程式如下:
import requests
import json

url = 'http://www.twse.com.tw/exchangeReport/STOCK_DAY?date=%s&stockNo=%s' % ( '20181201', '2892')
r = requests.get(url)
print(r.text)
data =json.loads(r.text)

print(data['title'])
print(data['fields'])

for row in data['data']:
    print(row)

執行結果:
107年12月 2892 第一金           各日成交資訊
['日期', '成交股數', '成交金額', '開盤價', '最高價', '最低價', '收盤價', '漲跌價差', '成交筆數']
['107/12/03', '23,373,526', '469,242,264', '20.15', '20.15', '20.00', '20.05', '+0.10', '4,980']
['107/12/04', '15,121,883', '302,647,738', '20.00', '20.10', '19.95', '20.00', '-0.05', '4,175']
['107/12/05', '12,664,832', '252,585,050', '19.95', '20.00', '19.90', '19.95', '-0.05', '5,155']
['107/12/06', '16,763,587', '333,492,740', '19.95', '20.00', '19.85', '19.90', '-0.05', '4,907']
['107/12/07', '9,717,030', '193,156,769', '19.85', '19.90', '19.80', '19.85', '-0.05', '3,994']
['107/12/10', '10,270,980', '203,219,118', '19.85', '19.85', '19.75', '19.75', '-0.10', '4,094']
['107/12/11', '12,001,409', '237,158,584', '19.75', '19.85', '19.70', '19.75', ' 0.00', '4,196']
['107/12/12', '13,184,739', '260,919,247', '19.85', '19.85', '19.75', '19.75', ' 0.00', '3,970']
['107/12/13', '10,739,661', '213,827,720', '19.80', '20.00', '19.75', '19.90', '+0.15', '4,031']
['107/12/14', '10,221,597', '203,150,390', '19.85', '19.95', '19.75', '19.95', '+0.05', '3,833']
['107/12/17', '13,792,165', '273,836,050', '19.90', '20.00', '19.75', '19.85', '-0.10', '3,586']
['107/12/18', '13,223,459', '261,472,914', '19.90', '19.90', '19.70', '19.80', '-0.05', '5,231']
['107/12/19', '19,141,904', '378,807,037', '19.75', '19.90', '19.65', '19.90', '+0.10', '5,032']
['107/12/20', '8,733,645', '173,279,787', '19.80', '19.95', '19.75', '19.90', ' 0.00', '2,918']
['107/12/21', '12,112,746', '239,466,603', '19.90', '19.90', '19.75', '19.75', '-0.15', '2,876']
['107/12/22', '3,215,217', '63,488,569', '19.75', '19.80', '19.70', '19.70', '-0.05', '1,387']
['107/12/24', '10,574,031', '208,425,067', '19.70', '19.80', '19.65', '19.80', '+0.10', '4,389']
['107/12/25', '5,641,494', '110,725,582', '19.55', '19.70', '19.55', '19.65', '-0.15', '2,285']
['107/12/26', '5,396,256', '106,223,589', '19.65', '19.75', '19.65', '19.70', '+0.05', '3,127']
['107/12/27', '10,050,848', '199,616,315', '19.90', '19.95', '19.75', '19.85', '+0.15', '3,892']

['107/12/28', '12,457,018', '248,623,710', '19.85', '20.00', '19.80', '20.00', '+0.15', '3,035']