2021年10月20日 星期三

百香果Python程式設計教材

誰說大學教師一定要有博士學位呢?有數十年的經驗的傑出農民也能成為大學最棒的業師,傳授學生如何為百香果搭建棚架,農民業師與師生共同討論要如何搭會比較適合百香果生長⋯⋯。

以下是南開科技大學推動大學社會責任實踐計畫-南投百香果資源永續之煉銀網平台所發展出來的教材。

基礎篇
  1. Python一下百香果故鄉在南投埔里
  2. 百香果含有超過130種以上的芳香物質,130是整數還是字串?
  3. 從百香果分級來看Python的List串列資料結構
  4. 用Python多層容器來儲存百香果大小規格,並用切片來存取
  5. 百香果分級標準居然可以用不可更改的元組來表示
  6. 一堆不可以重複以及改變值的資料的集合可用來百香果分級判斷
  7. 超好用的字典,用鍵查值的觀念來查百香果的分級標準
  8. 用百香果資料串列來學習Python的迴圈
  9. 用百香果資料串列來學習Python的分支
  10. 用字典來表示不同地區的百香果別名
應用篇
  1. 用Python找出埔里地區的文化資產
  2. 用Python來撰寫顯示今天百香果市場交易情形的程式
  3. 用Python來顯示今天各市場百香果交易的統計圖
  4. 使用Python和Django設計百香果農產品交易行情網站
  5. 用Python撰寫「用戶定義的HTTP回呼」結合IFTTT服務在LINE群組報導百香果交易情形
  6. 使用Python/pyecharts四行程式搞定百香果近8年的交易行情圖
  7. 用Python實作水果分類器
  8. Python實作各種水果分類器那一種最好?
  9. 利用最近鄰居法(KNN)搭配matplotlib畫出水果分類圖
  10. 百香果交易行情網站設計(一) - 取得百香果市場交易
  11. 百香果交易行情網站設計(二) - 四個步驟搞定Mezzanine
  12. 百香果交易行情網站設計(三) - 更換主題醜小鴨變天鵝
  13. 百香果交易行情網站設計(四) - 讓Mezzanine承接自己的意圖
  14. 初體驗! 使用pyecharts以水果交易行情為例
  15. 使用Flask模板瑄染,製作水果交易網站
  16. 製作水果交易網站(一) -在Django中用pyecharts製作圖表
  17. 製作水果交易網站(二) - 前後台分離
  18. 製作水果交易網站(三) - 定時全量更新數據
  19. 製作水果交易網站(四) - 定時增量更新圖表
  20. 利用Python透過氣象開放資料平台取得百香果故鄉的氣象資料
  21. 利用MicroPython透過OpenWeather取得百香果故鄉的氣象資料
  22. 十個步驟輕輕鬆鬆利用Mezzanine打造百香果交易行情網站
  23. 三個Python指令用來初探農情報告資訊網來看百香果的故鄉在南投
  24. 四個Python指令以POST命令爬出台灣各縣市百香果作物農情
  25. 不到20行Python程式就能從農情報告資訊網中算出南投百香果產值佔合國87.7%
  26. 用Pandas套件來處理農情報告資訊網特別好用
  27. 用十行Python指令,就可以得南投各鄉鎮百香果的生產情形
  28. 百香果生產的前十名鄉鎮有那些?Python一下!
  29. 用Python爬農情報告可以得知南投近十年來在百香果的耕種面積成長快一倍
  30. 用Python爬農情報告瞭解南投近十年的百香果一級農業的狀況
  31. 用Python爬出南投百香果生產成本以及報酬

2021年8月29日 星期日

 學生參與USR計畫課程展現百香果導覽解說成效


(學生團隊請教果農及認識百香果)


本校百香果USR計畫,透過休閒事業管理系開設的導覽解說課程,培育學生休閒農業旅遊相關基礎能力。該課程讓學生瞭解理論基礎、導覽解說媒體、原則、技巧,並以實務操作方式進行介紹。藉由課程,同學除了熟悉導覽解說相關概念,透過小組合作學習方式,進行導覽解說景點規劃、實地踏查、資訊收集、影像拍攝,完成導覽解說報告。報告係針對選定之觀察主題,進行該主題之資料收集、解說腳本撰寫、進行解說導覽並製作解說導覽影片,藉此學習導覽解說實務能力。

  1. 學生(團隊)姓名:盧O富、毛O暄、劉O珊、葉O沛
  2. 授課教師:洪崇彬
  3. 課程名稱:導覽解說
  4. 受訪農民:埔里大坪頂 綠野仙踪休閒農場 游山桂先生
  5. 成果介紹:
