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, '%')

用Pandas套件來處理農情報告資訊網特別好用

 


程式:

1
2
3
4
5
6
7
8
9
import requests
from bs4 import BeautifulSoup
import pandas as pd
my_data = {'accountingyear': '109', 'item': '03', 'crop':'643', 'city':'00'}
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))
print(dfs)

計算南投百香果的收量佔全國多少比率?
 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':'00'}
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]
print('南投縣百香果的收量是', df.at[9,4], df.at[1,4])
print('全國百香果的收量是', df.at[21,4], df.at[1,4])
print('南投百香果收量佔全的', int(df.at[9,4])/int(df.at[21,4])*100, '%')

執行結果:

不到20行Python程式就能從農情報告資訊網中算出南投百香果產值佔合國87.7%

今天是放假日,但花時間研究的問題是:為什麼百香果的故鄉是在南投?每次有人問這個問題,總是要上網找資料, 本篇文章將介紹如何用不到20行Python程式就能從農情報告資訊網中算出南投百香果產值佔合國87.7%。

以下是程式的執行結果:


程式碼:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
import requests
from bs4 import BeautifulSoup
my_data = {'accountingyear': '109', 'item': '03', 'crop':'643', 'city':'00'}
r = requests.post("https://agr.afa.gov.tw/afa/pgcropcity.jsp",my_data )
soup = BeautifulSoup(r.text, 'lxml')
result = soup.find("div", class_="DivRestTbl")
h = {}
n=9
while result.select('td')[n::1]:
    d = {}
    for th, td in zip(result.select('td')[1:5], result.select('td')[n+1::1]):
        d[th.text.strip()] = td.text.strip().splitlines()
    h[result.select('td')[n].text]=d
    n+=5
print('南投縣的收量是', h['南投縣']['收量'][0], result.select('td')[8].text)
print('全國的收量是', h['合\u3000\u3000計']['收量'][0], result.select('td')[8].text)
print('南投收量佔全的',int(h['南投縣']['收量'][0].replace(',',''))/int(h['合\u3000\u3000計']['收量'][0].replace(',',''))*100, '%')

程式解說:
第1-2行為引入爬蟲的套件。
第3-6行是採用POST來讀取資料,並找出<div>標籤且類別為"DivRestTbl"。
第7-14行是把資料打包成二維的字典,且能用縣市來當成鍵值來讀值,而且也能讀取收量等數值。
第15-17值是顯示,注意因收量的值是字串,需要用int()函式來轉換,因為有三位加上',',所以要用replace()函式來去除','。