(1)小組投入:
本課程介紹埔里合成里的百香果品種、種植與生產、百香果農場環境、社區具特色之休閒觀光資源及人文歷史,觸發小組對合成里產生興趣並進一步深入探討百香果之種植與生產,作為導覽解說報告題材。
(2)資訊收集與實地採訪:
小組成員首先收集埔里合成里相關之文獻與資訊,從學長姐專題製作成果「農產品觀光旅遊專題-以百香果為例」、「行動導覽系統之建置-以埔里合成里農村觀光為例」及參與USR計畫辦理之合成里場域活動,獲得有關合成里百香果相關資訊,進而訪問百香果農,並進行影像拍攝、剪輯、後製,完成後於學期末上台報告並展示成果。

 

 

(學生團隊採訪果農游山桂先生)



2021年7月27日 星期二

用Python爬出南投百香果生產成本以及報酬

農產品生產成本調查資料:https://data.coa.gov.tw/open_detail.aspx?id=lowkVAjACbtM
從上方這篇文章中的公式如下:
農家賺款 = 家族勞動報酬+自家土地地租+自有 資金資本利息
家族勞動報酬 = 損益 + 自家人工費
損益 = 粗收益 - 生產費用總計(第二種生產費)
粗收益 = 主產物價值 + 副產物價值 
第二種生產費 = 第一種生產費 + 地租 + 利息
第一種生產費 = 直接成本 + 間接成本 - 副產物價值

經由程式計算取得下列資訊:
  第二種成本 (35) : 2412.9058
  第一種成本 (34) : 1849.5991
   農家賺款 (33) : 1050746.6948
  家族勞動報酬(32) : 1034704.7943
  損   益 (31) : 921067.9429
  粗 收 益 (30) : 1721640.2956

1.首先要先瞭解資料的結構。
資料介接:https://data.coa.gov.tw/Service/OpenData/TransService.aspx?UnitId=lowkVAjACbtM
2.爬蟲基本程式架構,從上圖可以看出,取出"百香果"的Key是"PRODUCTION",程式設計如下:

1
2
3
4
5
6
7
import requests
import json
r = requests.get('https://data.coa.gov.tw/Service/OpenData/TransService.aspx?UnitId=lowkVAjACbtM')
text = json.loads(r.text)
for row in text:
    if '百香果' in row['PRODUCTNAME']:
        print (row)

執行結果:

3.雜亂的JSON格式,我們取出兩個重要的KEY,一個是'PRICE',另一個是'COSTITEM',設計程式如下:

1
2
3
4
5
6
7
import requests
import json
r = requests.get('https://data.coa.gov.tw/Service/OpenData/TransService.aspx?UnitId=lowkVAjACbtM')
text = json.loads(r.text)
for row in text:
    if '百香果' in row['PRODUCTNAME']:
        print (row['COSTITEM'],':', row['PRICE'])

執行結果:

4.居然發現成本資料有重複現象,重複部份在上圖反白部份,仔細檢查原始資料。



5.發現"COUNTYNAME",一個有標示"南投縣",一個是空字串,因此過濾程式如下:
1
2
3
4
5
6
7
8
import requests
import json
r = requests.get('https://data.coa.gov.tw/Service/OpenData/TransService.aspx?UnitId=lowkVAjACbtM')
text = json.loads(r.text)
for row in text:
    if '百香果' in row['PRODUCTNAME']:
        if row['COUNTYNAME'] == '南投縣':
            print (row['COSTITEM'],':', row['PRICE'])土

執行結果:

6.依照文章內的公式,只留幾個重要的資訊,其程式如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import requests
import json
r = requests.get('https://data.coa.gov.tw/Service/OpenData/TransService.aspx?UnitId=lowkVAjACbtM')
text = json.loads(r.text)
for row in text:
    if '百香果' in row['PRODUCTNAME']:
        if row['COUNTYNAME'] == '南投縣':
            if row['COSTITEM'] in ['   農家賺款 (33)',
                                   '  家族勞動報酬(32)',
                                   '  損   益 (31)',
                                   '  粗 收 益 (30)',
                                   '  第二種成本 (35)',
                                   '  第一種成本 (34)']:
                print (row['COSTITEM'],':', row['PRICE'])

執行結果:


2021年7月26日 星期一

用Python爬農情報告瞭解南投近十年的一級百香果產業的狀況



資料來源:農情報告資源網(https://agr.afa.gov.tw/afa/afa_frame.jsp)

本篇文章從農情報告資源網中,使用Python結合爬蟲和製表的工具,來觀察近十年南投百香果產業的發展情形。

程式:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#使用爬蟲技術取得資料
import requests
from bs4 import BeautifulSoup
import pandas as pd
my_years = ['100', '101', '102', '103', '104', '105', '106', '107', '108', '109']
my_data = {'accountingyear': '109', 'item': '03', 'crop':'643', 'city':'0008'}
my_area = []
my_yield = []
for year in my_years:
    my_data['accountingyear'] = year
    r = requests.post("https://agr.afa.gov.tw/afa/pgcropcity.jsp",my_data )
    soup = BeautifulSoup(r.text, 'lxml')
    result = soup.find("div", class_="DivRestTbl")
    dfs = pd.read_html(str(result))
    df = dfs[0]
    my_area.append(df.at[2,1])
    my_yield.append(df.at[2,4])
#繪製圖表
from pyecharts import Bar, Line, Overlap
bar = Bar()
bar.add("百香果耕種面積", my_years, my_area)
line = Line()
line.add("百香果收量", my_years, my_yield)
overlap = Overlap()
overlap.add(bar)
overlap.add(line, is_add_yaxis=True, yaxis_index=1)
overlap.render()
#請用瀏覽器打開reder.html檔案即可以觀看

用Python爬農情報告可以得知南投近十年來在百香果的耕種面積成長快一倍


資料來源:農情報告資源網(https://agr.afa.gov.tw/afa/afa_frame.jsp)

從上圖我們可以看出南投近十年來在百香果的耕種面積成長快一倍。

程式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
#使用爬蟲技術取得資料
import requests
from bs4 import BeautifulSoup
import pandas as pd
my_years = ['100', '101', '102', '103', '104', '105', '106', '107', '108', '109']
my_data = {'accountingyear': '109', 'item': '03', 'crop':'643', 'city':'0008'}
my_area = []
for year in my_years:
    my_data['accountingyear'] = year
    r = requests.post("https://agr.afa.gov.tw/afa/pgcropcity.jsp",my_data )
    soup = BeautifulSoup(r.text, 'lxml')
    result = soup.find("div", class_="DivRestTbl")
    dfs = pd.read_html(str(result))
    df = dfs[0]
    my_area.append(df.at[2,1])
#繪製圖表
from pyecharts.charts import Bar
bar = Bar()
bar.add_xaxis(my_years)
bar.add_yaxis("耕種面積", my_area)
bar.render()
#請用瀏覽器打開reder.html檔案即可以觀看

2021年7月25日 星期日

梅生產的前十名鄉鎮有那些?Python一下!

 

程式:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import requests
from bs4 import BeautifulSoup
import pandas as pd
my_data = {'accountingyear': '109', 'item': '03', 'crop':'635',
    'city':'0008', 'desc_asc':'desc'}
r = requests.post("https://agr.afa.gov.tw/afa/pgcropmeaqty_all.jsp",my_data )
soup = BeautifulSoup(r.text, 'lxml')
result = soup.find("div", class_="DivRestTbl")
dfs = pd.read_html(str(result))
df = dfs[0]
for item in range(1, 11):
    print("種植面積排第{}名的鄉鎮是{}, 佔合全國收量的{}%".format(
        item, df.at[item+2,0], int(df.at[item+2,4])/int(df.at[2,4])*100))

可可生產的前十名鄉鎮有那些?Python一下!

 

可可全國生產最多鄉鎮是南投的名間鄉,佔全國收量20.3%。

程式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import requests
from bs4 import BeautifulSoup
import pandas as pd
my_data = {'accountingyear': '109', 'item': '03', 'crop':'647',
    'city':'0008', 'desc_asc':'desc'}
r = requests.post("https://agr.afa.gov.tw/afa/pgcropmeaqty_all.jsp",my_data )
soup = BeautifulSoup(r.text, 'lxml')
result = soup.find("div", class_="DivRestTbl")
dfs = pd.read_html(str(result))
df = dfs[0]
for item in range(1, 11):
    print("可可種植面積排第{}名的鄉鎮是{}, 佔合全國收量的{}%".format(
        item, df.at[item+2,0], int(df.at[item+2,4])/int(df.at[2,4])*100))

香蕉生產的前十名鄉鎮有那些?Python一下!


 程式:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import requests
from bs4 import BeautifulSoup
import pandas as pd
my_data = {'accountingyear': '109', 'item': '03', 'crop':'601',
    'city':'0008', 'desc_asc':'desc'}
r = requests.post("https://agr.afa.gov.tw/afa/pgcropmeaqty_all.jsp",my_data )
soup = BeautifulSoup(r.text, 'lxml')
result = soup.find("div", class_="DivRestTbl")
dfs = pd.read_html(str(result))
df = dfs[0]
for item in range(1, 11):
    print("香蕉種植面積排第{}名的鄉鎮是{}, 佔合全國收量的{}%".format(
        item, df.at[item+2,0], int(df.at[item+2,4])/int(df.at[2,4])*100))

節瓜生產的前十名鄉鎮有那些?Python一下!




很難想像,節瓜的重要產地是在南投仁愛鄉,佔全國的60%。

程式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import requests
from bs4 import BeautifulSoup
import pandas as pd
my_data = {'accountingyear': '109', 'item': '03', 'crop':'485',
    'city':'0008', 'desc_asc':'desc'}
r = requests.post("https://agr.afa.gov.tw/afa/pgcropmeaqty_all.jsp",my_data )
soup = BeautifulSoup(r.text, 'lxml')
result = soup.find("div", class_="DivRestTbl")
dfs = pd.read_html(str(result))
df = dfs[0]
for item in range(1, 11):
    print("節瓜種植面積排第{}名的鄉鎮是{}, 佔合全國收量的{}%".format(
        item, df.at[item+2,0], int(df.at[item+2,4])/int(df.at[2,4])*100))

茭白筍生產的前十名鄉鎮有那些?Python一下!

 



茭白筍和百香果都是南投埔里鎮很重要的產物,高居全國榜首,佔88.2%,程式:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import requests
from bs4 import BeautifulSoup
import pandas as pd
my_data = {'accountingyear': '109', 'item': '03', 'crop':'418',
    'city':'0008', 'desc_asc':'desc'}
r = requests.post("https://agr.afa.gov.tw/afa/pgcropmeaqty_all.jsp",my_data )
soup = BeautifulSoup(r.text, 'lxml')
result = soup.find("div", class_="DivRestTbl")
dfs = pd.read_html(str(result))
df = dfs[0]
for item in range(1, 11):
    print("茭白筍種植面積排第{}名的鄉鎮是{}, 佔合全國收量的{}%".format(
        item, df.at[item+2,0], int(df.at[item+2,4])/int(df.at[2,4])*100))

食用蕃茄生產的前十名鄉鎮有那些?Python一下!

 




程式:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import requests
from bs4 import BeautifulSoup
import pandas as pd
my_data = {'accountingyear': '109', 'item': '03', 'crop':'425',
    'city':'0008', 'desc_asc':'desc'}
r = requests.post("https://agr.afa.gov.tw/afa/pgcropmeaqty_all.jsp",my_data )
soup = BeautifulSoup(r.text, 'lxml')
result = soup.find("div", class_="DivRestTbl")
dfs = pd.read_html(str(result))
df = dfs[0]
for item in range(1, 11):
    print("食用蕃茄收量排第{}名的鄉鎮是{}, 佔合全國收量的{}%".format(
        item, df.at[item+2,0], int(df.at[item+2,4])/int(df.at[2,4])*100))

薑生產的前十名鄉鎮有那些?Python一下!




薑也是南投的重要產物,前十名鄉鎮就有4個。
程式:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import requests
from bs4 import BeautifulSoup
import pandas as pd
my_data = {'accountingyear': '109', 'item': '03', 'crop':'441',
    'city':'0008', 'desc_asc':'desc'}
r = requests.post("https://agr.afa.gov.tw/afa/pgcropmeaqty_all.jsp",my_data )
soup = BeautifulSoup(r.text, 'lxml')
result = soup.find("div", class_="DivRestTbl")
dfs = pd.read_html(str(result))
df = dfs[0]
for item in range(1, 11):
    print("種植面積排第{}名的鄉鎮是{}, 佔合全國收量的{}%".format(
        item, df.at[item+2,0], int(df.at[item+2,4])/int(df.at[2,4])*100))

咖啡生產的前十名鄉鎮有那些?Python一下!


 程式:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import requests
from bs4 import BeautifulSoup
import pandas as pd
my_data = {'accountingyear': '109', 'item': '03', 'crop':'337',
    'city':'0008', 'desc_asc':'desc'}
r = requests.post("https://agr.afa.gov.tw/afa/pgcropmeaqty_all.jsp",my_data )
soup = BeautifulSoup(r.text, 'lxml')
result = soup.find("div", class_="DivRestTbl")
dfs = pd.read_html(str(result))
df = dfs[0]
for item in range(1, 11):
    print("咖啡種植面積排第{}名的鄉鎮是{}, 佔合全國收量的{}%".format(
        item, df.at[item+2,0], int(df.at[item+2,4])/int(df.at[2,4])*100))

茶生產的前十名鄉鎮有那些?Python一下!

 



在南投除了百香果外,茶也是重要的生產作物,前4名鄉鎮都是由南投包辦。
程式碼如下:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import requests
from bs4 import BeautifulSoup
import pandas as pd
my_data = {'accountingyear': '109', 'item': '03', 'crop':'305',
    'city':'0008', 'desc_asc':'desc'}
r = requests.post("https://agr.afa.gov.tw/afa/pgcropmeaqty_all.jsp",my_data )
soup = BeautifulSoup(r.text, 'lxml')
result = soup.find("div", class_="DivRestTbl")
dfs = pd.read_html(str(result))
df = dfs[0]
for item in range(1, 11):
    print("種植面積排第{}名的鄉鎮是{}, 佔合全國收量的{}%".format(
        item, df.at[item+2,0], int(df.at[item+2,4])/int(df.at[2,4])*100))

百香果生產的前十名鄉鎮有那些?Python一下!


 
找出百香果生產的前十名鄉鎮的程式列表:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import requests
from bs4 import BeautifulSoup
import pandas as pd
my_data = {'accountingyear': '109', 'item': '03', 'crop':'643', 'city':'0008', 'desc_asc':'desc'}
r = requests.post("https://agr.afa.gov.tw/afa/pgcropmeaqty_all.jsp",my_data )
soup = BeautifulSoup(r.text, 'lxml')
result = soup.find("div", class_="DivRestTbl")
dfs = pd.read_html(str(result))
df = dfs[0]
print(df[:13])

程式解說,增加個參數值{'desc_asc':'desc'},表示用遞減方式排列。


從以上的數據來看就可以知道南投縣埔里鎮佔全全國收量的83%,而第二名是台中市后里區佔1.4%, 第三名以後都不到1%。
程式如下:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import requests
from bs4 import BeautifulSoup
import pandas as pd
my_data = {'accountingyear': '109', 'item': '03', 'crop':'643',
    'city':'0008', 'desc_asc':'desc'}
r = requests.post("https://agr.afa.gov.tw/afa/pgcropmeaqty_all.jsp",my_data )
soup = BeautifulSoup(r.text, 'lxml')
result = soup.find("div", class_="DivRestTbl")
dfs = pd.read_html(str(result))
df = dfs[0]
for item in range(1, 11):
    print("百香果種植面積排第{}名的鄉鎮是{}, 佔合全國收量的{}%".format(
        item, df.at[item+2,0], int(df.at[item+2,4])/int(df.at[2,4])*100))


2021年7月24日 星期六

用十行Python指令,就可以得南投各鄉鎮百香果的生產情形


 上圖的用十行Python指令,就可以得南投各鄉鎮百香果的生產情形,程式碼如下:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import requests
from bs4 import BeautifulSoup
import pandas as pd
my_data = {'accountingyear': '109', 'item': '03', 'crop':'643', 'city':'0008'}
r = requests.post("https://agr.afa.gov.tw/afa/pgcroptown.jsp",my_data )
soup = BeautifulSoup(r.text, 'lxml')
result = soup.find("div", class_="DivRestTbl")
dfs = pd.read_html(str(result))
df = dfs[0]
print(df)

瞭解埔里鎮佔全南投縣的佔比是?

程式碼:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import requests
from bs4 import BeautifulSoup
import pandas as pd
my_data = {'accountingyear': '109', 'item': '03', 'crop':'643', 'city':'0008'}
r = requests.post("https://agr.afa.gov.tw/afa/pgcroptown.jsp",my_data )
soup = BeautifulSoup(r.text, 'lxml')
result = soup.find("div", class_="DivRestTbl")
dfs = pd.read_html(str(result))
df = dfs[0]
print('埔里鎮百香果的收量是', df.at[9,4], df.at[1,4])
print('南投百香果的收量是', df.at[15,4], df.at[1,4])
print('埔里百香果收量佔南投縣的', int(df.at[9,4])/int(df.at[15,4])*100, '%')