├── cases
├── .gitignore
├── spotify
│ └── spotify_dataset.docx
├── leaflet_map.ipynb
└── mysql.ipynb
├── .gitignore
├── src01.xlsx
├── files
├── 通訊錄.xlsx
└── 垃圾車點位資訊.csv
├── python_data_analysis.docx
├── python_data_analysis.pdf
├── sql
├── 5-1 建立資料庫.sql
├── 5-4 手動還原資料.sql
├── 5-3 新增資料.sql
└── 5-2 建立資料表.sql
├── README.md
├── 2-6 Pandas 建立 DataFrame.ipynb
├── 2-4 Numpy 簡單運算.ipynb
├── 2-5 Pandas 使用 Series.ipynb
├── 2-1 Numpy 建立陣列.ipynb
├── 2-2 Numpy 一維陣列.ipynb
├── 2-3 Numpy 二維陣列.ipynb
└── 3-1 Pandas 檔案輸入與輸出.ipynb
/cases/.gitignore:
--------------------------------------------------------------------------------
1 | *複製*
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .ipynb*
2 | *.csv
3 | test*
--------------------------------------------------------------------------------
/src01.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/telunyang/python_data_analysis/HEAD/src01.xlsx
--------------------------------------------------------------------------------
/files/通訊錄.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/telunyang/python_data_analysis/HEAD/files/通訊錄.xlsx
--------------------------------------------------------------------------------
/files/垃圾車點位資訊.csv:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/telunyang/python_data_analysis/HEAD/files/垃圾車點位資訊.csv
--------------------------------------------------------------------------------
/python_data_analysis.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/telunyang/python_data_analysis/HEAD/python_data_analysis.docx
--------------------------------------------------------------------------------
/python_data_analysis.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/telunyang/python_data_analysis/HEAD/python_data_analysis.pdf
--------------------------------------------------------------------------------
/cases/spotify/spotify_dataset.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/telunyang/python_data_analysis/HEAD/cases/spotify/spotify_dataset.docx
--------------------------------------------------------------------------------
/sql/5-1 建立資料庫.sql:
--------------------------------------------------------------------------------
1 | /* 如果資料庫存在就刪除 */
2 | DROP DATABASE IF EXISTS `my_db`;
3 |
4 | /* 若資料庫不存在則新增,預設字元集為 utf8mb4,定序為 utf8mb4_unicode_ci */
5 | CREATE DATABASE IF NOT EXISTS `my_db`
6 | DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
7 |
8 | /* 指定資料庫 */
9 | USE `my_db`;
--------------------------------------------------------------------------------
/sql/5-4 手動還原資料.sql:
--------------------------------------------------------------------------------
1 | /* 將老師編號為 T001 的姓名,改成 曾○○ */
2 | UPDATE `teachers`
3 | SET `tName` = '曾○○'
4 | WHERE `tId` = 'T001';
5 |
6 | /* 新增一筆資料,學生編號為 088、課程編號為 C004,成績為 94 */
7 | INSERT INTO `scores`
8 | (`sId`, `cId`, `score`)
9 | VALUES
10 | ('088', 'C004', 94);
11 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # python_data_analysis
2 | Python 資料分析
3 |
4 | ## 提問原則
5 | - 通則
6 | - 「課程期間」或「結業前」可提問、討論,要把多餘時間和資源,留給當前上課的學員。
7 | - 寫信
8 | - E-mail: darren@darreninfo.cc
9 | - 信件標題寫上你的**班別和姓名**,或是在哪裡參與我的課程。
10 | - 提問的內容要與本專案有關,**其它課程的部分,去請益原本授課的老師**。
11 | - **不要把程式碼寄給我**,可能沒時間看,討論儘量以解決問題的方向為主。
12 | - 不符合以上幾點,將**直接刪除**,敬請見諒。
13 | - 指導時間
14 | - 有些課的班導會提供指導時間,例如某一天的晚上,學員們可以先整理問題,然後碰面時討論。
15 | - 或是整理給班導,班導會找我討論。
16 | - 社群
17 | - 可以在 Instagram 或 LinkedIn 加我好友,然後透過傳訊來討論。
18 | - 記得跟我說你是哪一班,路人我就只好略過了,我只把時間留給學生 (茶~
19 |
20 | ## 聯絡方式
21 | - [LinkedIn](https://www.linkedin.com/in/telunyang/)
22 | - [Instagram](https://www.instagram.com/darreninfo.cc/)
--------------------------------------------------------------------------------
/sql/5-3 新增資料.sql:
--------------------------------------------------------------------------------
1 | /* 新增學生資料 */
2 | INSERT INTO `students`
3 | (`sId`,`sName`,`sGender`,`sNickname`)
4 | VALUES
5 | ('003', '王○○', '男', '小王'),
6 | ('004', '江○○', '女', '小江'),
7 | ('005', '周○○', '女', '小周'),
8 | ('006', '黃○○', '男', '小黃'),
9 | ('007', '丁○○', '男', '小丁'),
10 | ('008', '鄭○○', '男', '小鄭'),
11 | ('087', '楊○○', '男', '好人'),
12 | ('088', '陳○○', '女', '小白');
13 |
14 | /* 新增課程資料 */
15 | INSERT INTO `courses`
16 | (`cId`, `cName`, `credit`, `isCompulsory`, `tId`)
17 | VALUES
18 | ('C001', '程式設計', 4, 1, 'T001'),
19 | ('C002', '網頁設計', 3, 1, 'T002'),
20 | ('C003', '視覺設計', 2, 1, 'T003'),
21 | ('C004', '網路教學', 4, 1, 'T005');
22 |
23 | /* 新增成績資料 */
24 | INSERT INTO `scores`
25 | (`sId`, `cId`, `score`)
26 | VALUES
27 | ('087', 'C001', 74),
28 | ('087', 'C002', 93),
29 | ('088', 'C002', 63),
30 | ('088', 'C003', 82),
31 | ('088', 'C004', 94);
32 |
33 |
34 | /* 新增老師資料 */
35 | INSERT INTO `teachers`
36 | (`tId`, `tName`)
37 | VALUES
38 | ('T001', '曾○○'),
39 | ('T002', '林○○'),
40 | ('T003', '王○○'),
41 | ('T005', '謝○○');
42 |
--------------------------------------------------------------------------------
/sql/5-2 建立資料表.sql:
--------------------------------------------------------------------------------
1 | /* students(學生資料表) */
2 | CREATE TABLE `my_db`.`students` (
3 | `sId` VARCHAR(3) NOT NULL COMMENT '學生編號',
4 | `sName` VARCHAR(20) NOT NULL COMMENT '學生姓名',
5 | `sGender` VARCHAR(1) NOT NULL COMMENT '學生性別',
6 | `sNickname` VARCHAR(50) NOT NULL COMMENT '學生暱稱',
7 | PRIMARY KEY (`sId`)
8 | ) COMMENT = '學生資料表';
9 |
10 |
11 | /* scores(成績資料表) */
12 | CREATE TABLE `my_db`.`scores` (
13 | `sId` VARCHAR(3) NOT NULL COMMENT '學生編號',
14 | `cId` VARCHAR(4) NOT NULL COMMENT '課程編號',
15 | `score` TINYINT(3) NOT NULL COMMENT '成績',
16 | PRIMARY KEY (`sId`,`cId`)
17 | ) COMMENT = '成績資料表';
18 |
19 |
20 | /* teachers(老師資料表) */
21 | CREATE TABLE `my_db`.`teachers` (
22 | `tId` VARCHAR(4) NOT NULL COMMENT '老師編號' ,
23 | `tName` VARCHAR(10) NOT NULL COMMENT '老師姓名',
24 | PRIMARY KEY (`tId`)
25 | ) COMMENT = '老師資料表';
26 |
27 |
28 | /* courses(課程資料表) */
29 | CREATE TABLE `my_db`.`courses` (
30 | `cId` VARCHAR(4) NOT NULL COMMENT '課程編號',
31 | `cName` VARCHAR(10) NOT NULL COMMENT '課程名稱',
32 | `credit` TINYINT(1) NOT NULL COMMENT '學分',
33 | `isCompulsory` TINYINT(1) NOT NULL COMMENT '是否必修',
34 | `tId` VARCHAR(4) NOT NULL COMMENT '老師編號',
35 | PRIMARY KEY (`cId`, `tId`)
36 | ) COMMENT = '課程資料表';
37 |
38 |
--------------------------------------------------------------------------------
/cases/leaflet_map.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# 安裝 ipyleaflet \n",
8 | "- 進入 anaconda prompt,切換到對應的環境,輸入以下指令:\n",
9 | " - `conda install -c conda-forge ipyleaflet`\n",
10 | "- 會需要用到 requests\n",
11 | " - `pip install requests`\n",
12 | "- ipyleaflet 首頁\n",
13 | " - [連結](https://ipyleaflet.readthedocs.io/en/latest/index.html)\n",
14 | "- Google Map\n",
15 | " - [連結](https://www.google.com.tw/maps)"
16 | ]
17 | },
18 | {
19 | "cell_type": "code",
20 | "execution_count": null,
21 | "metadata": {},
22 | "outputs": [],
23 | "source": [
24 | "# 匯入套件\n",
25 | "from ipyleaflet import Map, Marker, basemaps, basemap_to_tiles\n",
26 | "from ipywidgets import Layout, HTML\n",
27 | "import requests"
28 | ]
29 | },
30 | {
31 | "cell_type": "code",
32 | "execution_count": null,
33 | "metadata": {},
34 | "outputs": [],
35 | "source": [
36 | "'''\n",
37 | "基本操作\n",
38 | "\n",
39 | "參考連結:\n",
40 | "https://ipyleaflet.readthedocs.io/en/latest/usage/index.html\n",
41 | "'''\n",
42 | "# 設定地圖中心點\n",
43 | "center = (25.04882, 121.51375, 17)\n",
44 | "\n",
45 | "# 取得地圖物件\n",
46 | "m = Map(center=center, zoom=15)\n",
47 | "\n",
48 | "# 取得標記物件\n",
49 | "marker = Marker(location=center, draggable=True)\n",
50 | "\n",
51 | "# 將標記物件加入地圖\n",
52 | "m.add(marker)\n",
53 | "\n",
54 | "# 顯示地圖\n",
55 | "display(m)"
56 | ]
57 | },
58 | {
59 | "cell_type": "code",
60 | "execution_count": null,
61 | "metadata": {},
62 | "outputs": [],
63 | "source": [
64 | "'''\n",
65 | "更換地圖\n",
66 | "\n",
67 | "參考連結:\n",
68 | "https://ipyleaflet.readthedocs.io/en/latest/map_and_basemaps/basemaps.html\n",
69 | "'''\n",
70 | "center = (25.04882, 121.51375)\n",
71 | "zoom = 17\n",
72 | "\n",
73 | "# 更換地圖\n",
74 | "m = Map(basemap=basemaps.OpenStreetMap.Mapnik, center=center, zoom=zoom)\n",
75 | "\n",
76 | "# 顯示地圖\n",
77 | "m"
78 | ]
79 | },
80 | {
81 | "cell_type": "code",
82 | "execution_count": null,
83 | "metadata": {},
84 | "outputs": [],
85 | "source": [
86 | "'''\n",
87 | "進階操作\n",
88 | "'''\n",
89 | "# 自訂地圖樣式\n",
90 | "m = Map(\n",
91 | " basemap=basemap_to_tiles(basemaps.Gaode.Normal, \"2024-11-11\"),\n",
92 | " center=(25.04882, 121.51375),\n",
93 | " zoom=17,\n",
94 | " layout=Layout(width='100%', height='600px')\n",
95 | ")\n",
96 | "\n",
97 | "# 加入標記\n",
98 | "m.add(Marker(location=(25.0463287, 121.5148673)))\n",
99 | "\n",
100 | "# 顯示地圖\n",
101 | "m"
102 | ]
103 | },
104 | {
105 | "cell_type": "code",
106 | "execution_count": null,
107 | "metadata": {},
108 | "outputs": [],
109 | "source": [
110 | "'''\n",
111 | "Cafe Nomad:咖啡廳遊牧民族\n",
112 | "https://cafenomad.tw/\n",
113 | "\n",
114 | "臺北咖啡廳資訊 Web API:\n",
115 | "https://cafenomad.tw/api/v1.2/cafes/taipei\n",
116 | "'''\n",
117 | "\n",
118 | "# 發出請求,取得回應\n",
119 | "response = requests.get(url=\"https://cafenomad.tw/api/v1.2/cafes/taipei\")\n",
120 | "\n",
121 | "# 將回應內容以 json 格式 (將 json 字串轉成 dict 或 list) 回傳\n",
122 | "data = response.json()\n",
123 | "\n",
124 | "# 顯示資料型態\n",
125 | "print(type(data))\n",
126 | "\n",
127 | "# 顯示資料筆數\n",
128 | "print(len(data))\n",
129 | "\n",
130 | "# 顯示所有資料\n",
131 | "for obj in data:\n",
132 | " # 取得緯度、經度、名稱、地址\n",
133 | " lat = obj[\"latitude\"]\n",
134 | " lon = obj[\"longitude\"]\n",
135 | " name = obj[\"name\"]\n",
136 | " address = obj[\"address\"]\n",
137 | "\n",
138 | " print(f\"店名: {name}\\t地址: {address}\\t緯度: {lat}\\t經度: {lon}\")"
139 | ]
140 | },
141 | {
142 | "cell_type": "code",
143 | "execution_count": null,
144 | "metadata": {},
145 | "outputs": [],
146 | "source": [
147 | "'''\n",
148 | "加入咖啡廳標記\n",
149 | "\n",
150 | "參考連結:\n",
151 | "[1] ipyleaflet API Reference - marker.title\n",
152 | "https://ipyleaflet.readthedocs.io/en/latest/api_reference/index.html#ipyleaflet.leaflet.Marker.title\n",
153 | "[2] Layers - Popup\n",
154 | "https://ipyleaflet.readthedocs.io/en/latest/layers/popup.html\n",
155 | "'''\n",
156 | "# 發出請求,取得回應\n",
157 | "response = requests.get(url=\"https://cafenomad.tw/api/v1.2/cafes/taipei\")\n",
158 | "\n",
159 | "# 將回應內容以 json 格式 (將 json 字串轉成 dict 或 list) 回傳\n",
160 | "data = response.json()\n",
161 | "\n",
162 | "# 自訂地圖樣式\n",
163 | "m = Map(\n",
164 | " basemap=basemap_to_tiles(basemaps.Gaode.Normal, \"2024-11-11\"),\n",
165 | " center=(25.04882, 121.51375),\n",
166 | " zoom=17,\n",
167 | " layout=Layout(width='100%', height='1000px')\n",
168 | ")\n",
169 | "\n",
170 | "# 加入標記\n",
171 | "for obj in data:\n",
172 | " # 建立標記物件\n",
173 | " marker = Marker(\n",
174 | " # 設定標記位置\n",
175 | " location=(obj['latitude'], obj['longitude']),\n",
176 | " \n",
177 | " # 設定標記是否可拖曳\n",
178 | " draggable=False,\n",
179 | "\n",
180 | " # 將移動到標記位置上,會顯示咖啡廳名稱\n",
181 | " title=f\"{obj['name']}\\n{obj['address']}\",\n",
182 | "\n",
183 | " # 設定 popup\n",
184 | " popup=HTML(value=f\"{obj['name']}
{obj['address']}\")\n",
185 | " )\n",
186 | " \n",
187 | " '''\n",
188 | " # 你也可以另外透過 marker.attribute = value 的方式,設定標記的 title\n",
189 | " marker.title = f\"{obj['name']}\\n{obj['address']}\"\n",
190 | " '''\n",
191 | " \n",
192 | " # 將標記加入地圖\n",
193 | " m.add(marker)\n",
194 | "\n",
195 | "\n",
196 | "# 顯示地圖\n",
197 | "m"
198 | ]
199 | }
200 | ],
201 | "metadata": {
202 | "kernelspec": {
203 | "display_name": "test",
204 | "language": "python",
205 | "name": "python3"
206 | },
207 | "language_info": {
208 | "codemirror_mode": {
209 | "name": "ipython",
210 | "version": 3
211 | },
212 | "file_extension": ".py",
213 | "mimetype": "text/x-python",
214 | "name": "python",
215 | "nbconvert_exporter": "python",
216 | "pygments_lexer": "ipython3",
217 | "version": "3.10.14"
218 | }
219 | },
220 | "nbformat": 4,
221 | "nbformat_minor": 2
222 | }
223 |
--------------------------------------------------------------------------------
/2-6 Pandas 建立 DataFrame.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "id": "141b3655",
7 | "metadata": {},
8 | "outputs": [],
9 | "source": [
10 | "import pandas as pd"
11 | ]
12 | },
13 | {
14 | "cell_type": "markdown",
15 | "id": "b8a88665",
16 | "metadata": {},
17 | "source": [
18 | "# 建立 dataframe"
19 | ]
20 | },
21 | {
22 | "cell_type": "code",
23 | "execution_count": 2,
24 | "id": "0584e8df",
25 | "metadata": {},
26 | "outputs": [
27 | {
28 | "data": {
29 | "text/html": [
30 | "
\n",
31 | "\n",
44 | "
\n",
45 | " \n",
46 | " \n",
47 | " | \n",
48 | " name | \n",
49 | " age | \n",
50 | "
\n",
51 | " \n",
52 | " \n",
53 | " \n",
54 | " | 0 | \n",
55 | " Alex | \n",
56 | " 19 | \n",
57 | "
\n",
58 | " \n",
59 | " | 1 | \n",
60 | " Bill | \n",
61 | " 22 | \n",
62 | "
\n",
63 | " \n",
64 | " | 2 | \n",
65 | " Carl | \n",
66 | " 14 | \n",
67 | "
\n",
68 | " \n",
69 | " | 3 | \n",
70 | " Darren | \n",
71 | " 18 | \n",
72 | "
\n",
73 | " \n",
74 | "
\n",
75 | "
"
76 | ],
77 | "text/plain": [
78 | " name age\n",
79 | "0 Alex 19\n",
80 | "1 Bill 22\n",
81 | "2 Carl 14\n",
82 | "3 Darren 18"
83 | ]
84 | },
85 | "execution_count": 2,
86 | "metadata": {},
87 | "output_type": "execute_result"
88 | }
89 | ],
90 | "source": [
91 | "# 新增一個二維 list\n",
92 | "list_students = [\n",
93 | " ['Alex', 19],\n",
94 | " ['Bill', 22],\n",
95 | " ['Carl', 14],\n",
96 | " ['Darren', 18]\n",
97 | "]\n",
98 | "\n",
99 | "# 建立基本的 dataframe\n",
100 | "df = pd.DataFrame(list_students)\n",
101 | "\n",
102 | "# 設定 dataframe 的欄位\n",
103 | "df.columns = ['name', 'age']; df"
104 | ]
105 | },
106 | {
107 | "cell_type": "code",
108 | "execution_count": 3,
109 | "id": "9f051ff4",
110 | "metadata": {},
111 | "outputs": [
112 | {
113 | "data": {
114 | "text/html": [
115 | "\n",
116 | "\n",
129 | "
\n",
130 | " \n",
131 | " \n",
132 | " | \n",
133 | " name | \n",
134 | " age | \n",
135 | "
\n",
136 | " \n",
137 | " \n",
138 | " \n",
139 | " | 0 | \n",
140 | " Alex | \n",
141 | " 19 | \n",
142 | "
\n",
143 | " \n",
144 | " | 1 | \n",
145 | " Bill | \n",
146 | " 22 | \n",
147 | "
\n",
148 | " \n",
149 | " | 2 | \n",
150 | " Carl | \n",
151 | " 14 | \n",
152 | "
\n",
153 | " \n",
154 | " | 3 | \n",
155 | " Darren | \n",
156 | " 18 | \n",
157 | "
\n",
158 | " \n",
159 | "
\n",
160 | "
"
161 | ],
162 | "text/plain": [
163 | " name age\n",
164 | "0 Alex 19\n",
165 | "1 Bill 22\n",
166 | "2 Carl 14\n",
167 | "3 Darren 18"
168 | ]
169 | },
170 | "execution_count": 3,
171 | "metadata": {},
172 | "output_type": "execute_result"
173 | }
174 | ],
175 | "source": [
176 | "# 使用 dict 來建立 dataframe\n",
177 | "df = pd.DataFrame({\n",
178 | " 'name': ['Alex', 'Bill', 'Carl', 'Darren'],\n",
179 | " 'age': [19, 22, 14, 18]\n",
180 | "}); df"
181 | ]
182 | },
183 | {
184 | "cell_type": "code",
185 | "execution_count": 4,
186 | "id": "a7075006",
187 | "metadata": {},
188 | "outputs": [
189 | {
190 | "data": {
191 | "text/html": [
192 | "\n",
193 | "\n",
206 | "
\n",
207 | " \n",
208 | " \n",
209 | " | \n",
210 | " name | \n",
211 | " age | \n",
212 | "
\n",
213 | " \n",
214 | " \n",
215 | " \n",
216 | " | 0 | \n",
217 | " Alex | \n",
218 | " 19 | \n",
219 | "
\n",
220 | " \n",
221 | " | 1 | \n",
222 | " Bill | \n",
223 | " 22 | \n",
224 | "
\n",
225 | " \n",
226 | " | 2 | \n",
227 | " Carl | \n",
228 | " 14 | \n",
229 | "
\n",
230 | " \n",
231 | " | 3 | \n",
232 | " Darren | \n",
233 | " 18 | \n",
234 | "
\n",
235 | " \n",
236 | "
\n",
237 | "
"
238 | ],
239 | "text/plain": [
240 | " name age\n",
241 | "0 Alex 19\n",
242 | "1 Bill 22\n",
243 | "2 Carl 14\n",
244 | "3 Darren 18"
245 | ]
246 | },
247 | "execution_count": 4,
248 | "metadata": {},
249 | "output_type": "execute_result"
250 | }
251 | ],
252 | "source": [
253 | "# 使用 list of dict 來建立 dataframe\n",
254 | "data = [\n",
255 | " {'name': 'Alex', 'age': 19},\n",
256 | " {'name': 'Bill', 'age': 22},\n",
257 | " {'name': 'Carl', 'age': 14},\n",
258 | " {'name': 'Darren', 'age': 18},\n",
259 | "]\n",
260 | "\n",
261 | "df = pd.DataFrame(data); df"
262 | ]
263 | }
264 | ],
265 | "metadata": {
266 | "kernelspec": {
267 | "display_name": "python3@nlp",
268 | "language": "python",
269 | "name": "k_nlp"
270 | },
271 | "language_info": {
272 | "codemirror_mode": {
273 | "name": "ipython",
274 | "version": 3
275 | },
276 | "file_extension": ".py",
277 | "mimetype": "text/x-python",
278 | "name": "python",
279 | "nbconvert_exporter": "python",
280 | "pygments_lexer": "ipython3",
281 | "version": "3.10.11"
282 | }
283 | },
284 | "nbformat": 4,
285 | "nbformat_minor": 5
286 | }
287 |
--------------------------------------------------------------------------------
/2-4 Numpy 簡單運算.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "aa6a1d74",
6 | "metadata": {},
7 | "source": [
8 | "# 陣列簡單加總"
9 | ]
10 | },
11 | {
12 | "cell_type": "code",
13 | "execution_count": 1,
14 | "id": "c075b69c",
15 | "metadata": {},
16 | "outputs": [],
17 | "source": [
18 | "import numpy as np"
19 | ]
20 | },
21 | {
22 | "cell_type": "code",
23 | "execution_count": 2,
24 | "id": "c428506a",
25 | "metadata": {},
26 | "outputs": [
27 | {
28 | "data": {
29 | "text/plain": [
30 | "10"
31 | ]
32 | },
33 | "execution_count": 2,
34 | "metadata": {},
35 | "output_type": "execute_result"
36 | }
37 | ],
38 | "source": [
39 | "# 一維陣列的「和」 (加總)\n",
40 | "np.sum([1, 2, 3, 4])"
41 | ]
42 | },
43 | {
44 | "cell_type": "code",
45 | "execution_count": 3,
46 | "id": "8fb845cb",
47 | "metadata": {},
48 | "outputs": [
49 | {
50 | "data": {
51 | "text/plain": [
52 | "10"
53 | ]
54 | },
55 | "execution_count": 3,
56 | "metadata": {},
57 | "output_type": "execute_result"
58 | }
59 | ],
60 | "source": [
61 | "# 二維陣列的「和」 (加總)\n",
62 | "np.sum([[1,2], [3,4]])"
63 | ]
64 | },
65 | {
66 | "cell_type": "markdown",
67 | "id": "0ec83a96",
68 | "metadata": {},
69 | "source": [
70 | "軸 (axis) 的概念\n",
71 | "\n",
72 | "\n",
73 | "參考資料: [Numpy Axes, Explained](https://youtu.be/aF96TC_6kDg)"
74 | ]
75 | },
76 | {
77 | "cell_type": "code",
78 | "execution_count": 4,
79 | "id": "71477b19",
80 | "metadata": {},
81 | "outputs": [
82 | {
83 | "data": {
84 | "text/plain": [
85 | "21"
86 | ]
87 | },
88 | "execution_count": 4,
89 | "metadata": {},
90 | "output_type": "execute_result"
91 | }
92 | ],
93 | "source": [
94 | "# 二維陣列的「和」,指定軸 (axis) 來計算\n",
95 | "'''\n",
96 | "[\n",
97 | " [1,2], \n",
98 | " [3,4], \n",
99 | " [5,6]\n",
100 | "]\n",
101 | "\n",
102 | "axis = None: \n",
103 | "- 所有元素,不分列 (row) 或行 (column)。預設值。\n",
104 | "axis = 0:\n",
105 | "- 順著 [0][0], [1][0], [2][0], ... 等索引號碼增加的方向\n",
106 | "- 類似座標的 y 軸,針對每一個元素 y 軸對應的位置 (由上而下) 進行計算\n",
107 | "axis = 1: \n",
108 | "- 順著 [0][0], [0][1], [0][2], ... 等索引號碼增加的方向\n",
109 | "- 類似座標的 x 軸,針對每一個元素 x 軸對應的位置 (由左而右) 進行計算\n",
110 | "'''\n",
111 | "np.sum([[1,2], [3,4], [5,6]], axis=None)"
112 | ]
113 | },
114 | {
115 | "cell_type": "markdown",
116 | "id": "f71b96f7",
117 | "metadata": {},
118 | "source": [
119 | "# 捨去函數"
120 | ]
121 | },
122 | {
123 | "cell_type": "code",
124 | "execution_count": 11,
125 | "id": "670cb37e",
126 | "metadata": {},
127 | "outputs": [
128 | {
129 | "data": {
130 | "text/plain": [
131 | "array([0.4, 1.8])"
132 | ]
133 | },
134 | "execution_count": 11,
135 | "metadata": {},
136 | "output_type": "execute_result"
137 | }
138 | ],
139 | "source": [
140 | "# around(): 四捨五入到最近的「偶數值」\n",
141 | "'''\n",
142 | "numpy.around(a, decimals=0, out=None)\n",
143 | "\n",
144 | "decimals: 指定小數位數 (小數點後面第幾位)\n",
145 | "'''\n",
146 | "np.around([0.45, 1.85], 1)"
147 | ]
148 | },
149 | {
150 | "cell_type": "code",
151 | "execution_count": 12,
152 | "id": "04724310",
153 | "metadata": {},
154 | "outputs": [
155 | {
156 | "data": {
157 | "text/plain": [
158 | "array([2., 2., 2., 3.])"
159 | ]
160 | },
161 | "execution_count": 12,
162 | "metadata": {},
163 | "output_type": "execute_result"
164 | }
165 | ],
166 | "source": [
167 | "# rint(): 回傳最近的整數 (四捨五入到最近的「偶數值」)\n",
168 | "np.rint([1.5, 2.5, 1.6, 3.3])"
169 | ]
170 | },
171 | {
172 | "cell_type": "code",
173 | "execution_count": 13,
174 | "id": "1d8317b6",
175 | "metadata": {},
176 | "outputs": [
177 | {
178 | "data": {
179 | "text/plain": [
180 | "array([1., 2., 1., 3.])"
181 | ]
182 | },
183 | "execution_count": 13,
184 | "metadata": {},
185 | "output_type": "execute_result"
186 | }
187 | ],
188 | "source": [
189 | "# floor(): 無條件捨去\n",
190 | "np.floor([1.5, 2.5, 1.6, 3.3])"
191 | ]
192 | },
193 | {
194 | "cell_type": "code",
195 | "execution_count": 14,
196 | "id": "2f8a98ad",
197 | "metadata": {},
198 | "outputs": [
199 | {
200 | "data": {
201 | "text/plain": [
202 | "array([2., 3., 2., 4.])"
203 | ]
204 | },
205 | "execution_count": 14,
206 | "metadata": {},
207 | "output_type": "execute_result"
208 | }
209 | ],
210 | "source": [
211 | "# ceil(): 無條件進位\n",
212 | "np.ceil([1.1, 2.5, 1.6, 3.3])"
213 | ]
214 | },
215 | {
216 | "cell_type": "code",
217 | "execution_count": 15,
218 | "id": "44a31c8d",
219 | "metadata": {},
220 | "outputs": [
221 | {
222 | "data": {
223 | "text/plain": [
224 | "array([1., 2., 1., 3.])"
225 | ]
226 | },
227 | "execution_count": 15,
228 | "metadata": {},
229 | "output_type": "execute_result"
230 | }
231 | ],
232 | "source": [
233 | "# trunc(): 捨棄小數\n",
234 | "np.trunc([1.1, 2.5, 1.6, 3.3])"
235 | ]
236 | },
237 | {
238 | "cell_type": "markdown",
239 | "id": "9b47b1e6",
240 | "metadata": {},
241 | "source": [
242 | "# 其它"
243 | ]
244 | },
245 | {
246 | "cell_type": "code",
247 | "execution_count": 21,
248 | "id": "2f279802",
249 | "metadata": {},
250 | "outputs": [
251 | {
252 | "data": {
253 | "text/plain": [
254 | "array([3, 3])"
255 | ]
256 | },
257 | "execution_count": 21,
258 | "metadata": {},
259 | "output_type": "execute_result"
260 | }
261 | ],
262 | "source": [
263 | "# absolute(): 回傳絕對值\n",
264 | "np.absolute([-3, 3])"
265 | ]
266 | },
267 | {
268 | "cell_type": "code",
269 | "execution_count": 22,
270 | "id": "7b13b57b",
271 | "metadata": {},
272 | "outputs": [
273 | {
274 | "data": {
275 | "text/plain": [
276 | "array([16, 81])"
277 | ]
278 | },
279 | "execution_count": 22,
280 | "metadata": {},
281 | "output_type": "execute_result"
282 | }
283 | ],
284 | "source": [
285 | "# square(): 回傳平方值\n",
286 | "np.square([4, 9])"
287 | ]
288 | },
289 | {
290 | "cell_type": "code",
291 | "execution_count": 23,
292 | "id": "c196fb25",
293 | "metadata": {},
294 | "outputs": [
295 | {
296 | "data": {
297 | "text/plain": [
298 | "array([2., 3.])"
299 | ]
300 | },
301 | "execution_count": 23,
302 | "metadata": {},
303 | "output_type": "execute_result"
304 | }
305 | ],
306 | "source": [
307 | "# sqrt(): 回傳平方根\n",
308 | "np.sqrt([4, 9])"
309 | ]
310 | },
311 | {
312 | "cell_type": "markdown",
313 | "id": "bd884db8",
314 | "metadata": {},
315 | "source": [
316 | "# 隨機函數\n",
317 | "- np.random.rand(dim0\\[, dim1, dim2, ...\\])\n",
318 | "- np.random.randint(low, high=None, size=None)\n",
319 | "- 參考資料: \n",
320 | " - [Random sampling](https://numpy.org/doc/stable/reference/random/index.html)\n",
321 | " - [python numpy 常用随机数的产生方法](https://blog.csdn.net/m0_37804518/article/details/78490709)"
322 | ]
323 | },
324 | {
325 | "cell_type": "code",
326 | "execution_count": 24,
327 | "id": "875a3757",
328 | "metadata": {},
329 | "outputs": [
330 | {
331 | "data": {
332 | "text/plain": [
333 | "array([0.37454012, 0.95071431, 0.73199394])"
334 | ]
335 | },
336 | "execution_count": 24,
337 | "metadata": {},
338 | "output_type": "execute_result"
339 | }
340 | ],
341 | "source": [
342 | "'''\n",
343 | "np.random.seed(42)\n",
344 | "numpy.random.rand(): 設定種子後,取得隨機亂數\n",
345 | "\n",
346 | "註: np.random.seed() 的引數固定,隨機產生的值也會固定,亂數的值介於 [0, 1)\n",
347 | "'''\n",
348 | "np.random.seed(42)\n",
349 | "a = np.random.rand(3); a"
350 | ]
351 | },
352 | {
353 | "cell_type": "code",
354 | "execution_count": 2,
355 | "id": "dce628fe",
356 | "metadata": {},
357 | "outputs": [
358 | {
359 | "data": {
360 | "text/plain": [
361 | "array([53, 9, 65, 56, 44, 42, 17, 23, 55, 14, 21, 25, 78, 34, 56, 35, 55,\n",
362 | " 32, 33, 84, 38, 51, 81, 55, 85, 58, 96, 89, 13, 49, 13, 15, 47, 20,\n",
363 | " 41, 16, 61, 55, 42, 43, 38, 26, 36, 98, 88, 95, 42, 80, 67, 73, 4,\n",
364 | " 31, 91, 9, 84, 99, 52, 76, 18, 30, 72, 27, 50, 56, 6, 93, 28, 4,\n",
365 | " 6, 44, 10, 17, 61, 71, 72, 59, 68, 4, 0, 40, 38, 69, 80, 72, 74,\n",
366 | " 89, 53, 40, 50, 91, 77, 75, 90, 66, 60, 30, 9, 42, 63, 22])"
367 | ]
368 | },
369 | "execution_count": 2,
370 | "metadata": {},
371 | "output_type": "execute_result"
372 | }
373 | ],
374 | "source": [
375 | "'''\n",
376 | "np.random.randint(start, end, size=數量): 產生 start 到不包含 end 之間的整數值\n",
377 | "\n",
378 | "隨機產生 100 位同學的成績\n",
379 | "'''\n",
380 | "a = np.random.randint(0, 101, size=100); a"
381 | ]
382 | },
383 | {
384 | "cell_type": "code",
385 | "execution_count": 26,
386 | "id": "89bc0e4b",
387 | "metadata": {},
388 | "outputs": [
389 | {
390 | "data": {
391 | "text/plain": [
392 | "array([1, 5, 2, 4, 3, 7, 9, 6, 8, 0])"
393 | ]
394 | },
395 | "execution_count": 26,
396 | "metadata": {},
397 | "output_type": "execute_result"
398 | }
399 | ],
400 | "source": [
401 | "'''\n",
402 | "np.random.shuffle(): 陣列元素重新排列\n",
403 | "'''\n",
404 | "x = np.arange(10)\n",
405 | "np.random.shuffle(x)\n",
406 | "x"
407 | ]
408 | }
409 | ],
410 | "metadata": {
411 | "kernelspec": {
412 | "display_name": "python3@nlp",
413 | "language": "python",
414 | "name": "k_nlp"
415 | },
416 | "language_info": {
417 | "codemirror_mode": {
418 | "name": "ipython",
419 | "version": 3
420 | },
421 | "file_extension": ".py",
422 | "mimetype": "text/x-python",
423 | "name": "python",
424 | "nbconvert_exporter": "python",
425 | "pygments_lexer": "ipython3",
426 | "version": "3.10.11"
427 | }
428 | },
429 | "nbformat": 4,
430 | "nbformat_minor": 5
431 | }
432 |
--------------------------------------------------------------------------------
/2-5 Pandas 使用 Series.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "afa05ded",
6 | "metadata": {},
7 | "source": [
8 | "# 安裝 pandas\n",
9 | "若有語法不了解的地方,可以參考以下連結:\n",
10 | "- [API reference](https://pandas.pydata.org/docs/reference/index.html)\n",
11 | "- [Pandas Tutorial](https://www.w3schools.com/python/pandas/default.asp)\n",
12 | "- [Pandas 教程](https://www.runoob.com/pandas/pandas-tutorial.html)"
13 | ]
14 | },
15 | {
16 | "cell_type": "code",
17 | "execution_count": null,
18 | "id": "d6cb020d",
19 | "metadata": {},
20 | "outputs": [],
21 | "source": [
22 | "# 安裝套件\n",
23 | "!pip install pandas"
24 | ]
25 | },
26 | {
27 | "cell_type": "code",
28 | "execution_count": 1,
29 | "id": "db0a68e1",
30 | "metadata": {},
31 | "outputs": [],
32 | "source": [
33 | "import pandas as pd\n",
34 | "import numpy as np"
35 | ]
36 | },
37 | {
38 | "cell_type": "markdown",
39 | "id": "b2cb779c",
40 | "metadata": {},
41 | "source": [
42 | "# 使用 series"
43 | ]
44 | },
45 | {
46 | "cell_type": "code",
47 | "execution_count": 2,
48 | "id": "9049ceba",
49 | "metadata": {},
50 | "outputs": [
51 | {
52 | "data": {
53 | "text/plain": [
54 | "0 11\n",
55 | "1 22\n",
56 | "2 33\n",
57 | "3 44\n",
58 | "4 55\n",
59 | "dtype: int64"
60 | ]
61 | },
62 | "execution_count": 2,
63 | "metadata": {},
64 | "output_type": "execute_result"
65 | }
66 | ],
67 | "source": [
68 | "# 使用 list 建立 series 物件\n",
69 | "s = pd.Series([11, 22, 33, 44, 55]); s"
70 | ]
71 | },
72 | {
73 | "cell_type": "code",
74 | "execution_count": 3,
75 | "id": "4a244e6b",
76 | "metadata": {},
77 | "outputs": [
78 | {
79 | "data": {
80 | "text/plain": [
81 | "蘋果 60\n",
82 | "水梨 50\n",
83 | "dtype: int64"
84 | ]
85 | },
86 | "execution_count": 3,
87 | "metadata": {},
88 | "output_type": "execute_result"
89 | }
90 | ],
91 | "source": [
92 | "# 使用 dict 建立 series 物件\n",
93 | "myDict = {\"蘋果\": 60, \"水梨\": 50}\n",
94 | "s = pd.Series(myDict); s"
95 | ]
96 | },
97 | {
98 | "cell_type": "code",
99 | "execution_count": 4,
100 | "id": "430408f8",
101 | "metadata": {},
102 | "outputs": [
103 | {
104 | "data": {
105 | "text/plain": [
106 | "0 13\n",
107 | "1 14\n",
108 | "2 15\n",
109 | "3 16\n",
110 | "4 17\n",
111 | "5 18\n",
112 | "6 19\n",
113 | "7 20\n",
114 | "8 21\n",
115 | "9 22\n",
116 | "10 23\n",
117 | "dtype: int32"
118 | ]
119 | },
120 | "execution_count": 4,
121 | "metadata": {},
122 | "output_type": "execute_result"
123 | }
124 | ],
125 | "source": [
126 | "# 使用 Numpy 的 ndarray 建立 series 物件\n",
127 | "s = pd.Series(np.arange(13, 24)); s"
128 | ]
129 | },
130 | {
131 | "cell_type": "code",
132 | "execution_count": 5,
133 | "id": "3ecb0e0e",
134 | "metadata": {},
135 | "outputs": [
136 | {
137 | "data": {
138 | "text/plain": [
139 | "3 10\n",
140 | "6 20\n",
141 | "9 30\n",
142 | "dtype: int64"
143 | ]
144 | },
145 | "execution_count": 5,
146 | "metadata": {},
147 | "output_type": "execute_result"
148 | }
149 | ],
150 | "source": [
151 | "# 建立含索引的 series 物件\n",
152 | "myIndex = [3, 6, 9] # 也可以用字串當 index (key)\n",
153 | "price = [10, 20, 30]\n",
154 | "s = pd.Series(price, index=myIndex); s"
155 | ]
156 | },
157 | {
158 | "cell_type": "code",
159 | "execution_count": 6,
160 | "id": "4f15bab0",
161 | "metadata": {},
162 | "outputs": [
163 | {
164 | "data": {
165 | "text/plain": [
166 | "1 7\n",
167 | "2 7\n",
168 | "3 7\n",
169 | "dtype: int64"
170 | ]
171 | },
172 | "execution_count": 6,
173 | "metadata": {},
174 | "output_type": "execute_result"
175 | }
176 | ],
177 | "source": [
178 | "# 使用純量 (scalar) 建立 series\n",
179 | "s = pd.Series(7, index=[1,2,3]); s"
180 | ]
181 | },
182 | {
183 | "cell_type": "code",
184 | "execution_count": 7,
185 | "id": "865f4127",
186 | "metadata": {},
187 | "outputs": [
188 | {
189 | "data": {
190 | "text/plain": [
191 | "apple 10\n",
192 | "orange 20\n",
193 | "pear 30\n",
194 | "dtype: int64"
195 | ]
196 | },
197 | "execution_count": 7,
198 | "metadata": {},
199 | "output_type": "execute_result"
200 | }
201 | ],
202 | "source": [
203 | "# 列出 series 物件索引與值\n",
204 | "s = pd.Series([10, 20, 30], index=['apple', 'orange', 'pear']); s"
205 | ]
206 | },
207 | {
208 | "cell_type": "code",
209 | "execution_count": 8,
210 | "id": "f1cade79",
211 | "metadata": {},
212 | "outputs": [
213 | {
214 | "data": {
215 | "text/plain": [
216 | "array([10, 20, 30], dtype=int64)"
217 | ]
218 | },
219 | "execution_count": 8,
220 | "metadata": {},
221 | "output_type": "execute_result"
222 | }
223 | ],
224 | "source": [
225 | "# 承上,印出所有的值\n",
226 | "s.values"
227 | ]
228 | },
229 | {
230 | "cell_type": "code",
231 | "execution_count": 9,
232 | "id": "c2c4f545",
233 | "metadata": {},
234 | "outputs": [
235 | {
236 | "data": {
237 | "text/plain": [
238 | "Index(['apple', 'orange', 'pear'], dtype='object')"
239 | ]
240 | },
241 | "execution_count": 9,
242 | "metadata": {},
243 | "output_type": "execute_result"
244 | }
245 | ],
246 | "source": [
247 | "# 承上,印出所有的索引編號\n",
248 | "s.index"
249 | ]
250 | },
251 | {
252 | "cell_type": "markdown",
253 | "id": "cba06627",
254 | "metadata": {},
255 | "source": [
256 | "# series 的運算"
257 | ]
258 | },
259 | {
260 | "cell_type": "code",
261 | "execution_count": 10,
262 | "id": "a6acc1dc",
263 | "metadata": {},
264 | "outputs": [],
265 | "source": [
266 | "# 將切片觀念用在 series 物件\n",
267 | "s = pd.Series([11, 22, 33, 44, 55, 66])"
268 | ]
269 | },
270 | {
271 | "cell_type": "code",
272 | "execution_count": 11,
273 | "id": "3bdb0430",
274 | "metadata": {},
275 | "outputs": [
276 | {
277 | "data": {
278 | "text/plain": [
279 | "44"
280 | ]
281 | },
282 | "execution_count": 11,
283 | "metadata": {},
284 | "output_type": "execute_result"
285 | }
286 | ],
287 | "source": [
288 | "s[3]"
289 | ]
290 | },
291 | {
292 | "cell_type": "code",
293 | "execution_count": 12,
294 | "id": "5bec234d",
295 | "metadata": {},
296 | "outputs": [
297 | {
298 | "data": {
299 | "text/plain": [
300 | "2 33\n",
301 | "3 44\n",
302 | "dtype: int64"
303 | ]
304 | },
305 | "execution_count": 12,
306 | "metadata": {},
307 | "output_type": "execute_result"
308 | }
309 | ],
310 | "source": [
311 | "s[2:4]"
312 | ]
313 | },
314 | {
315 | "cell_type": "code",
316 | "execution_count": 13,
317 | "id": "9c9bf8d0",
318 | "metadata": {},
319 | "outputs": [
320 | {
321 | "data": {
322 | "text/plain": [
323 | "0 11\n",
324 | "1 22\n",
325 | "2 33\n",
326 | "dtype: int64"
327 | ]
328 | },
329 | "execution_count": 13,
330 | "metadata": {},
331 | "output_type": "execute_result"
332 | }
333 | ],
334 | "source": [
335 | "s[:3]"
336 | ]
337 | },
338 | {
339 | "cell_type": "code",
340 | "execution_count": 14,
341 | "id": "e7a52244",
342 | "metadata": {},
343 | "outputs": [
344 | {
345 | "data": {
346 | "text/plain": [
347 | "2 33\n",
348 | "3 44\n",
349 | "4 55\n",
350 | "5 66\n",
351 | "dtype: int64"
352 | ]
353 | },
354 | "execution_count": 14,
355 | "metadata": {},
356 | "output_type": "execute_result"
357 | }
358 | ],
359 | "source": [
360 | "s[2:]"
361 | ]
362 | },
363 | {
364 | "cell_type": "code",
365 | "execution_count": 15,
366 | "id": "a50f22f6",
367 | "metadata": {},
368 | "outputs": [
369 | {
370 | "data": {
371 | "text/plain": [
372 | "5 66\n",
373 | "dtype: int64"
374 | ]
375 | },
376 | "execution_count": 15,
377 | "metadata": {},
378 | "output_type": "execute_result"
379 | }
380 | ],
381 | "source": [
382 | "# series 只能使用 slicing,無法直接使用 -1 來取得最後一個元素的值\n",
383 | "s[-1:]"
384 | ]
385 | },
386 | {
387 | "cell_type": "code",
388 | "execution_count": 16,
389 | "id": "a86388ce",
390 | "metadata": {},
391 | "outputs": [
392 | {
393 | "data": {
394 | "text/plain": [
395 | "0 4\n",
396 | "1 6\n",
397 | "dtype: int64"
398 | ]
399 | },
400 | "execution_count": 16,
401 | "metadata": {},
402 | "output_type": "execute_result"
403 | }
404 | ],
405 | "source": [
406 | "# series 物件相加\n",
407 | "x = pd.Series([1, 2])\n",
408 | "y = pd.Series([3, 4])\n",
409 | "x + y"
410 | ]
411 | },
412 | {
413 | "cell_type": "code",
414 | "execution_count": 17,
415 | "id": "59d9585c",
416 | "metadata": {},
417 | "outputs": [
418 | {
419 | "data": {
420 | "text/plain": [
421 | "0 3\n",
422 | "1 8\n",
423 | "dtype: int64"
424 | ]
425 | },
426 | "execution_count": 17,
427 | "metadata": {},
428 | "output_type": "execute_result"
429 | }
430 | ],
431 | "source": [
432 | "# series 物件相乘\n",
433 | "x * y"
434 | ]
435 | },
436 | {
437 | "cell_type": "code",
438 | "execution_count": 18,
439 | "id": "29b5a452",
440 | "metadata": {},
441 | "outputs": [
442 | {
443 | "data": {
444 | "text/plain": [
445 | "0 False\n",
446 | "1 False\n",
447 | "dtype: bool"
448 | ]
449 | },
450 | "execution_count": 18,
451 | "metadata": {},
452 | "output_type": "execute_result"
453 | }
454 | ],
455 | "source": [
456 | "# 邏輯判斷: 大於 (可以嘗試其它判斷)\n",
457 | "x > y"
458 | ]
459 | },
460 | {
461 | "cell_type": "code",
462 | "execution_count": 19,
463 | "id": "a6f85135",
464 | "metadata": {},
465 | "outputs": [
466 | {
467 | "data": {
468 | "text/plain": [
469 | "apple 35\n",
470 | "orange 65\n",
471 | "pear 95\n",
472 | "dtype: int64"
473 | ]
474 | },
475 | "execution_count": 19,
476 | "metadata": {},
477 | "output_type": "execute_result"
478 | }
479 | ],
480 | "source": [
481 | "# 擁有相同的 index (或 key),執行相加\n",
482 | "fruits = ['apple', 'orange', 'pear']\n",
483 | "x1 = pd.Series([20, 30, 40], index=fruits)\n",
484 | "x2 = pd.Series([15, 35, 55], index=fruits)\n",
485 | "x1 + x2"
486 | ]
487 | },
488 | {
489 | "cell_type": "code",
490 | "execution_count": 20,
491 | "id": "235ba655",
492 | "metadata": {},
493 | "outputs": [
494 | {
495 | "data": {
496 | "text/plain": [
497 | "apple 35.0\n",
498 | "banana NaN\n",
499 | "orange NaN\n",
500 | "pear 95.0\n",
501 | "dtype: float64"
502 | ]
503 | },
504 | "execution_count": 20,
505 | "metadata": {},
506 | "output_type": "execute_result"
507 | }
508 | ],
509 | "source": [
510 | "# 擁有不同的 index (或 key),執行相加,不同索引之間的值相加,會填上 NaN (Not a Number)\n",
511 | "fruits1 = ['apple', 'orange', 'pear']\n",
512 | "fruits2 = ['apple', 'banana', 'pear']\n",
513 | "x1 = pd.Series([20, 30, 40], index=fruits1)\n",
514 | "x2 = pd.Series([15, 35, 55], index=fruits2)\n",
515 | "x1 + x2"
516 | ]
517 | },
518 | {
519 | "cell_type": "code",
520 | "execution_count": 21,
521 | "id": "33e039f2",
522 | "metadata": {},
523 | "outputs": [
524 | {
525 | "data": {
526 | "text/plain": [
527 | "apple 20\n",
528 | "orange 30\n",
529 | "pear 40\n",
530 | "dtype: int64"
531 | ]
532 | },
533 | "execution_count": 21,
534 | "metadata": {},
535 | "output_type": "execute_result"
536 | }
537 | ],
538 | "source": [
539 | "# series 的索引是字串 (key),取得元素內容\n",
540 | "fruits = ['apple', 'orange', 'pear']\n",
541 | "x = pd.Series([20, 30, 40], index=fruits); x"
542 | ]
543 | },
544 | {
545 | "cell_type": "code",
546 | "execution_count": 22,
547 | "id": "85d6c782",
548 | "metadata": {},
549 | "outputs": [
550 | {
551 | "data": {
552 | "text/plain": [
553 | "20"
554 | ]
555 | },
556 | "execution_count": 22,
557 | "metadata": {},
558 | "output_type": "execute_result"
559 | }
560 | ],
561 | "source": [
562 | "# 取得單一 key 的資料\n",
563 | "x['apple']"
564 | ]
565 | },
566 | {
567 | "cell_type": "code",
568 | "execution_count": 23,
569 | "id": "fea13afd",
570 | "metadata": {},
571 | "outputs": [
572 | {
573 | "data": {
574 | "text/plain": [
575 | "apple 20\n",
576 | "orange 30\n",
577 | "dtype: int64"
578 | ]
579 | },
580 | "execution_count": 23,
581 | "metadata": {},
582 | "output_type": "execute_result"
583 | }
584 | ],
585 | "source": [
586 | "# 取得多個 key 的資料,要使用 list 包起來 (在 pandas 很常用)\n",
587 | "x[ ['apple', 'orange'] ]"
588 | ]
589 | },
590 | {
591 | "cell_type": "code",
592 | "execution_count": 24,
593 | "id": "ac5c4688",
594 | "metadata": {},
595 | "outputs": [
596 | {
597 | "data": {
598 | "text/plain": [
599 | "apple 400\n",
600 | "orange 900\n",
601 | "pear 1600\n",
602 | "dtype: int64"
603 | ]
604 | },
605 | "execution_count": 24,
606 | "metadata": {},
607 | "output_type": "execute_result"
608 | }
609 | ],
610 | "source": [
611 | "# 每個元素都取得平方值\n",
612 | "np.square(x)"
613 | ]
614 | }
615 | ],
616 | "metadata": {
617 | "kernelspec": {
618 | "display_name": "python3@nlp",
619 | "language": "python",
620 | "name": "k_nlp"
621 | },
622 | "language_info": {
623 | "codemirror_mode": {
624 | "name": "ipython",
625 | "version": 3
626 | },
627 | "file_extension": ".py",
628 | "mimetype": "text/x-python",
629 | "name": "python",
630 | "nbconvert_exporter": "python",
631 | "pygments_lexer": "ipython3",
632 | "version": "3.10.11"
633 | }
634 | },
635 | "nbformat": 4,
636 | "nbformat_minor": 5
637 | }
638 |
--------------------------------------------------------------------------------
/2-1 Numpy 建立陣列.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "504249b4",
6 | "metadata": {},
7 | "source": [
8 | "# 安裝 Numpy\n",
9 | "若有語法不了解的地方,可以參考以下連結:\n",
10 | "- [NumPy Reference](https://numpy.org/doc/stable/reference/index.html)\n",
11 | "- [NumPy Tutorial](https://www.w3schools.com/python/numpy/default.asp)\n",
12 | "- [NumPy 教程](https://www.runoob.com/numpy/numpy-tutorial.html)"
13 | ]
14 | },
15 | {
16 | "cell_type": "code",
17 | "execution_count": null,
18 | "id": "dd315f58",
19 | "metadata": {},
20 | "outputs": [],
21 | "source": [
22 | "'''\n",
23 | "註:\n",
24 | "- 也可以在 conda 的虛擬環境中 (如 da) 裡面安裝 Numpy。\n",
25 | " - 指令: pip install -U numpy。\n",
26 | "- 如果直接安裝 pandas,會連同 numpy 一起安裝。\n",
27 | " - 指令: pip install -U pandas\n",
28 | "'''\n",
29 | "\n",
30 | "!pip install -U pandas"
31 | ]
32 | },
33 | {
34 | "cell_type": "code",
35 | "execution_count": 1,
36 | "id": "d26a51c3",
37 | "metadata": {
38 | "scrolled": true
39 | },
40 | "outputs": [],
41 | "source": [
42 | "# 匯入套件\n",
43 | "import numpy as np"
44 | ]
45 | },
46 | {
47 | "cell_type": "markdown",
48 | "id": "a4a4f546",
49 | "metadata": {},
50 | "source": [
51 | "建議遇到不確定如何使用的語法,可以經常查詢官方的文件\n",
52 | "- [doc 版本列表](https://numpy.org/doc/)\n",
53 | "- [當前 stable 版本](https://numpy.org/doc/stable/reference/index.html)"
54 | ]
55 | },
56 | {
57 | "cell_type": "markdown",
58 | "id": "e5064307",
59 | "metadata": {},
60 | "source": [
61 | "# np.array(): 產生陣列 (Array)"
62 | ]
63 | },
64 | {
65 | "cell_type": "code",
66 | "execution_count": null,
67 | "id": "dcab2a66",
68 | "metadata": {},
69 | "outputs": [],
70 | "source": [
71 | "# 語法查詢\n",
72 | "np.array?"
73 | ]
74 | },
75 | {
76 | "cell_type": "code",
77 | "execution_count": null,
78 | "id": "fd4babb6",
79 | "metadata": {},
80 | "outputs": [],
81 | "source": [
82 | "# 在未完成的語法後面按下 tab 鍵,會開啟自動完成功能 (語法提示) \n",
83 | "np.ar"
84 | ]
85 | },
86 | {
87 | "cell_type": "code",
88 | "execution_count": 2,
89 | "id": "d8a9f8f9",
90 | "metadata": {},
91 | "outputs": [
92 | {
93 | "name": "stdout",
94 | "output_type": "stream",
95 | "text": [
96 | "66\n"
97 | ]
98 | }
99 | ],
100 | "source": [
101 | "'''\n",
102 | "numpy.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0, like=None)\n",
103 | "'''\n",
104 | "# 0 維陣列\n",
105 | "a = np.array(33)\n",
106 | "print(a + a)"
107 | ]
108 | },
109 | {
110 | "cell_type": "code",
111 | "execution_count": 3,
112 | "id": "4da11d07",
113 | "metadata": {},
114 | "outputs": [
115 | {
116 | "data": {
117 | "text/plain": [
118 | "array([0, 1, 2, 3])"
119 | ]
120 | },
121 | "execution_count": 3,
122 | "metadata": {},
123 | "output_type": "execute_result"
124 | }
125 | ],
126 | "source": [
127 | "# 一維陣列\n",
128 | "a = np.array([0,1,2,3])\n",
129 | "'''\n",
130 | "註:\n",
131 | "np.array() 裡面的 [0,1,2,3],是 Python 的 List (串列) 變數,\n",
132 | "而使用 np.array([0,1,2,3]) 賦值之後的 a,\n",
133 | "它是真正的 Array (陣列)\n",
134 | "'''\n",
135 | "\n",
136 | "# 在 cell 裡面,程式碼最後一行是變數名稱時,可以自動預覽結果\n",
137 | "a"
138 | ]
139 | },
140 | {
141 | "cell_type": "code",
142 | "execution_count": 4,
143 | "id": "7edcd067",
144 | "metadata": {},
145 | "outputs": [
146 | {
147 | "data": {
148 | "text/plain": [
149 | "array([0, 1, 2, 3])"
150 | ]
151 | },
152 | "execution_count": 4,
153 | "metadata": {},
154 | "output_type": "execute_result"
155 | }
156 | ],
157 | "source": [
158 | "# 如果希望宣告變數後,直接預覽變數,可以用「;」隔開,寫在同一行:\n",
159 | "a = np.array([0,1,2,3]); a"
160 | ]
161 | },
162 | {
163 | "cell_type": "code",
164 | "execution_count": 5,
165 | "id": "64ba5ae9",
166 | "metadata": {},
167 | "outputs": [
168 | {
169 | "data": {
170 | "text/plain": [
171 | "array([[0, 1, 2],\n",
172 | " [3, 4, 5]])"
173 | ]
174 | },
175 | "execution_count": 5,
176 | "metadata": {},
177 | "output_type": "execute_result"
178 | }
179 | ],
180 | "source": [
181 | "# 二維陣列\n",
182 | "'''\n",
183 | "長這個樣子:\n",
184 | "arr = [\n",
185 | " [0,1,2], \n",
186 | " [3,4,5]\n",
187 | "]\n",
188 | "'''\n",
189 | "a = np.array([[0,1,2], [3,4,5]]); a"
190 | ]
191 | },
192 | {
193 | "cell_type": "markdown",
194 | "id": "63bb8194",
195 | "metadata": {},
196 | "source": [
197 | "# Numpy 的 shape, ndim, dtype"
198 | ]
199 | },
200 | {
201 | "cell_type": "code",
202 | "execution_count": 6,
203 | "id": "472bf450",
204 | "metadata": {},
205 | "outputs": [
206 | {
207 | "data": {
208 | "text/plain": [
209 | "(2, 3)"
210 | ]
211 | },
212 | "execution_count": 6,
213 | "metadata": {},
214 | "output_type": "execute_result"
215 | }
216 | ],
217 | "source": [
218 | "# shape (形狀,以 tuple 格式呈現)\n",
219 | "'''\n",
220 | "(2, 3) 代表 2 維陣列:\n",
221 | "- 有 2 列,每 1 列有 3 個元素,\n",
222 | "- 也可看成幾個 row、幾個 column\n",
223 | "'''\n",
224 | "a.shape"
225 | ]
226 | },
227 | {
228 | "cell_type": "code",
229 | "execution_count": 7,
230 | "id": "acc2e418",
231 | "metadata": {},
232 | "outputs": [
233 | {
234 | "data": {
235 | "text/plain": [
236 | "2"
237 | ]
238 | },
239 | "execution_count": 7,
240 | "metadata": {},
241 | "output_type": "execute_result"
242 | }
243 | ],
244 | "source": [
245 | "# ndim (n-dimensions,維度)\n",
246 | "a.ndim"
247 | ]
248 | },
249 | {
250 | "cell_type": "code",
251 | "execution_count": 8,
252 | "id": "726c08f5",
253 | "metadata": {},
254 | "outputs": [
255 | {
256 | "data": {
257 | "text/plain": [
258 | "dtype('int32')"
259 | ]
260 | },
261 | "execution_count": 8,
262 | "metadata": {},
263 | "output_type": "execute_result"
264 | }
265 | ],
266 | "source": [
267 | "# dtype (data-type,陣列當中每一個元素的屬性)\n",
268 | "a.dtype"
269 | ]
270 | },
271 | {
272 | "cell_type": "code",
273 | "execution_count": 9,
274 | "id": "5fc72a7b",
275 | "metadata": {},
276 | "outputs": [
277 | {
278 | "data": {
279 | "text/plain": [
280 | "(2, 3)"
281 | ]
282 | },
283 | "execution_count": 9,
284 | "metadata": {},
285 | "output_type": "execute_result"
286 | }
287 | ],
288 | "source": [
289 | "# 1 維陣列的 shape 長什麼樣子?\n",
290 | "'''\n",
291 | "說明:\n",
292 | "- (4) 代表一個數字\n",
293 | "- (4,) 代表一個 tuple (1 維陣列)\n",
294 | "- (1, 4) 代表 2 維陣列,裡面只有 1 維的資料,該維有 4 個元素,例如 np.array([[1,2,3,4]])\n",
295 | "'''\n",
296 | "a.shape"
297 | ]
298 | },
299 | {
300 | "cell_type": "markdown",
301 | "id": "bc34ce34",
302 | "metadata": {},
303 | "source": [
304 | "# np.arange(): 從數值範圍來建立陣列"
305 | ]
306 | },
307 | {
308 | "cell_type": "code",
309 | "execution_count": 10,
310 | "id": "0387c714",
311 | "metadata": {},
312 | "outputs": [
313 | {
314 | "data": {
315 | "text/plain": [
316 | "array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])"
317 | ]
318 | },
319 | "execution_count": 10,
320 | "metadata": {},
321 | "output_type": "execute_result"
322 | }
323 | ],
324 | "source": [
325 | "# 跟 range() 用法一樣\n",
326 | "'''\n",
327 | "用法:\n",
328 | "numpy.arange([start, ]stop, [step, ]dtype=None, *, like=None)\n",
329 | "'''\n",
330 | "a = np.arange(10); a"
331 | ]
332 | },
333 | {
334 | "cell_type": "code",
335 | "execution_count": 11,
336 | "id": "d1095578",
337 | "metadata": {},
338 | "outputs": [
339 | {
340 | "data": {
341 | "text/plain": [
342 | "array([1, 2, 3, 4, 5, 6, 7, 8, 9])"
343 | ]
344 | },
345 | "execution_count": 11,
346 | "metadata": {},
347 | "output_type": "execute_result"
348 | }
349 | ],
350 | "source": [
351 | "# 取得陣列 [1, 2, 3, 4, 5, 6, 7, 8, 9]\n",
352 | "a = np.arange(1, 10); a"
353 | ]
354 | },
355 | {
356 | "cell_type": "code",
357 | "execution_count": 12,
358 | "id": "090ce43e",
359 | "metadata": {},
360 | "outputs": [
361 | {
362 | "data": {
363 | "text/plain": [
364 | "array([1, 4, 7])"
365 | ]
366 | },
367 | "execution_count": 12,
368 | "metadata": {},
369 | "output_type": "execute_result"
370 | }
371 | ],
372 | "source": [
373 | "# 1 ~ 10 之間,每隔 3 個元素,加入資料到陣列: [1, 4, 7]\n",
374 | "a = np.arange(1, 10, 3); a"
375 | ]
376 | },
377 | {
378 | "cell_type": "markdown",
379 | "id": "5cc9f625",
380 | "metadata": {},
381 | "source": [
382 | "# Numpy的資料型態 (data-type)"
383 | ]
384 | },
385 | {
386 | "cell_type": "code",
387 | "execution_count": 13,
388 | "id": "f06a1e6a",
389 | "metadata": {},
390 | "outputs": [
391 | {
392 | "data": {
393 | "text/plain": [
394 | "dtype('int32')"
395 | ]
396 | },
397 | "execution_count": 13,
398 | "metadata": {},
399 | "output_type": "execute_result"
400 | }
401 | ],
402 | "source": [
403 | "# 自動判斷資料型態\n",
404 | "a = np.array([1,2,3,4]); a.dtype"
405 | ]
406 | },
407 | {
408 | "cell_type": "code",
409 | "execution_count": 14,
410 | "id": "6ff957e9",
411 | "metadata": {},
412 | "outputs": [
413 | {
414 | "data": {
415 | "text/plain": [
416 | "dtype('float64')"
417 | ]
418 | },
419 | "execution_count": 14,
420 | "metadata": {},
421 | "output_type": "execute_result"
422 | }
423 | ],
424 | "source": [
425 | "# 自動判斷資料型態 (其中一個元素變成浮點數,dtype 會自動轉型)\n",
426 | "a = np.array([1., 2, 3, 4]); a.dtype"
427 | ]
428 | },
429 | {
430 | "cell_type": "code",
431 | "execution_count": 15,
432 | "id": "fa37e289",
433 | "metadata": {},
434 | "outputs": [
435 | {
436 | "data": {
437 | "text/plain": [
438 | "array([1., 2., 3., 4.])"
439 | ]
440 | },
441 | "execution_count": 15,
442 | "metadata": {},
443 | "output_type": "execute_result"
444 | }
445 | ],
446 | "source": [
447 | "# 指定陣列每一個資料的資料型態 (指定 float64)\n",
448 | "a = np.array([1, 2, 3, 4], dtype='float64')\n",
449 | "a\n",
450 | "# a.dtype"
451 | ]
452 | },
453 | {
454 | "cell_type": "code",
455 | "execution_count": 17,
456 | "id": "ae230475",
457 | "metadata": {},
458 | "outputs": [
459 | {
460 | "data": {
461 | "text/plain": [
462 | "dtype('bool')"
463 | ]
464 | },
465 | "execution_count": 17,
466 | "metadata": {},
467 | "output_type": "execute_result"
468 | }
469 | ],
470 | "source": [
471 | "# 布林值用於 numpy\n",
472 | "a = np.array([True, True, False]); a.dtype"
473 | ]
474 | },
475 | {
476 | "cell_type": "code",
477 | "execution_count": 18,
478 | "id": "42f1e8a9",
479 | "metadata": {},
480 | "outputs": [
481 | {
482 | "data": {
483 | "text/plain": [
484 | "array([1, 2, 3])"
485 | ]
486 | },
487 | "execution_count": 18,
488 | "metadata": {},
489 | "output_type": "execute_result"
490 | }
491 | ],
492 | "source": [
493 | "# 類型轉換 (float 轉成 int)\n",
494 | "a = np.array([1, 2, 3.14]) # dtype('float64')\n",
495 | "a_ = a.astype(int); a_"
496 | ]
497 | },
498 | {
499 | "cell_type": "markdown",
500 | "id": "25169fab",
501 | "metadata": {},
502 | "source": [
503 | "# Array creation routine 用於創建多維陣列的函數"
504 | ]
505 | },
506 | {
507 | "cell_type": "code",
508 | "execution_count": 19,
509 | "id": "0ebf7f90",
510 | "metadata": {},
511 | "outputs": [
512 | {
513 | "data": {
514 | "text/plain": [
515 | "array([1., 5., 9.])"
516 | ]
517 | },
518 | "execution_count": 19,
519 | "metadata": {},
520 | "output_type": "execute_result"
521 | }
522 | ],
523 | "source": [
524 | "# np.linspace(): 建立等距陣列的 1 維陣列\n",
525 | "'''\n",
526 | "np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)\n",
527 | "'''\n",
528 | "a = np.linspace(1, 9, num=3); a"
529 | ]
530 | },
531 | {
532 | "cell_type": "code",
533 | "execution_count": 20,
534 | "id": "f801ae16",
535 | "metadata": {},
536 | "outputs": [
537 | {
538 | "data": {
539 | "text/plain": [
540 | "array([[1., 1., 1.],\n",
541 | " [1., 1., 1.]])"
542 | ]
543 | },
544 | "execution_count": 20,
545 | "metadata": {},
546 | "output_type": "execute_result"
547 | }
548 | ],
549 | "source": [
550 | "# np.ones(): 建立填滿 1 的陣列,透過 shape 指定幾維\n",
551 | "'''\n",
552 | "numpy.ones(shape, dtype=None, order='C', *, like=None)[source]\n",
553 | "'''\n",
554 | "a = np.ones((2,3)); a"
555 | ]
556 | },
557 | {
558 | "cell_type": "code",
559 | "execution_count": 21,
560 | "id": "63842f47",
561 | "metadata": {},
562 | "outputs": [
563 | {
564 | "data": {
565 | "text/plain": [
566 | "array([0., 0., 0., 0., 0.])"
567 | ]
568 | },
569 | "execution_count": 21,
570 | "metadata": {},
571 | "output_type": "execute_result"
572 | }
573 | ],
574 | "source": [
575 | "# np.zeros(): 建立填滿 0 的陣列,透過 shape 指定幾維 \n",
576 | "'''\n",
577 | "numpy.zeros(shape, dtype=float, order='C', *, like=None)\n",
578 | "'''\n",
579 | "a = np.zeros((5,)); a"
580 | ]
581 | },
582 | {
583 | "cell_type": "code",
584 | "execution_count": 23,
585 | "id": "e4e8d90f",
586 | "metadata": {},
587 | "outputs": [
588 | {
589 | "data": {
590 | "text/plain": [
591 | "array([[10, 10, 10, 10],\n",
592 | " [10, 10, 10, 10],\n",
593 | " [10, 10, 10, 10]])"
594 | ]
595 | },
596 | "execution_count": 23,
597 | "metadata": {},
598 | "output_type": "execute_result"
599 | }
600 | ],
601 | "source": [
602 | "# np.full(): 建立填滿 fill_value 的陣列,透過 shape 指定幾維 \n",
603 | "'''\n",
604 | "numpy.full(shape, fill_value, dtype=None, order='C', *, like=None)\n",
605 | "'''\n",
606 | "a = np.full((3,4), 10); a"
607 | ]
608 | }
609 | ],
610 | "metadata": {
611 | "kernelspec": {
612 | "display_name": "python3@nlp",
613 | "language": "python",
614 | "name": "k_nlp"
615 | },
616 | "language_info": {
617 | "codemirror_mode": {
618 | "name": "ipython",
619 | "version": 3
620 | },
621 | "file_extension": ".py",
622 | "mimetype": "text/x-python",
623 | "name": "python",
624 | "nbconvert_exporter": "python",
625 | "pygments_lexer": "ipython3",
626 | "version": "3.10.11"
627 | }
628 | },
629 | "nbformat": 4,
630 | "nbformat_minor": 5
631 | }
632 |
--------------------------------------------------------------------------------
/2-2 Numpy 一維陣列.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "id": "f6a59d5a",
7 | "metadata": {},
8 | "outputs": [],
9 | "source": [
10 | "import numpy as np"
11 | ]
12 | },
13 | {
14 | "cell_type": "markdown",
15 | "id": "1c83eb2c",
16 | "metadata": {},
17 | "source": [
18 | "# 一維陣列的四則運算"
19 | ]
20 | },
21 | {
22 | "cell_type": "code",
23 | "execution_count": 2,
24 | "id": "7844ce81",
25 | "metadata": {},
26 | "outputs": [],
27 | "source": [
28 | "# 初始化陣列\n",
29 | "x = np.array([2, 4, 6, 8, 10])\n",
30 | "y = np.array([10, 8, 6, 4, 2])"
31 | ]
32 | },
33 | {
34 | "cell_type": "code",
35 | "execution_count": 3,
36 | "id": "1b490ed1",
37 | "metadata": {},
38 | "outputs": [
39 | {
40 | "data": {
41 | "text/plain": [
42 | "array([ 6, 8, 10, 12, 14])"
43 | ]
44 | },
45 | "execution_count": 3,
46 | "metadata": {},
47 | "output_type": "execute_result"
48 | }
49 | ],
50 | "source": [
51 | "# 整數與陣列: 加法\n",
52 | "a = x + 4; a"
53 | ]
54 | },
55 | {
56 | "cell_type": "code",
57 | "execution_count": 4,
58 | "id": "98cbe863",
59 | "metadata": {},
60 | "outputs": [
61 | {
62 | "data": {
63 | "text/plain": [
64 | "array([0, 2, 4, 6, 8])"
65 | ]
66 | },
67 | "execution_count": 4,
68 | "metadata": {},
69 | "output_type": "execute_result"
70 | }
71 | ],
72 | "source": [
73 | "# 整數與陣列: 減法\n",
74 | "a = x - 2; a"
75 | ]
76 | },
77 | {
78 | "cell_type": "code",
79 | "execution_count": 5,
80 | "id": "eab9a606",
81 | "metadata": {},
82 | "outputs": [
83 | {
84 | "data": {
85 | "text/plain": [
86 | "array([ 4, 8, 12, 16, 20])"
87 | ]
88 | },
89 | "execution_count": 5,
90 | "metadata": {},
91 | "output_type": "execute_result"
92 | }
93 | ],
94 | "source": [
95 | "# 整數與陣列: 乘法\n",
96 | "a = x * 2; a"
97 | ]
98 | },
99 | {
100 | "cell_type": "code",
101 | "execution_count": 6,
102 | "id": "a0ec1b0e",
103 | "metadata": {},
104 | "outputs": [
105 | {
106 | "data": {
107 | "text/plain": [
108 | "array([1., 2., 3., 4., 5.])"
109 | ]
110 | },
111 | "execution_count": 6,
112 | "metadata": {},
113 | "output_type": "execute_result"
114 | }
115 | ],
116 | "source": [
117 | "# 整數與陣列: 除法\n",
118 | "a = x / 2; a"
119 | ]
120 | },
121 | {
122 | "cell_type": "code",
123 | "execution_count": 7,
124 | "id": "18ec130c",
125 | "metadata": {},
126 | "outputs": [
127 | {
128 | "data": {
129 | "text/plain": [
130 | "array([12, 12, 12, 12, 12])"
131 | ]
132 | },
133 | "execution_count": 7,
134 | "metadata": {},
135 | "output_type": "execute_result"
136 | }
137 | ],
138 | "source": [
139 | "# 陣列加法運算\n",
140 | "a = x + y; a"
141 | ]
142 | },
143 | {
144 | "cell_type": "code",
145 | "execution_count": 8,
146 | "id": "a1b6013d",
147 | "metadata": {},
148 | "outputs": [
149 | {
150 | "data": {
151 | "text/plain": [
152 | "array([-8, -4, 0, 4, 8])"
153 | ]
154 | },
155 | "execution_count": 8,
156 | "metadata": {},
157 | "output_type": "execute_result"
158 | }
159 | ],
160 | "source": [
161 | "# 陣列減法運算\n",
162 | "a = x - y; a"
163 | ]
164 | },
165 | {
166 | "cell_type": "code",
167 | "execution_count": 9,
168 | "id": "bb4790ff",
169 | "metadata": {},
170 | "outputs": [
171 | {
172 | "data": {
173 | "text/plain": [
174 | "array([20, 32, 36, 32, 20])"
175 | ]
176 | },
177 | "execution_count": 9,
178 | "metadata": {},
179 | "output_type": "execute_result"
180 | }
181 | ],
182 | "source": [
183 | "# 陣列乘法運算\n",
184 | "a = x * y; a"
185 | ]
186 | },
187 | {
188 | "cell_type": "code",
189 | "execution_count": 10,
190 | "id": "93a342c9",
191 | "metadata": {},
192 | "outputs": [
193 | {
194 | "data": {
195 | "text/plain": [
196 | "array([0.2, 0.5, 1. , 2. , 5. ])"
197 | ]
198 | },
199 | "execution_count": 10,
200 | "metadata": {},
201 | "output_type": "execute_result"
202 | }
203 | ],
204 | "source": [
205 | "# 陣列除法運算\n",
206 | "a = x / y; a"
207 | ]
208 | },
209 | {
210 | "cell_type": "code",
211 | "execution_count": 11,
212 | "id": "22e4e358",
213 | "metadata": {},
214 | "outputs": [],
215 | "source": [
216 | "# 陣列元素平方\n",
217 | "'''\n",
218 | "也可以使用\n",
219 | "A = np.square(x)\n",
220 | "B = np.square(y)\n",
221 | "'''\n",
222 | "A = x ** 2\n",
223 | "B = y ** 2"
224 | ]
225 | },
226 | {
227 | "cell_type": "code",
228 | "execution_count": 12,
229 | "id": "d81de89c",
230 | "metadata": {},
231 | "outputs": [
232 | {
233 | "data": {
234 | "text/plain": [
235 | "array([ 4, 16, 36, 64, 100])"
236 | ]
237 | },
238 | "execution_count": 12,
239 | "metadata": {},
240 | "output_type": "execute_result"
241 | }
242 | ],
243 | "source": [
244 | "A"
245 | ]
246 | },
247 | {
248 | "cell_type": "code",
249 | "execution_count": 13,
250 | "id": "0a96856f",
251 | "metadata": {},
252 | "outputs": [
253 | {
254 | "data": {
255 | "text/plain": [
256 | "array([100, 64, 36, 16, 4])"
257 | ]
258 | },
259 | "execution_count": 13,
260 | "metadata": {},
261 | "output_type": "execute_result"
262 | }
263 | ],
264 | "source": [
265 | "B"
266 | ]
267 | },
268 | {
269 | "cell_type": "code",
270 | "execution_count": 14,
271 | "id": "9fe67913",
272 | "metadata": {},
273 | "outputs": [],
274 | "source": [
275 | "# 陣列元素開根號\n",
276 | "A = np.sqrt(x)\n",
277 | "B = np.sqrt(y)"
278 | ]
279 | },
280 | {
281 | "cell_type": "code",
282 | "execution_count": 15,
283 | "id": "f988778e",
284 | "metadata": {},
285 | "outputs": [
286 | {
287 | "data": {
288 | "text/plain": [
289 | "array([1.41421356, 2. , 2.44948974, 2.82842712, 3.16227766])"
290 | ]
291 | },
292 | "execution_count": 15,
293 | "metadata": {},
294 | "output_type": "execute_result"
295 | }
296 | ],
297 | "source": [
298 | "A"
299 | ]
300 | },
301 | {
302 | "cell_type": "code",
303 | "execution_count": 16,
304 | "id": "058f7a3f",
305 | "metadata": {},
306 | "outputs": [
307 | {
308 | "data": {
309 | "text/plain": [
310 | "array([3.16227766, 2.82842712, 2.44948974, 2. , 1.41421356])"
311 | ]
312 | },
313 | "execution_count": 16,
314 | "metadata": {},
315 | "output_type": "execute_result"
316 | }
317 | ],
318 | "source": [
319 | "B"
320 | ]
321 | },
322 | {
323 | "cell_type": "markdown",
324 | "id": "c4104ffc",
325 | "metadata": {},
326 | "source": [
327 | "# 關係運算子運算"
328 | ]
329 | },
330 | {
331 | "cell_type": "markdown",
332 | "id": "d598c55b",
333 | "metadata": {},
334 | "source": [
335 | "以 大於 (>)、小於 (<)、等於 (==) 為例"
336 | ]
337 | },
338 | {
339 | "cell_type": "code",
340 | "execution_count": 17,
341 | "id": "257f9a40",
342 | "metadata": {},
343 | "outputs": [
344 | {
345 | "data": {
346 | "text/plain": [
347 | "array([False, False, False, True, True])"
348 | ]
349 | },
350 | "execution_count": 17,
351 | "metadata": {},
352 | "output_type": "execute_result"
353 | }
354 | ],
355 | "source": [
356 | "# 大於\n",
357 | "a = x > y; a"
358 | ]
359 | },
360 | {
361 | "cell_type": "code",
362 | "execution_count": 18,
363 | "id": "cb35bf22",
364 | "metadata": {},
365 | "outputs": [
366 | {
367 | "data": {
368 | "text/plain": [
369 | "array([ True, True, False, False, False])"
370 | ]
371 | },
372 | "execution_count": 18,
373 | "metadata": {},
374 | "output_type": "execute_result"
375 | }
376 | ],
377 | "source": [
378 | "# 小於\n",
379 | "a = x < y; a"
380 | ]
381 | },
382 | {
383 | "cell_type": "code",
384 | "execution_count": 19,
385 | "id": "f13f881f",
386 | "metadata": {},
387 | "outputs": [
388 | {
389 | "data": {
390 | "text/plain": [
391 | "array([False, False, True, False, False])"
392 | ]
393 | },
394 | "execution_count": 19,
395 | "metadata": {},
396 | "output_type": "execute_result"
397 | }
398 | ],
399 | "source": [
400 | "# 等於\n",
401 | "a = x == y; a"
402 | ]
403 | },
404 | {
405 | "cell_type": "markdown",
406 | "id": "fe1f5465",
407 | "metadata": {},
408 | "source": [
409 | "# 陣列索引與切片 (Indexing & Slicing)"
410 | ]
411 | },
412 | {
413 | "cell_type": "code",
414 | "execution_count": 20,
415 | "id": "28fc397b",
416 | "metadata": {},
417 | "outputs": [
418 | {
419 | "data": {
420 | "text/plain": [
421 | "2"
422 | ]
423 | },
424 | "execution_count": 20,
425 | "metadata": {},
426 | "output_type": "execute_result"
427 | }
428 | ],
429 | "source": [
430 | "# 指定索引\n",
431 | "x[0]"
432 | ]
433 | },
434 | {
435 | "cell_type": "code",
436 | "execution_count": 21,
437 | "id": "cea337c2",
438 | "metadata": {},
439 | "outputs": [
440 | {
441 | "data": {
442 | "text/plain": [
443 | "array([2, 4])"
444 | ]
445 | },
446 | "execution_count": 21,
447 | "metadata": {},
448 | "output_type": "execute_result"
449 | }
450 | ],
451 | "source": [
452 | "# 切片 (範圍: [start, end-1, step])\n",
453 | "x[0:2]"
454 | ]
455 | },
456 | {
457 | "cell_type": "code",
458 | "execution_count": 22,
459 | "id": "e44f4023",
460 | "metadata": {},
461 | "outputs": [
462 | {
463 | "data": {
464 | "text/plain": [
465 | "array([ 2, 6, 10])"
466 | ]
467 | },
468 | "execution_count": 22,
469 | "metadata": {},
470 | "output_type": "execute_result"
471 | }
472 | ],
473 | "source": [
474 | "# 切片,指定每幾步算一次\n",
475 | "'''\n",
476 | "這樣也可以\n",
477 | "x[::2]\n",
478 | "'''\n",
479 | "x[0:5:2]"
480 | ]
481 | },
482 | {
483 | "cell_type": "code",
484 | "execution_count": 23,
485 | "id": "833125db",
486 | "metadata": {},
487 | "outputs": [
488 | {
489 | "data": {
490 | "text/plain": [
491 | "10"
492 | ]
493 | },
494 | "execution_count": 23,
495 | "metadata": {},
496 | "output_type": "execute_result"
497 | }
498 | ],
499 | "source": [
500 | "# 切片 (使用負號)\n",
501 | "x[-1]"
502 | ]
503 | },
504 | {
505 | "cell_type": "code",
506 | "execution_count": 24,
507 | "id": "1c063cf6",
508 | "metadata": {},
509 | "outputs": [
510 | {
511 | "data": {
512 | "text/plain": [
513 | "array([6, 8])"
514 | ]
515 | },
516 | "execution_count": 24,
517 | "metadata": {},
518 | "output_type": "execute_result"
519 | }
520 | ],
521 | "source": [
522 | "# 切片 (範圍: [start, end-1, step])\n",
523 | "x[-3:-1]"
524 | ]
525 | },
526 | {
527 | "cell_type": "markdown",
528 | "id": "627bb997",
529 | "metadata": {},
530 | "source": [
531 | "# 陣列的結合與加入"
532 | ]
533 | },
534 | {
535 | "cell_type": "code",
536 | "execution_count": 25,
537 | "id": "9d140825",
538 | "metadata": {},
539 | "outputs": [
540 | {
541 | "data": {
542 | "text/plain": [
543 | "array([ 2, 4, 6, 8, 10, 10, 8, 6, 4, 2])"
544 | ]
545 | },
546 | "execution_count": 25,
547 | "metadata": {},
548 | "output_type": "execute_result"
549 | }
550 | ],
551 | "source": [
552 | "# 陣列結合\n",
553 | "'''\n",
554 | "numpy.concatenate((a1, a2, ...), axis=0, out=None, dtype=None, casting=\"same_kind\")\n",
555 | "'''\n",
556 | "z = np.concatenate((x, y)); z"
557 | ]
558 | },
559 | {
560 | "cell_type": "code",
561 | "execution_count": 26,
562 | "id": "027658bd",
563 | "metadata": {},
564 | "outputs": [
565 | {
566 | "data": {
567 | "text/plain": [
568 | "array([ 2, 4, 6, 8, 10, 12, 14, 16])"
569 | ]
570 | },
571 | "execution_count": 26,
572 | "metadata": {},
573 | "output_type": "execute_result"
574 | }
575 | ],
576 | "source": [
577 | "# 將陣列元素加入其它陣列\n",
578 | "z = np.concatenate((x, [12, 14, 16])); z"
579 | ]
580 | },
581 | {
582 | "cell_type": "markdown",
583 | "id": "f4736b3a",
584 | "metadata": {},
585 | "source": [
586 | "# 在陣列指定索引插入元素 insert()"
587 | ]
588 | },
589 | {
590 | "cell_type": "markdown",
591 | "id": "9510b3fc",
592 | "metadata": {},
593 | "source": [
594 | "原本 x 是 [2,4,6,8,10]"
595 | ]
596 | },
597 | {
598 | "cell_type": "code",
599 | "execution_count": 27,
600 | "id": "8dce528a",
601 | "metadata": {},
602 | "outputs": [
603 | {
604 | "data": {
605 | "text/plain": [
606 | "array([ 2, 4, 9, 6, 8, 10])"
607 | ]
608 | },
609 | "execution_count": 27,
610 | "metadata": {},
611 | "output_type": "execute_result"
612 | }
613 | ],
614 | "source": [
615 | "# 在陣列指定索引 2 插入元素 9\n",
616 | "'''\n",
617 | "numpy.insert(arr, obj, values, axis=None)\n",
618 | "'''\n",
619 | "z = np.insert(x, 2, 9); z"
620 | ]
621 | },
622 | {
623 | "cell_type": "code",
624 | "execution_count": 28,
625 | "id": "2dd56e47",
626 | "metadata": {},
627 | "outputs": [
628 | {
629 | "data": {
630 | "text/plain": [
631 | "array([ 2, 7, 4, 6, 9, 8, 10])"
632 | ]
633 | },
634 | "execution_count": 28,
635 | "metadata": {},
636 | "output_type": "execute_result"
637 | }
638 | ],
639 | "source": [
640 | "# 在陣列指定索引 1 跟 3,分別插入元素 7 跟 9\n",
641 | "z = np.insert(x, [1,3], [7,9]); z"
642 | ]
643 | },
644 | {
645 | "cell_type": "markdown",
646 | "id": "63a77f53",
647 | "metadata": {},
648 | "source": [
649 | "# 刪除指定索引的陣列元素 delete()"
650 | ]
651 | },
652 | {
653 | "cell_type": "code",
654 | "execution_count": 29,
655 | "id": "c8fd4758",
656 | "metadata": {},
657 | "outputs": [
658 | {
659 | "data": {
660 | "text/plain": [
661 | "array([ 2, 6, 8, 10])"
662 | ]
663 | },
664 | "execution_count": 29,
665 | "metadata": {},
666 | "output_type": "execute_result"
667 | }
668 | ],
669 | "source": [
670 | "# 刪除索引 1 的元素\n",
671 | "'''\n",
672 | "numpy.delete(arr, obj, axis=None)\n",
673 | "'''\n",
674 | "z = np.delete(x, 1); z"
675 | ]
676 | },
677 | {
678 | "cell_type": "code",
679 | "execution_count": 30,
680 | "id": "59143742",
681 | "metadata": {},
682 | "outputs": [
683 | {
684 | "data": {
685 | "text/plain": [
686 | "array([ 2, 6, 10])"
687 | ]
688 | },
689 | "execution_count": 30,
690 | "metadata": {},
691 | "output_type": "execute_result"
692 | }
693 | ],
694 | "source": [
695 | "# 刪除索引 1 和 3 所放置的元素\n",
696 | "z = np.delete(x, [1, 3]); z"
697 | ]
698 | },
699 | {
700 | "cell_type": "markdown",
701 | "id": "c49578ae",
702 | "metadata": {},
703 | "source": [
704 | "# 向量內部元素總和 sum()"
705 | ]
706 | },
707 | {
708 | "cell_type": "code",
709 | "execution_count": 31,
710 | "id": "2e5a8668",
711 | "metadata": {},
712 | "outputs": [
713 | {
714 | "data": {
715 | "text/plain": [
716 | "16"
717 | ]
718 | },
719 | "execution_count": 31,
720 | "metadata": {},
721 | "output_type": "execute_result"
722 | }
723 | ],
724 | "source": [
725 | "# 計算元素總和\n",
726 | "'''\n",
727 | "numpy.sum(a, axis=None, dtype=None, ...)\n",
728 | "'''\n",
729 | "c = np.array([1, 3, 5, 7])\n",
730 | "d = np.sum(c); d"
731 | ]
732 | },
733 | {
734 | "cell_type": "markdown",
735 | "id": "4c0e34f2",
736 | "metadata": {},
737 | "source": [
738 | "# 向量內積 (inner product)"
739 | ]
740 | },
741 | {
742 | "cell_type": "code",
743 | "execution_count": null,
744 | "id": "df403ab9",
745 | "metadata": {},
746 | "outputs": [],
747 | "source": [
748 | "'''\n",
749 | "內積在機器學習的領域,是很重要的概念,\n",
750 | "無論是取得向量特徵,或是向量間的關係,\n",
751 | "內積都扮演重要的角色\n",
752 | "\n",
753 | "numpy.inner(a, b, /)\n",
754 | "'''\n",
755 | "a = np.array([4,5,1,3,4])\n",
756 | "b = np.array([5,3,5,4,2])\n",
757 | "\n",
758 | "'''\n",
759 | "計算過程:\n",
760 | "4*5 + 5*3 + 1*5 + 3*4 + 4*2 = 60\n",
761 | "'''\n",
762 | "\n",
763 | "c = np.inner(a, b); c"
764 | ]
765 | },
766 | {
767 | "cell_type": "markdown",
768 | "id": "3ec3190a",
769 | "metadata": {},
770 | "source": [
771 | "# 牛刀小試: 餘弦相似度 (Cosine Similarity)\n",
772 | "參考網頁: [https://zh.wikipedia.org/wiki/余弦相似性](https://zh.wikipedia.org/wiki/余弦相似性)\n",
773 | "\n",
774 | "\n",
775 | "\n",
776 | "假設某 A 的向量為 \\[4,5,1,3,4\\],某 B 的向量為 \\[5,3,5,4,2\\],餘弦相似度的算法為:\n",
777 | "\n",
778 | "\n"
779 | ]
780 | }
781 | ],
782 | "metadata": {
783 | "kernelspec": {
784 | "display_name": "python3@nlp",
785 | "language": "python",
786 | "name": "k_nlp"
787 | },
788 | "language_info": {
789 | "codemirror_mode": {
790 | "name": "ipython",
791 | "version": 3
792 | },
793 | "file_extension": ".py",
794 | "mimetype": "text/x-python",
795 | "name": "python",
796 | "nbconvert_exporter": "python",
797 | "pygments_lexer": "ipython3",
798 | "version": "3.10.11"
799 | }
800 | },
801 | "nbformat": 4,
802 | "nbformat_minor": 5
803 | }
804 |
--------------------------------------------------------------------------------
/2-3 Numpy 二維陣列.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 1,
6 | "id": "33c44d85",
7 | "metadata": {},
8 | "outputs": [],
9 | "source": [
10 | "import numpy as np"
11 | ]
12 | },
13 | {
14 | "cell_type": "code",
15 | "execution_count": 2,
16 | "id": "5500ac5b",
17 | "metadata": {},
18 | "outputs": [],
19 | "source": [
20 | "# 建立二維陣列\n",
21 | "x = np.array([[1, 2], [3, 4]])\n",
22 | "y = np.array([[5, 6], [7, 8]])"
23 | ]
24 | },
25 | {
26 | "cell_type": "markdown",
27 | "id": "e76a1f30",
28 | "metadata": {},
29 | "source": [
30 | "# 二維陣列相對位置與四則運算"
31 | ]
32 | },
33 | {
34 | "cell_type": "code",
35 | "execution_count": 3,
36 | "id": "a771ec9b",
37 | "metadata": {},
38 | "outputs": [
39 | {
40 | "data": {
41 | "text/plain": [
42 | "array([[11, 12],\n",
43 | " [13, 14]])"
44 | ]
45 | },
46 | "execution_count": 3,
47 | "metadata": {},
48 | "output_type": "execute_result"
49 | }
50 | ],
51 | "source": [
52 | "# 與整數的加法運算\n",
53 | "a = x + 10; a"
54 | ]
55 | },
56 | {
57 | "cell_type": "code",
58 | "execution_count": 4,
59 | "id": "4edb56db",
60 | "metadata": {},
61 | "outputs": [
62 | {
63 | "data": {
64 | "text/plain": [
65 | "array([[ 6, 8],\n",
66 | " [10, 12]])"
67 | ]
68 | },
69 | "execution_count": 4,
70 | "metadata": {},
71 | "output_type": "execute_result"
72 | }
73 | ],
74 | "source": [
75 | "# 加法運算\n",
76 | "a = x + y; a"
77 | ]
78 | },
79 | {
80 | "cell_type": "code",
81 | "execution_count": 5,
82 | "id": "01781ceb",
83 | "metadata": {},
84 | "outputs": [
85 | {
86 | "data": {
87 | "text/plain": [
88 | "array([[ 5, 12],\n",
89 | " [21, 32]])"
90 | ]
91 | },
92 | "execution_count": 5,
93 | "metadata": {},
94 | "output_type": "execute_result"
95 | }
96 | ],
97 | "source": [
98 | "# 相對位置乘法運算\n",
99 | "'''\n",
100 | "註: 這裡是陣列運算,與矩陣 (matrix) 運算是不一樣的作法\n",
101 | "'''\n",
102 | "a = x * y; a"
103 | ]
104 | },
105 | {
106 | "cell_type": "code",
107 | "execution_count": 6,
108 | "id": "f7508a11",
109 | "metadata": {},
110 | "outputs": [
111 | {
112 | "data": {
113 | "text/plain": [
114 | "array([[0.2 , 0.33333333],\n",
115 | " [0.42857143, 0.5 ]])"
116 | ]
117 | },
118 | "execution_count": 6,
119 | "metadata": {},
120 | "output_type": "execute_result"
121 | }
122 | ],
123 | "source": [
124 | "# 相對位置除法運算\n",
125 | "a = x / y; a"
126 | ]
127 | },
128 | {
129 | "cell_type": "markdown",
130 | "id": "26745b22",
131 | "metadata": {},
132 | "source": [
133 | "# 關係運算子運算"
134 | ]
135 | },
136 | {
137 | "cell_type": "code",
138 | "execution_count": 7,
139 | "id": "1173e62d",
140 | "metadata": {},
141 | "outputs": [
142 | {
143 | "data": {
144 | "text/plain": [
145 | "array([[False, False],\n",
146 | " [False, False]])"
147 | ]
148 | },
149 | "execution_count": 7,
150 | "metadata": {},
151 | "output_type": "execute_result"
152 | }
153 | ],
154 | "source": [
155 | "# 大於\n",
156 | "a = x > y; a"
157 | ]
158 | },
159 | {
160 | "cell_type": "code",
161 | "execution_count": 8,
162 | "id": "2899833e",
163 | "metadata": {},
164 | "outputs": [
165 | {
166 | "data": {
167 | "text/plain": [
168 | "array([[ True, True],\n",
169 | " [ True, True]])"
170 | ]
171 | },
172 | "execution_count": 8,
173 | "metadata": {},
174 | "output_type": "execute_result"
175 | }
176 | ],
177 | "source": [
178 | "# 小於\n",
179 | "a = x < y; a"
180 | ]
181 | },
182 | {
183 | "cell_type": "markdown",
184 | "id": "d1f945f3",
185 | "metadata": {},
186 | "source": [
187 | "# 取得與設定二維陣列元素 (Indexing)"
188 | ]
189 | },
190 | {
191 | "cell_type": "code",
192 | "execution_count": 9,
193 | "id": "81962580",
194 | "metadata": {},
195 | "outputs": [
196 | {
197 | "data": {
198 | "text/plain": [
199 | "2"
200 | ]
201 | },
202 | "execution_count": 9,
203 | "metadata": {},
204 | "output_type": "execute_result"
205 | }
206 | ],
207 | "source": [
208 | "# 取得二維陣列某元素內容\n",
209 | "x[0, 1] # row = 0, col = 1"
210 | ]
211 | },
212 | {
213 | "cell_type": "code",
214 | "execution_count": 10,
215 | "id": "e8b7c110",
216 | "metadata": {},
217 | "outputs": [
218 | {
219 | "data": {
220 | "text/plain": [
221 | "array([[ 5, 5, 6, 6],\n",
222 | " [ 3, 3, 11, 2]])"
223 | ]
224 | },
225 | "execution_count": 10,
226 | "metadata": {},
227 | "output_type": "execute_result"
228 | }
229 | ],
230 | "source": [
231 | "# 設定二維陣列某元素內容\n",
232 | "tmp = np.array([[5, 5, 6, 6], [3, 3, 1, 2]])\n",
233 | "tmp[1, 2] = 11; tmp"
234 | ]
235 | },
236 | {
237 | "cell_type": "code",
238 | "execution_count": 11,
239 | "id": "84d457c7",
240 | "metadata": {},
241 | "outputs": [
242 | {
243 | "data": {
244 | "text/plain": [
245 | "array([1, 2])"
246 | ]
247 | },
248 | "execution_count": 11,
249 | "metadata": {},
250 | "output_type": "execute_result"
251 | }
252 | ],
253 | "source": [
254 | "# 取得 row = 0 的元素\n",
255 | "'''\n",
256 | "x[0] 的內容: [[1,2], [3,4]]\n",
257 | "\n",
258 | "以下方式同樣效果\n",
259 | "x[0,]\n",
260 | "x[0,:]\n",
261 | "'''\n",
262 | "x[0]"
263 | ]
264 | },
265 | {
266 | "cell_type": "code",
267 | "execution_count": 12,
268 | "id": "2a89443b",
269 | "metadata": {},
270 | "outputs": [
271 | {
272 | "data": {
273 | "text/plain": [
274 | "array([1, 3])"
275 | ]
276 | },
277 | "execution_count": 12,
278 | "metadata": {},
279 | "output_type": "execute_result"
280 | }
281 | ],
282 | "source": [
283 | "# 取得 column = 0 的元素\n",
284 | "'''\n",
285 | "x[0] 的內容: [[1,2], [3,4]]\n",
286 | "\n",
287 | "以下方式同樣效果\n",
288 | "x[:,0]\n",
289 | "'''\n",
290 | "x[:,0]"
291 | ]
292 | },
293 | {
294 | "cell_type": "markdown",
295 | "id": "06415ddf",
296 | "metadata": {},
297 | "source": [
298 | "# 切片 (Slicing)"
299 | ]
300 | },
301 | {
302 | "cell_type": "markdown",
303 | "id": "9b2f1e3a",
304 | "metadata": {},
305 | "source": [
306 | "在這裡使用 xx = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])"
307 | ]
308 | },
309 | {
310 | "cell_type": "code",
311 | "execution_count": 13,
312 | "id": "8c451745",
313 | "metadata": {},
314 | "outputs": [],
315 | "source": [
316 | "xx = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])"
317 | ]
318 | },
319 | {
320 | "cell_type": "code",
321 | "execution_count": 14,
322 | "id": "ac2bc558",
323 | "metadata": {},
324 | "outputs": [
325 | {
326 | "data": {
327 | "text/plain": [
328 | "array([1, 2, 3])"
329 | ]
330 | },
331 | "execution_count": 14,
332 | "metadata": {},
333 | "output_type": "execute_result"
334 | }
335 | ],
336 | "source": [
337 | "# 取得 row = 0 的前 3 個元素\n",
338 | "xx[0, :3]"
339 | ]
340 | },
341 | {
342 | "cell_type": "code",
343 | "execution_count": 15,
344 | "id": "7861cbc2",
345 | "metadata": {},
346 | "outputs": [
347 | {
348 | "data": {
349 | "text/plain": [
350 | "array([[3, 4],\n",
351 | " [7, 8]])"
352 | ]
353 | },
354 | "execution_count": 15,
355 | "metadata": {},
356 | "output_type": "execute_result"
357 | }
358 | ],
359 | "source": [
360 | "# 取得 row=0:2, column=2:4\n",
361 | "'''\n",
362 | "實際上是 row 0 ~ row 1,以及 column 2 和 column 3 的資料\n",
363 | "'''\n",
364 | "xx[0:2, 2:4]"
365 | ]
366 | },
367 | {
368 | "cell_type": "code",
369 | "execution_count": 16,
370 | "id": "7997a99c",
371 | "metadata": {},
372 | "outputs": [
373 | {
374 | "data": {
375 | "text/plain": [
376 | "array([[1, 2, 3, 4],\n",
377 | " [5, 6, 7, 8]])"
378 | ]
379 | },
380 | "execution_count": 16,
381 | "metadata": {},
382 | "output_type": "execute_result"
383 | }
384 | ],
385 | "source": [
386 | "# 取得前 2 個 row 的元素\n",
387 | "xx[:2]"
388 | ]
389 | },
390 | {
391 | "cell_type": "code",
392 | "execution_count": 17,
393 | "id": "ff019b0a",
394 | "metadata": {},
395 | "outputs": [
396 | {
397 | "data": {
398 | "text/plain": [
399 | "array([[ 5, 6, 7, 8],\n",
400 | " [ 9, 10, 11, 12]])"
401 | ]
402 | },
403 | "execution_count": 17,
404 | "metadata": {},
405 | "output_type": "execute_result"
406 | }
407 | ],
408 | "source": [
409 | "# 取得 row = 1 之後的元素\n",
410 | "xx[1:]"
411 | ]
412 | },
413 | {
414 | "cell_type": "markdown",
415 | "id": "d355f3e1",
416 | "metadata": {},
417 | "source": [
418 | "# 更改陣列形狀 (即是改變陣列維度)"
419 | ]
420 | },
421 | {
422 | "cell_type": "code",
423 | "execution_count": 18,
424 | "id": "32eab133",
425 | "metadata": {},
426 | "outputs": [],
427 | "source": [
428 | "# 建立一維陣列\n",
429 | "x1 = np.array([1, 2, 3, 4, 5, 6])"
430 | ]
431 | },
432 | {
433 | "cell_type": "code",
434 | "execution_count": 19,
435 | "id": "2e35e466",
436 | "metadata": {},
437 | "outputs": [
438 | {
439 | "data": {
440 | "text/plain": [
441 | "array([[1, 2, 3],\n",
442 | " [4, 5, 6]])"
443 | ]
444 | },
445 | "execution_count": 19,
446 | "metadata": {},
447 | "output_type": "execute_result"
448 | }
449 | ],
450 | "source": [
451 | "# 轉成 2x3 陣列 (2 列 3 行,2 rows,3 columns)\n",
452 | "# 註: 「不會」修改原始陣列,「會」回傳轉換後的新陣列\n",
453 | "y1 = x1.reshape(2, 3); y1"
454 | ]
455 | },
456 | {
457 | "cell_type": "code",
458 | "execution_count": 20,
459 | "id": "38db8541",
460 | "metadata": {},
461 | "outputs": [
462 | {
463 | "data": {
464 | "text/plain": [
465 | "array([1, 2, 3, 4, 5, 6])"
466 | ]
467 | },
468 | "execution_count": 20,
469 | "metadata": {},
470 | "output_type": "execute_result"
471 | }
472 | ],
473 | "source": [
474 | "# 將 2x3 陣列轉成一維陣列\n",
475 | "'''\n",
476 | "numpy.ravel(a, order='C')\n",
477 | "'''\n",
478 | "x2 = y1.ravel(); x2"
479 | ]
480 | },
481 | {
482 | "cell_type": "code",
483 | "execution_count": 21,
484 | "id": "dfb707ac",
485 | "metadata": {},
486 | "outputs": [
487 | {
488 | "data": {
489 | "text/plain": [
490 | "array([[1, 2],\n",
491 | " [3, 4],\n",
492 | " [5, 6]])"
493 | ]
494 | },
495 | "execution_count": 21,
496 | "metadata": {},
497 | "output_type": "execute_result"
498 | }
499 | ],
500 | "source": [
501 | "# 將 2x3 陣列,改成 3x2 陣列\n",
502 | "# 註: 「會」修改原始陣列,「不會」回傳轉換後的新陣列\n",
503 | "y1.resize(3,2); y1"
504 | ]
505 | },
506 | {
507 | "cell_type": "markdown",
508 | "id": "1462c324",
509 | "metadata": {},
510 | "source": [
511 | "# 轉置矩陣 transpose()"
512 | ]
513 | },
514 | {
515 | "cell_type": "markdown",
516 | "id": "92f85206",
517 | "metadata": {},
518 | "source": [
519 | "把 n x m 的矩陣,變成 m x n 的矩陣"
520 | ]
521 | },
522 | {
523 | "cell_type": "code",
524 | "execution_count": 22,
525 | "id": "96d90580",
526 | "metadata": {},
527 | "outputs": [
528 | {
529 | "data": {
530 | "text/plain": [
531 | "array([[0, 2, 4, 6],\n",
532 | " [1, 3, 5, 7]])"
533 | ]
534 | },
535 | "execution_count": 22,
536 | "metadata": {},
537 | "output_type": "execute_result"
538 | }
539 | ],
540 | "source": [
541 | "# 生成一維陣列 (0 - 7),reshape 成 4 列 2 行後,再 transpose 成為 2 列 4 行\n",
542 | "a = np.arange(8).reshape(4, 2); a\n",
543 | "'''\n",
544 | "reshape 後的結果:\n",
545 | "[[0, 1],\n",
546 | " [2, 3],\n",
547 | " [4, 5],\n",
548 | " [6, 7]]\n",
549 | "'''\n",
550 | "b = a.transpose(); b"
551 | ]
552 | },
553 | {
554 | "cell_type": "code",
555 | "execution_count": 23,
556 | "id": "41299890",
557 | "metadata": {},
558 | "outputs": [
559 | {
560 | "data": {
561 | "text/plain": [
562 | "array([[0, 2, 4, 6],\n",
563 | " [1, 3, 5, 7]])"
564 | ]
565 | },
566 | "execution_count": 23,
567 | "metadata": {},
568 | "output_type": "execute_result"
569 | }
570 | ],
571 | "source": [
572 | "# 也可以使用 T 來進行 transpose\n",
573 | "a = np.arange(8).reshape(4, 2); a\n",
574 | "b = a.T; b"
575 | ]
576 | },
577 | {
578 | "cell_type": "markdown",
579 | "id": "bd7a0460",
580 | "metadata": {},
581 | "source": [
582 | "# 點積 dot()"
583 | ]
584 | },
585 | {
586 | "cell_type": "code",
587 | "execution_count": 30,
588 | "id": "ee6fa276",
589 | "metadata": {},
590 | "outputs": [
591 | {
592 | "data": {
593 | "text/plain": [
594 | "408"
595 | ]
596 | },
597 | "execution_count": 30,
598 | "metadata": {},
599 | "output_type": "execute_result"
600 | }
601 | ],
602 | "source": [
603 | "# 如果是一維,計算結果等同於 inner product \n",
604 | "# = np.inner(a, b)\n",
605 | "# = a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3] + a[4]*b[4] + a[5]*b[5] + a[6]*b[6] + a[7]*b[7]\n",
606 | "# = 1*2 + 2*4 + 3*6 + 4*8 + 5*10 + 6*12 + 7*14 + 8*16\n",
607 | "# = 2 + 8 + 18 + 32 + 50 + 72 + 98 + 128\n",
608 | "# = 408\n",
609 | "a = np.array([1, 2, 3, 4, 5, 6, 7, 8])\n",
610 | "b = np.array([2, 4, 6, 8, 10, 12, 14, 16])\n",
611 | "c = np.dot(a, b); c"
612 | ]
613 | },
614 | {
615 | "cell_type": "code",
616 | "execution_count": 31,
617 | "id": "99673b42",
618 | "metadata": {},
619 | "outputs": [
620 | {
621 | "data": {
622 | "text/plain": [
623 | "array([[19, 22],\n",
624 | " [43, 50]])"
625 | ]
626 | },
627 | "execution_count": 31,
628 | "metadata": {},
629 | "output_type": "execute_result"
630 | }
631 | ],
632 | "source": [
633 | "# 如果是二維,計算結果等同於 matrix multiplication\n",
634 | "a = np.array([[1, 2], [3, 4]])\n",
635 | "b = np.array([[5, 6], [7, 8]])\n",
636 | "c = np.dot(a, b); c\n"
637 | ]
638 | },
639 | {
640 | "cell_type": "markdown",
641 | "id": "3d3e3504",
642 | "metadata": {},
643 | "source": [
644 | "# 矩陣相乘 matmul()"
645 | ]
646 | },
647 | {
648 | "cell_type": "code",
649 | "execution_count": 29,
650 | "id": "a12421e2",
651 | "metadata": {},
652 | "outputs": [
653 | {
654 | "data": {
655 | "text/plain": [
656 | "array([[ 76, 82],\n",
657 | " [184, 199],\n",
658 | " [292, 316]])"
659 | ]
660 | },
661 | "execution_count": 29,
662 | "metadata": {},
663 | "output_type": "execute_result"
664 | }
665 | ],
666 | "source": [
667 | "# 典型的矩陣乘法\n",
668 | "a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\n",
669 | "b = np.array([[10, 11], [12, 13], [14, 15]])\n",
670 | "c = np.matmul(a, b); c"
671 | ]
672 | },
673 | {
674 | "cell_type": "markdown",
675 | "id": "1e65463d",
676 | "metadata": {},
677 | "source": [
678 | "# 對應矩陣相乘 multiply()"
679 | ]
680 | },
681 | {
682 | "cell_type": "code",
683 | "execution_count": 33,
684 | "id": "13650d19",
685 | "metadata": {},
686 | "outputs": [
687 | {
688 | "data": {
689 | "text/plain": [
690 | "array([ 4, 10, 18])"
691 | ]
692 | },
693 | "execution_count": 33,
694 | "metadata": {},
695 | "output_type": "execute_result"
696 | }
697 | ],
698 | "source": [
699 | "# 如果是一維,計算結果等同於 element-wise product\n",
700 | "a = np.array([1, 2, 3])\n",
701 | "b = np.array([4, 5, 6])\n",
702 | "c = np.multiply(a, b); c"
703 | ]
704 | },
705 | {
706 | "cell_type": "code",
707 | "execution_count": 34,
708 | "id": "0835e290",
709 | "metadata": {},
710 | "outputs": [
711 | {
712 | "data": {
713 | "text/plain": [
714 | "array([[ 5, 12],\n",
715 | " [21, 32]])"
716 | ]
717 | },
718 | "execution_count": 34,
719 | "metadata": {},
720 | "output_type": "execute_result"
721 | }
722 | ],
723 | "source": [
724 | "# 如果是二維,計算結果等同於 element-wise product\n",
725 | "a = np.array([[1, 2], [3, 4]])\n",
726 | "b = np.array([[5, 6], [7, 8]])\n",
727 | "c = np.multiply(a, b); c"
728 | ]
729 | },
730 | {
731 | "cell_type": "markdown",
732 | "id": "32b5b415",
733 | "metadata": {},
734 | "source": [
735 | "[【一些遇到就懵的概念】point-wise, pair-wise, element-wise 是什么](https://blog.csdn.net/weixin_43900869/article/details/131490669)"
736 | ]
737 | },
738 | {
739 | "cell_type": "markdown",
740 | "id": "8f04c483",
741 | "metadata": {},
742 | "source": [
743 | "# 廣播 (broadcast)"
744 | ]
745 | },
746 | {
747 | "cell_type": "markdown",
748 | "id": "54656c16",
749 | "metadata": {},
750 | "source": [
751 | "執行 2 個陣列運算時,原則上必須外形相同才能運算,如果不同,可以使用廣播 (broadcasting) 機制,將小陣列「擴大」到兩個陣列都相同,之後再進行運算。\n",
752 | "\n",
753 | "\n",
754 | "參考資料: [Computation on Arrays: Broadcasting](https://jakevdp.github.io/PythonDataScienceHandbook/02.05-computation-on-arrays-broadcasting.html)"
755 | ]
756 | },
757 | {
758 | "cell_type": "code",
759 | "execution_count": 25,
760 | "id": "b6e059bd",
761 | "metadata": {},
762 | "outputs": [
763 | {
764 | "data": {
765 | "text/plain": [
766 | "array([5, 6, 7])"
767 | ]
768 | },
769 | "execution_count": 25,
770 | "metadata": {},
771 | "output_type": "execute_result"
772 | }
773 | ],
774 | "source": [
775 | "# np.arange(3) + 5 是否等於 [5,6,7] ?\n",
776 | "a = np.arange(3) + 5; a"
777 | ]
778 | },
779 | {
780 | "cell_type": "code",
781 | "execution_count": 26,
782 | "id": "3b7fa0ae",
783 | "metadata": {},
784 | "outputs": [
785 | {
786 | "data": {
787 | "text/plain": [
788 | "array([[1., 2., 3.],\n",
789 | " [1., 2., 3.],\n",
790 | " [1., 2., 3.]])"
791 | ]
792 | },
793 | "execution_count": 26,
794 | "metadata": {},
795 | "output_type": "execute_result"
796 | }
797 | ],
798 | "source": [
799 | "# np.ones((3, 3)) + np.arange(3) 是否等於 [[1,2,3],[1,2,3],[1,2,3]] ?\n",
800 | "a = np.ones((3, 3)) + np.arange(3); a"
801 | ]
802 | },
803 | {
804 | "cell_type": "code",
805 | "execution_count": 27,
806 | "id": "8fcdd327",
807 | "metadata": {},
808 | "outputs": [
809 | {
810 | "data": {
811 | "text/plain": [
812 | "array([[0, 1, 2],\n",
813 | " [1, 2, 3],\n",
814 | " [2, 3, 4]])"
815 | ]
816 | },
817 | "execution_count": 27,
818 | "metadata": {},
819 | "output_type": "execute_result"
820 | }
821 | ],
822 | "source": [
823 | "# np.arange(3).reshape((3,1)) + np.arange(3) 是否等於 [[0,1,2],[1,2,3],[2,3,4]] ?\n",
824 | "a = np.arange(3).reshape((3,1)) + np.arange(3); a"
825 | ]
826 | }
827 | ],
828 | "metadata": {
829 | "kernelspec": {
830 | "display_name": "test",
831 | "language": "python",
832 | "name": "python3"
833 | },
834 | "language_info": {
835 | "codemirror_mode": {
836 | "name": "ipython",
837 | "version": 3
838 | },
839 | "file_extension": ".py",
840 | "mimetype": "text/x-python",
841 | "name": "python",
842 | "nbconvert_exporter": "python",
843 | "pygments_lexer": "ipython3",
844 | "version": "3.11.11"
845 | }
846 | },
847 | "nbformat": 4,
848 | "nbformat_minor": 5
849 | }
850 |
--------------------------------------------------------------------------------
/cases/mysql.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": null,
6 | "id": "6f9c10d9",
7 | "metadata": {},
8 | "outputs": [],
9 | "source": [
10 | "!pip install pymysql SQLAlchemy"
11 | ]
12 | },
13 | {
14 | "cell_type": "markdown",
15 | "id": "e5b252d8",
16 | "metadata": {},
17 | "source": [
18 | "## 在資料庫的交易中,為確保交易(Transaction)是正確可靠的,所以必須具備四個特性:\n",
19 | "- **Atomicity 原子性**\n",
20 | " - 在資料庫的每一筆交易中只有兩種可能發生,第一種是全部完全(commit),第二種是全部不完成(rollback),不會因為某個環節出錯,而終止在那個環節,在出錯之後會恢復至交易之前的狀態,如同還沒執行此筆交易。\n",
21 | "- **Consistency 一致性**\n",
22 | " - 在交易中會產生資料或者驗證狀態,然而當錯誤發生,所有已更改的資料或狀態將會恢復至交易之前。\n",
23 | "- **Isolation 隔離性**\n",
24 | " - 資料庫允許多筆交易同時進行,交易進行時未完成的交易資料並不會被其他交易使用,直到此筆交易完成。\n",
25 | "- **Durability 永續性**\n",
26 | " - 交易完成後對資料的修改是永久性的,資料不會因為系統重啟或錯誤而改變。"
27 | ]
28 | },
29 | {
30 | "cell_type": "markdown",
31 | "id": "e18723b0",
32 | "metadata": {},
33 | "source": [
34 | ""
35 | ]
36 | },
37 | {
38 | "cell_type": "markdown",
39 | "id": "ae333e11",
40 | "metadata": {},
41 | "source": [
42 | "# PyMySQL 使用方式"
43 | ]
44 | },
45 | {
46 | "cell_type": "code",
47 | "execution_count": 1,
48 | "id": "82561ad3",
49 | "metadata": {},
50 | "outputs": [
51 | {
52 | "name": "stdout",
53 | "output_type": "stream",
54 | "text": [
55 | "{'sId': '003', 'sName': '王○○', 'sGender': '男', 'sNickname': '小王'}\n",
56 | "{'sId': '004', 'sName': '江○○', 'sGender': '女', 'sNickname': '小江'}\n",
57 | "{'sId': '005', 'sName': '周○○', 'sGender': '女', 'sNickname': '小周'}\n",
58 | "{'sId': '006', 'sName': '黃○○', 'sGender': '男', 'sNickname': '小黃'}\n",
59 | "{'sId': '007', 'sName': '丁○○', 'sGender': '男', 'sNickname': '小丁'}\n",
60 | "{'sId': '008', 'sName': '鄭○○', 'sGender': '男', 'sNickname': '小鄭'}\n",
61 | "{'sId': '087', 'sName': '楊○○', 'sGender': '男', 'sNickname': '好人'}\n",
62 | "{'sId': '088', 'sName': '陳○○', 'sGender': '女', 'sNickname': '小白'}\n"
63 | ]
64 | }
65 | ],
66 | "source": [
67 | "'''\n",
68 | "參考頁面:\n",
69 | "[1] PyMySQL Examples\n",
70 | "https://pymysql.readthedocs.io/en/latest/user/examples.html\n",
71 | "[2] Python+MySQL資料庫操作(PyMySQL)\n",
72 | "https://www.tw511.com/3/39/1388.html\n",
73 | "[3] Python資料庫學習筆記(四):使用PyMySQL模組\n",
74 | "https://reurl.cc/Q78eD2\n",
75 | "'''\n",
76 | "\n",
77 | "import pymysql\n",
78 | "\n",
79 | "# 資料庫連線\n",
80 | "connection = pymysql.connect(\n",
81 | " host = 'localhost',\n",
82 | " user = 'root',\n",
83 | " password = 'root',\n",
84 | " database = 'my_db',\n",
85 | " charset = 'utf8mb4',\n",
86 | " cursorclass=pymysql.cursors.DictCursor # 不加這個,預設以 tuple 回傳\n",
87 | ")\n",
88 | "\n",
89 | "# 取得 cursor 物件,進行 CRUD\n",
90 | "cursor = connection.cursor()\n",
91 | "\n",
92 | "try:\n",
93 | " # 寫入資料\n",
94 | " # sql = \"INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)\"\n",
95 | " # cursor.execute(sql, ('你的email', '你的密碼'))\n",
96 | "\n",
97 | " # 查詢資料\n",
98 | " sql = \"SELECT * FROM `students`\"\n",
99 | " cursor.execute(sql)\n",
100 | "\n",
101 | " # 查詢結果列數大於0 ,代表有資料\n",
102 | " if cursor.rowcount > 0:\n",
103 | " # 將查詢結果轉成 list 型態 (裡頭元素都是 dict)\n",
104 | " results = cursor.fetchall() # 如果 sql 語法明顯只取得一筆,則使用 fetchone()\n",
105 | " '''\n",
106 | " [\n",
107 | " {'sId': '003', 'sName': '王○○', 'sGender': '男', 'sNickname': '小王'},\n",
108 | " {'sId': '004', 'sName': '江○○', 'sGender': '女', 'sNickname': '小江'},\n",
109 | " {'sId': '005', 'sName': '周○○', 'sGender': '女', 'sNickname': '小周'},\n",
110 | " {'sId': '006', 'sName': '黃○○', 'sGender': '男', 'sNickname': '小黃'},\n",
111 | " {'sId': '007', 'sName': '丁○○', 'sGender': '男', 'sNickname': '小丁'},\n",
112 | " {'sId': '008', 'sName': '鄭○○', 'sGender': '男', 'sNickname': '小鄭'},\n",
113 | " {'sId': '087', 'sName': '楊○○', 'sGender': '男', 'sNickname': '好人'},\n",
114 | " {'sId': '088', 'sName': '陳○○', 'sGender': '女', 'sNickname': '小白'}\n",
115 | " ]\n",
116 | " '''\n",
117 | " \n",
118 | " # 迭代取得資料 (dict 型態)\n",
119 | " for result in results:\n",
120 | " print(result)\n",
121 | " else:\n",
122 | " print(\"rowcount: 0\")\n",
123 | "\n",
124 | " # 提交 SQL 執行結果\n",
125 | " connection.commit()\n",
126 | "except Exception as e:\n",
127 | " # 回滾\n",
128 | " connection.rollback()\n",
129 | " print(\"SQL 執行失敗\")\n",
130 | " print(e)\n",
131 | "\n",
132 | "# 釋放 cursor\n",
133 | "cursor.close()\n",
134 | "\n",
135 | "# 關閉資料庫連線\n",
136 | "connection.close()"
137 | ]
138 | },
139 | {
140 | "cell_type": "markdown",
141 | "id": "05e7cc13",
142 | "metadata": {},
143 | "source": [
144 | "# MySQL 整合 Pandas"
145 | ]
146 | },
147 | {
148 | "cell_type": "code",
149 | "execution_count": 2,
150 | "id": "d7d896a5",
151 | "metadata": {},
152 | "outputs": [
153 | {
154 | "data": {
155 | "text/html": [
156 | "\n",
157 | "\n",
170 | "
\n",
171 | " \n",
172 | " \n",
173 | " | \n",
174 | " sId | \n",
175 | " sName | \n",
176 | " sGender | \n",
177 | " sNickname | \n",
178 | "
\n",
179 | " \n",
180 | " \n",
181 | " \n",
182 | " | 0 | \n",
183 | " 003 | \n",
184 | " 王○○ | \n",
185 | " 男 | \n",
186 | " 小王 | \n",
187 | "
\n",
188 | " \n",
189 | " | 1 | \n",
190 | " 004 | \n",
191 | " 江○○ | \n",
192 | " 女 | \n",
193 | " 小江 | \n",
194 | "
\n",
195 | " \n",
196 | " | 2 | \n",
197 | " 005 | \n",
198 | " 周○○ | \n",
199 | " 女 | \n",
200 | " 小周 | \n",
201 | "
\n",
202 | " \n",
203 | " | 3 | \n",
204 | " 006 | \n",
205 | " 黃○○ | \n",
206 | " 男 | \n",
207 | " 小黃 | \n",
208 | "
\n",
209 | " \n",
210 | " | 4 | \n",
211 | " 007 | \n",
212 | " 丁○○ | \n",
213 | " 男 | \n",
214 | " 小丁 | \n",
215 | "
\n",
216 | " \n",
217 | " | 5 | \n",
218 | " 008 | \n",
219 | " 鄭○○ | \n",
220 | " 男 | \n",
221 | " 小鄭 | \n",
222 | "
\n",
223 | " \n",
224 | " | 6 | \n",
225 | " 087 | \n",
226 | " 楊○○ | \n",
227 | " 男 | \n",
228 | " 好人 | \n",
229 | "
\n",
230 | " \n",
231 | " | 7 | \n",
232 | " 088 | \n",
233 | " 陳○○ | \n",
234 | " 女 | \n",
235 | " 小白 | \n",
236 | "
\n",
237 | " \n",
238 | "
\n",
239 | "
"
240 | ],
241 | "text/plain": [
242 | " sId sName sGender sNickname\n",
243 | "0 003 王○○ 男 小王\n",
244 | "1 004 江○○ 女 小江\n",
245 | "2 005 周○○ 女 小周\n",
246 | "3 006 黃○○ 男 小黃\n",
247 | "4 007 丁○○ 男 小丁\n",
248 | "5 008 鄭○○ 男 小鄭\n",
249 | "6 087 楊○○ 男 好人\n",
250 | "7 088 陳○○ 女 小白"
251 | ]
252 | },
253 | "execution_count": 2,
254 | "metadata": {},
255 | "output_type": "execute_result"
256 | }
257 | ],
258 | "source": [
259 | "# 在這裡會同時使用到 pymysql 和 sqlalchemy\n",
260 | "import pymysql\n",
261 | "import pandas as pd\n",
262 | "from sqlalchemy import create_engine\n",
263 | "\n",
264 | "# 資料庫基本設定\n",
265 | "host = 'localhost'\n",
266 | "user = 'root'\n",
267 | "password = 'root'\n",
268 | "database = 'my_db'\n",
269 | "charset = 'utf8mb4'\n",
270 | "\n",
271 | "# 建立 sqlalchemy engine\n",
272 | "engine = create_engine(f\"mysql+pymysql://{user}:{password}@{host}/{database}?charset={charset}\")\n",
273 | "\n",
274 | "# SQL 語法 (可以撰寫多行的 SQL)\n",
275 | "sql = '''SELECT * FROM `my_db`.`students`;'''\n",
276 | "\n",
277 | "# 整合 PyMySQL 連線,透過 Pandas 取得 SQL 查詢後的資料,變成 dataframe\n",
278 | "df = pd.read_sql(sql, con=engine); df"
279 | ]
280 | },
281 | {
282 | "cell_type": "code",
283 | "execution_count": 3,
284 | "id": "b92f5afe",
285 | "metadata": {},
286 | "outputs": [
287 | {
288 | "data": {
289 | "image/png": "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",
290 | "text/plain": [
291 | ""
292 | ]
293 | },
294 | "metadata": {},
295 | "output_type": "display_data"
296 | }
297 | ],
298 | "source": [
299 | "# 匯入套件(模組)\n",
300 | "import matplotlib.pyplot as plt\n",
301 | "import numpy as np\n",
302 | "\n",
303 | "# group by 以後,進行查詢,並與 matplotlib 整合\n",
304 | "sql = '''\n",
305 | "SELECT `cId`, AVG(`score`) AS `avg_score`\n",
306 | "FROM `scores`\n",
307 | "GROUP BY `cId`\n",
308 | "'''\n",
309 | "df = pd.read_sql(sql, con=engine); df\n",
310 | "\n",
311 | "# 繪製長條圖\n",
312 | "plt.bar(df['cId'], df['avg_score'], width=0.5)\n",
313 | "\n",
314 | "# 設定數值文字在圖表上\n",
315 | "for i in df.index:\n",
316 | " plt.text(i, df['avg_score'][i], df['avg_score'][i])\n",
317 | "\n",
318 | "# 顯示圖表\n",
319 | "plt.show()"
320 | ]
321 | }
322 | ],
323 | "metadata": {
324 | "kernelspec": {
325 | "display_name": "Python 3 (ipykernel)",
326 | "language": "python",
327 | "name": "python3"
328 | },
329 | "language_info": {
330 | "codemirror_mode": {
331 | "name": "ipython",
332 | "version": 3
333 | },
334 | "file_extension": ".py",
335 | "mimetype": "text/x-python",
336 | "name": "python",
337 | "nbconvert_exporter": "python",
338 | "pygments_lexer": "ipython3",
339 | "version": "3.10.10"
340 | }
341 | },
342 | "nbformat": 4,
343 | "nbformat_minor": 5
344 | }
345 |
--------------------------------------------------------------------------------
/3-1 Pandas 檔案輸入與輸出.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "868197df",
6 | "metadata": {},
7 | "source": [
8 | "# 有關檔案編碼的部分,請參考這個連結\n",
9 | "[standard-encodings](https://docs.python.org/3/library/codecs.html#standard-encodings)"
10 | ]
11 | },
12 | {
13 | "cell_type": "code",
14 | "execution_count": null,
15 | "id": "da4e9e76",
16 | "metadata": {},
17 | "outputs": [],
18 | "source": [
19 | "# 安裝套件\n",
20 | "!pip install pandas openpyxl"
21 | ]
22 | },
23 | {
24 | "cell_type": "code",
25 | "execution_count": 1,
26 | "id": "0aa8cc86",
27 | "metadata": {},
28 | "outputs": [],
29 | "source": [
30 | "# 匯入套件\n",
31 | "import pandas as pd"
32 | ]
33 | },
34 | {
35 | "cell_type": "markdown",
36 | "id": "ba1bde58",
37 | "metadata": {},
38 | "source": [
39 | "# 讀寫 csv 檔\n",
40 | "- CSV: Comma-Separated Values\n",
41 | " - pd.read_csv(): 讀取 csv 檔\n",
42 | " - df.to_csv(): 寫入 csv 檔\n",
43 | "- 請另存下載 [csv檔: 垃圾車點位路線資訊](https://data.taipei/api/frontstage/tpeod/dataset/resource.download?rid=a6e90031-7ec4-4089-afb5-361a4efe7202) 到專案目錄當中。"
44 | ]
45 | },
46 | {
47 | "cell_type": "code",
48 | "execution_count": 2,
49 | "id": "773ed123",
50 | "metadata": {},
51 | "outputs": [
52 | {
53 | "data": {
54 | "text/html": [
55 | "\n",
56 | "\n",
69 | "
\n",
70 | " \n",
71 | " \n",
72 | " | \n",
73 | " 行政區 | \n",
74 | " 里別 | \n",
75 | " 分隊 | \n",
76 | " 局編 | \n",
77 | " 車號 | \n",
78 | " 路線 | \n",
79 | " 車次 | \n",
80 | " 抵達時間 | \n",
81 | " 離開時間 | \n",
82 | " 地點 | \n",
83 | " 緯度 | \n",
84 | " 經度 | \n",
85 | "
\n",
86 | " \n",
87 | " \n",
88 | " \n",
89 | " | 0 | \n",
90 | " 中山區 | \n",
91 | " 力行里 | \n",
92 | " 長安分隊 | \n",
93 | " 100-021 | \n",
94 | " 119-BQ | \n",
95 | " 長安-3 | \n",
96 | " 第1車 | \n",
97 | " 1630 | \n",
98 | " 1638 | \n",
99 | " 臺北市中山區建國北路一段69號前 | \n",
100 | " 121.536944 | \n",
101 | " 25.051111 | \n",
102 | "
\n",
103 | " \n",
104 | " | 1 | \n",
105 | " 中山區 | \n",
106 | " 力行里 | \n",
107 | " 長安分隊 | \n",
108 | " 100-021 | \n",
109 | " 119-BQ | \n",
110 | " 長安-3 | \n",
111 | " 第1車 | \n",
112 | " 1640 | \n",
113 | " 1649 | \n",
114 | " 臺北市中山區南京東路三段176號前(遼寧街口) | \n",
115 | " 121.542222 | \n",
116 | " 25.051944 | \n",
117 | "
\n",
118 | " \n",
119 | " | 2 | \n",
120 | " 中山區 | \n",
121 | " 力行里 | \n",
122 | " 長安分隊 | \n",
123 | " 100-021 | \n",
124 | " 119-BQ | \n",
125 | " 長安-3 | \n",
126 | " 第1車 | \n",
127 | " 1650 | \n",
128 | " 1658 | \n",
129 | " 臺北市中山區南京東路三段214號前 | \n",
130 | " 121.543385 | \n",
131 | " 25.051725 | \n",
132 | "
\n",
133 | " \n",
134 | " | 3 | \n",
135 | " 中山區 | \n",
136 | " 力行里 | \n",
137 | " 長安分隊 | \n",
138 | " 100-021 | \n",
139 | " 119-BQ | \n",
140 | " 長安-3 | \n",
141 | " 第1車 | \n",
142 | " 1700 | \n",
143 | " 1709 | \n",
144 | " 臺北市中山區復興北路66號 | \n",
145 | " 121.543853 | \n",
146 | " 25.050820 | \n",
147 | "
\n",
148 | " \n",
149 | " | 4 | \n",
150 | " 中山區 | \n",
151 | " 力行里 | \n",
152 | " 長安分隊 | \n",
153 | " 100-021 | \n",
154 | " 119-BQ | \n",
155 | " 長安-3 | \n",
156 | " 第1車 | \n",
157 | " 1710 | \n",
158 | " 1716 | \n",
159 | " 臺北市中山區復興北路28號前 | \n",
160 | " 121.543813 | \n",
161 | " 25.048861 | \n",
162 | "
\n",
163 | " \n",
164 | " | ... | \n",
165 | " ... | \n",
166 | " ... | \n",
167 | " ... | \n",
168 | " ... | \n",
169 | " ... | \n",
170 | " ... | \n",
171 | " ... | \n",
172 | " ... | \n",
173 | " ... | \n",
174 | " ... | \n",
175 | " ... | \n",
176 | " ... | \n",
177 | "
\n",
178 | " \n",
179 | " | 4043 | \n",
180 | " 萬華區 | \n",
181 | " 新起里 | \n",
182 | " 漢中分隊 | \n",
183 | " 110-G01 | \n",
184 | " KEJ-0038 | \n",
185 | " 漢中-1 | \n",
186 | " 第3車 | \n",
187 | " 2141 | \n",
188 | " 2145 | \n",
189 | " 臺北市萬華區內江街110號前 | \n",
190 | " 121.503430 | \n",
191 | " 25.041577 | \n",
192 | "
\n",
193 | " \n",
194 | " | 4044 | \n",
195 | " 萬華區 | \n",
196 | " 新起里 | \n",
197 | " 漢中分隊 | \n",
198 | " 110-G01 | \n",
199 | " KEJ-0038 | \n",
200 | " 漢中-1 | \n",
201 | " 第3車 | \n",
202 | " 2146 | \n",
203 | " 2150 | \n",
204 | " 臺北市萬華區內江街74之1號前 | \n",
205 | " 121.504185 | \n",
206 | " 25.041492 | \n",
207 | "
\n",
208 | " \n",
209 | " | 4045 | \n",
210 | " 萬華區 | \n",
211 | " 西門里 | \n",
212 | " 漢中分隊 | \n",
213 | " 110-G01 | \n",
214 | " KEJ-0038 | \n",
215 | " 漢中-1 | \n",
216 | " 第3車 | \n",
217 | " 2151 | \n",
218 | " 2155 | \n",
219 | " 臺北市萬華區昆明街160號前 | \n",
220 | " 121.504607 | \n",
221 | " 25.042125 | \n",
222 | "
\n",
223 | " \n",
224 | " | 4046 | \n",
225 | " 萬華區 | \n",
226 | " 西門里 | \n",
227 | " 漢中分隊 | \n",
228 | " 110-G01 | \n",
229 | " KEJ-0038 | \n",
230 | " 漢中-1 | \n",
231 | " 第3車 | \n",
232 | " 2156 | \n",
233 | " 2200 | \n",
234 | " 臺北市萬華區昆明街134之2號前 | \n",
235 | " 121.504724 | \n",
236 | " 25.042720 | \n",
237 | "
\n",
238 | " \n",
239 | " | 4047 | \n",
240 | " 萬華區 | \n",
241 | " 西門里 | \n",
242 | " 漢中分隊 | \n",
243 | " 110-G01 | \n",
244 | " KEJ-0038 | \n",
245 | " 漢中-1 | \n",
246 | " 第3車 | \n",
247 | " 2201 | \n",
248 | " 2205 | \n",
249 | " 臺北市萬華區成都路105號前 | \n",
250 | " 121.504207 | \n",
251 | " 25.043244 | \n",
252 | "
\n",
253 | " \n",
254 | "
\n",
255 | "
4048 rows × 12 columns
\n",
256 | "
"
257 | ],
258 | "text/plain": [
259 | " 行政區 里別 分隊 局編 車號 路線 車次 抵達時間 離開時間 \n",
260 | "0 中山區 力行里 長安分隊 100-021 119-BQ 長安-3 第1車 1630 1638 \\\n",
261 | "1 中山區 力行里 長安分隊 100-021 119-BQ 長安-3 第1車 1640 1649 \n",
262 | "2 中山區 力行里 長安分隊 100-021 119-BQ 長安-3 第1車 1650 1658 \n",
263 | "3 中山區 力行里 長安分隊 100-021 119-BQ 長安-3 第1車 1700 1709 \n",
264 | "4 中山區 力行里 長安分隊 100-021 119-BQ 長安-3 第1車 1710 1716 \n",
265 | "... ... ... ... ... ... ... ... ... ... \n",
266 | "4043 萬華區 新起里 漢中分隊 110-G01 KEJ-0038 漢中-1 第3車 2141 2145 \n",
267 | "4044 萬華區 新起里 漢中分隊 110-G01 KEJ-0038 漢中-1 第3車 2146 2150 \n",
268 | "4045 萬華區 西門里 漢中分隊 110-G01 KEJ-0038 漢中-1 第3車 2151 2155 \n",
269 | "4046 萬華區 西門里 漢中分隊 110-G01 KEJ-0038 漢中-1 第3車 2156 2200 \n",
270 | "4047 萬華區 西門里 漢中分隊 110-G01 KEJ-0038 漢中-1 第3車 2201 2205 \n",
271 | "\n",
272 | " 地點 緯度 經度 \n",
273 | "0 臺北市中山區建國北路一段69號前 121.536944 25.051111 \n",
274 | "1 臺北市中山區南京東路三段176號前(遼寧街口) 121.542222 25.051944 \n",
275 | "2 臺北市中山區南京東路三段214號前 121.543385 25.051725 \n",
276 | "3 臺北市中山區復興北路66號 121.543853 25.050820 \n",
277 | "4 臺北市中山區復興北路28號前 121.543813 25.048861 \n",
278 | "... ... ... ... \n",
279 | "4043 臺北市萬華區內江街110號前 121.503430 25.041577 \n",
280 | "4044 臺北市萬華區內江街74之1號前 121.504185 25.041492 \n",
281 | "4045 臺北市萬華區昆明街160號前 121.504607 25.042125 \n",
282 | "4046 臺北市萬華區昆明街134之2號前 121.504724 25.042720 \n",
283 | "4047 臺北市萬華區成都路105號前 121.504207 25.043244 \n",
284 | "\n",
285 | "[4048 rows x 12 columns]"
286 | ]
287 | },
288 | "execution_count": 2,
289 | "metadata": {},
290 | "output_type": "execute_result"
291 | }
292 | ],
293 | "source": [
294 | "# 讀取 csv 格式檔案\n",
295 | "'''\n",
296 | "pd.read_csv(\n",
297 | " filepath_or_buffer=\"你的檔案路徑\", \n",
298 | " sep=\"分隔符號\", \n",
299 | " header=True或False, \n",
300 | " index=True或False, \n",
301 | " encoding=None, \n",
302 | " ...\n",
303 | ")\n",
304 | "\n",
305 | "說明:\n",
306 | "- 引數 filepath_or_buffer不一定要寫: \n",
307 | " - df = pd.read_csv(\"./output.csv\")\n",
308 | "- 近年許多檔案或資料,都使用 UTF-8 進行編碼\n",
309 | " - 一般來說,只要是 utf-8 編碼格式儲存的檔案,讀取成 dataframe 時候,不用特別指定編碼。\n",
310 | " - 然而本例使用的 csv 檔,需要用 ANSI 編碼來開啟。\n",
311 | "'''\n",
312 | "df = pd.read_csv(\"./files/垃圾車點位資訊.csv\", encoding=\"big5\"); df"
313 | ]
314 | },
315 | {
316 | "cell_type": "code",
317 | "execution_count": 3,
318 | "id": "12b22911",
319 | "metadata": {},
320 | "outputs": [],
321 | "source": [
322 | "# 寫入 csv 檔案\n",
323 | "'''\n",
324 | "預設是 row number 和 column name 都包括進去,不習慣加進 csv 檔的話,可以這樣寫:\n",
325 | "df.to_csv(path_or_buf=\"./output.csv\", index=False, header=False)\n",
326 | "\n",
327 | "另外,引數 path_or_buf 不一定要寫:\n",
328 | "df.to_csv(\"./output.csv\", index=False, header=False)\n",
329 | "'''\n",
330 | "df.to_csv(\"./output.csv\", index=False, encoding=\"big5\")"
331 | ]
332 | },
333 | {
334 | "cell_type": "markdown",
335 | "id": "51ac8806",
336 | "metadata": {},
337 | "source": [
338 | "# 讀寫 json 檔\n",
339 | "- JSON(JavaScript Object Notation)\n",
340 | " - pd.read_json(): 讀取 json 檔\n",
341 | " - df.to_json(): 寫入 json 檔\n",
342 | "- 使用 [Cafe Nomad](https://cafenomad.tw/developers/docs/v1.2) 的資料來測試。\n",
343 | " - 請另存下載: [https://cafenomad.tw/api/v1.2/cafes/taipei](https://cafenomad.tw/api/v1.2/cafes/taipei)"
344 | ]
345 | },
346 | {
347 | "cell_type": "code",
348 | "execution_count": 4,
349 | "id": "e1e7bd3c",
350 | "metadata": {},
351 | "outputs": [
352 | {
353 | "data": {
354 | "text/html": [
355 | "\n",
356 | "\n",
369 | "
\n",
370 | " \n",
371 | " \n",
372 | " | \n",
373 | " id | \n",
374 | " name | \n",
375 | " city | \n",
376 | " wifi | \n",
377 | " seat | \n",
378 | " quiet | \n",
379 | " tasty | \n",
380 | " cheap | \n",
381 | " music | \n",
382 | " url | \n",
383 | " address | \n",
384 | " latitude | \n",
385 | " longitude | \n",
386 | " limited_time | \n",
387 | " socket | \n",
388 | " standing_desk | \n",
389 | " mrt | \n",
390 | " open_time | \n",
391 | "
\n",
392 | " \n",
393 | " \n",
394 | " \n",
395 | " | 0 | \n",
396 | " 000703fe-cf8a-43c8-bd83-c90cfd61915f | \n",
397 | " 蜂巢咖啡 | \n",
398 | " taipei | \n",
399 | " 0.0 | \n",
400 | " 4.5 | \n",
401 | " 3.0 | \n",
402 | " 5.0 | \n",
403 | " 4.0 | \n",
404 | " 4.0 | \n",
405 | " https://www.facebook.com/honeycombcafe2016/ | \n",
406 | " 新北市永和區永貞路214號 | \n",
407 | " 25.004097 | \n",
408 | " 121.515287 | \n",
409 | " no | \n",
410 | " no | \n",
411 | " yes | \n",
412 | " 永安市場站 | \n",
413 | " 雙週四公休,有變更另外公告 | \n",
414 | "
\n",
415 | " \n",
416 | " | 1 | \n",
417 | " 0022fc3b-598f-4bb5-bb69-1b7d1b9b5202 | \n",
418 | " (暫停營業) The Kaffa Lovers | \n",
419 | " taipei | \n",
420 | " 5.0 | \n",
421 | " 5.0 | \n",
422 | " 5.0 | \n",
423 | " 5.0 | \n",
424 | " 4.0 | \n",
425 | " 5.0 | \n",
426 | " https://www.facebook.com/thekaffalovers/?fref=ts | \n",
427 | " 台北市中正區金山北路3號 | \n",
428 | " 25.044354 | \n",
429 | " 121.530456 | \n",
430 | " no | \n",
431 | " maybe | \n",
432 | " yes | \n",
433 | " 忠孝新生 | \n",
434 | " 週二至週五 10:00-19:00 六日09:00-19:00 | \n",
435 | "
\n",
436 | " \n",
437 | " | 2 | \n",
438 | " 005a5ee9-7460-4f8a-b965-8b9565ee1e4e | \n",
439 | " 一杯咖啡士林店 | \n",
440 | " taipei | \n",
441 | " 0.0 | \n",
442 | " 0.0 | \n",
443 | " 0.0 | \n",
444 | " 0.0 | \n",
445 | " 0.0 | \n",
446 | " 0.0 | \n",
447 | " https://www.facebook.com/acupofcoffeeshilin/ | \n",
448 | " 台北市士林區中山北路五段505巷36號 | \n",
449 | " 25.093021 | \n",
450 | " 121.526678 | \n",
451 | " no | \n",
452 | " yes | \n",
453 | " yes | \n",
454 | " | \n",
455 | " | \n",
456 | "
\n",
457 | " \n",
458 | " | 3 | \n",
459 | " 00971781-cad6-4a6f-8a38-b597d8a1488b | \n",
460 | " Full of Beans 充滿豆豆咖啡館 | \n",
461 | " taipei | \n",
462 | " 0.0 | \n",
463 | " 0.0 | \n",
464 | " 0.0 | \n",
465 | " 0.0 | \n",
466 | " 0.0 | \n",
467 | " 0.0 | \n",
468 | " https://www.facebook.com/FOBcafe.gallery/ | \n",
469 | " 台北市中山區龍江路21巷9-6號 | \n",
470 | " 25.047838 | \n",
471 | " 121.541138 | \n",
472 | " | \n",
473 | " | \n",
474 | " | \n",
475 | " | \n",
476 | " | \n",
477 | "
\n",
478 | " \n",
479 | " | 4 | \n",
480 | " 00b6ce2b-d92e-44e5-b1cb-daaa925a5135 | \n",
481 | " 良食究好市集餐廳WONMI | \n",
482 | " taipei | \n",
483 | " 5.0 | \n",
484 | " 3.0 | \n",
485 | " 3.0 | \n",
486 | " 5.0 | \n",
487 | " 0.0 | \n",
488 | " 5.0 | \n",
489 | " http://www.wonmi.com.tw/home.php | \n",
490 | " 台北市八德路四段138號 (京華城 Living Mall 10 F) | \n",
491 | " 25.048354 | \n",
492 | " 121.562300 | \n",
493 | " | \n",
494 | " | \n",
495 | " | \n",
496 | " | \n",
497 | " | \n",
498 | "
\n",
499 | " \n",
500 | " | ... | \n",
501 | " ... | \n",
502 | " ... | \n",
503 | " ... | \n",
504 | " ... | \n",
505 | " ... | \n",
506 | " ... | \n",
507 | " ... | \n",
508 | " ... | \n",
509 | " ... | \n",
510 | " ... | \n",
511 | " ... | \n",
512 | " ... | \n",
513 | " ... | \n",
514 | " ... | \n",
515 | " ... | \n",
516 | " ... | \n",
517 | " ... | \n",
518 | " ... | \n",
519 | "
\n",
520 | " \n",
521 | " | 1652 | \n",
522 | " ff53abc4-7a89-43db-8d0b-43e5b00dff5f | \n",
523 | " 喜穗咖啡蘭花生活館(永久停業) | \n",
524 | " taipei | \n",
525 | " 0.0 | \n",
526 | " 0.0 | \n",
527 | " 0.0 | \n",
528 | " 0.0 | \n",
529 | " 0.0 | \n",
530 | " 0.0 | \n",
531 | " | \n",
532 | " 242新北市新莊區中原東路206號 | \n",
533 | " 25.054470 | \n",
534 | " 121.460515 | \n",
535 | " | \n",
536 | " maybe | \n",
537 | " no | \n",
538 | " | \n",
539 | " | \n",
540 | "
\n",
541 | " \n",
542 | " | 1653 | \n",
543 | " ff582eb9-3f83-4f65-98b2-c38a4ef511db | \n",
544 | " 自然產 | \n",
545 | " taipei | \n",
546 | " 3.0 | \n",
547 | " 5.0 | \n",
548 | " 4.0 | \n",
549 | " 4.0 | \n",
550 | " 3.0 | \n",
551 | " 3.0 | \n",
552 | " https://www.facebook.com/greenday209/ | \n",
553 | " 新北市板橋區重慶路209號 | \n",
554 | " 25.001575 | \n",
555 | " 121.462947 | \n",
556 | " maybe | \n",
557 | " yes | \n",
558 | " no | \n",
559 | " | \n",
560 | " | \n",
561 | "
\n",
562 | " \n",
563 | " | 1654 | \n",
564 | " ff973c43-9474-46dc-bb24-0d1947143ba1 | \n",
565 | " 金獅取水 | \n",
566 | " taipei | \n",
567 | " 0.0 | \n",
568 | " 0.0 | \n",
569 | " 0.0 | \n",
570 | " 0.0 | \n",
571 | " 0.0 | \n",
572 | " 0.0 | \n",
573 | " https://www.facebook.com/goldenlionkafe | \n",
574 | " 台北市中山區民生東路2段151號 | \n",
575 | " 25.058156 | \n",
576 | " 121.535403 | \n",
577 | " maybe | \n",
578 | " yes | \n",
579 | " yes | \n",
580 | " | \n",
581 | " | \n",
582 | "
\n",
583 | " \n",
584 | " | 1655 | \n",
585 | " ffd780fe-9d33-4a4b-90dd-74d7d9de31f7 | \n",
586 | " The Tuckaway Taipei | \n",
587 | " taipei | \n",
588 | " 5.0 | \n",
589 | " 5.0 | \n",
590 | " 5.0 | \n",
591 | " 5.0 | \n",
592 | " 5.0 | \n",
593 | " 4.0 | \n",
594 | " IG FB tuckawaytaipei | \n",
595 | " 台北市文山區木柵路三段48巷1弄6號1樓 | \n",
596 | " 24.987979 | \n",
597 | " 121.565233 | \n",
598 | " no | \n",
599 | " maybe | \n",
600 | " no | \n",
601 | " | \n",
602 | " | \n",
603 | "
\n",
604 | " \n",
605 | " | 1656 | \n",
606 | " fff8267f-3235-4eb5-95c1-36015a59b229 | \n",
607 | " 豆工場精品咖啡館 | \n",
608 | " taipei | \n",
609 | " 4.0 | \n",
610 | " 4.0 | \n",
611 | " 4.0 | \n",
612 | " 4.0 | \n",
613 | " 4.0 | \n",
614 | " 4.0 | \n",
615 | " | \n",
616 | " 新北市中和區中和路400巷31號 | \n",
617 | " 25.002081 | \n",
618 | " 121.512065 | \n",
619 | " maybe | \n",
620 | " yes | \n",
621 | " yes | \n",
622 | " 永安市場 | \n",
623 | " | \n",
624 | "
\n",
625 | " \n",
626 | "
\n",
627 | "
1657 rows × 18 columns
\n",
628 | "
"
629 | ],
630 | "text/plain": [
631 | " id name city \n",
632 | "0 000703fe-cf8a-43c8-bd83-c90cfd61915f 蜂巢咖啡 taipei \\\n",
633 | "1 0022fc3b-598f-4bb5-bb69-1b7d1b9b5202 (暫停營業) The Kaffa Lovers taipei \n",
634 | "2 005a5ee9-7460-4f8a-b965-8b9565ee1e4e 一杯咖啡士林店 taipei \n",
635 | "3 00971781-cad6-4a6f-8a38-b597d8a1488b Full of Beans 充滿豆豆咖啡館 taipei \n",
636 | "4 00b6ce2b-d92e-44e5-b1cb-daaa925a5135 良食究好市集餐廳WONMI taipei \n",
637 | "... ... ... ... \n",
638 | "1652 ff53abc4-7a89-43db-8d0b-43e5b00dff5f 喜穗咖啡蘭花生活館(永久停業) taipei \n",
639 | "1653 ff582eb9-3f83-4f65-98b2-c38a4ef511db 自然產 taipei \n",
640 | "1654 ff973c43-9474-46dc-bb24-0d1947143ba1 金獅取水 taipei \n",
641 | "1655 ffd780fe-9d33-4a4b-90dd-74d7d9de31f7 The Tuckaway Taipei taipei \n",
642 | "1656 fff8267f-3235-4eb5-95c1-36015a59b229 豆工場精品咖啡館 taipei \n",
643 | "\n",
644 | " wifi seat quiet tasty cheap music \n",
645 | "0 0.0 4.5 3.0 5.0 4.0 4.0 \\\n",
646 | "1 5.0 5.0 5.0 5.0 4.0 5.0 \n",
647 | "2 0.0 0.0 0.0 0.0 0.0 0.0 \n",
648 | "3 0.0 0.0 0.0 0.0 0.0 0.0 \n",
649 | "4 5.0 3.0 3.0 5.0 0.0 5.0 \n",
650 | "... ... ... ... ... ... ... \n",
651 | "1652 0.0 0.0 0.0 0.0 0.0 0.0 \n",
652 | "1653 3.0 5.0 4.0 4.0 3.0 3.0 \n",
653 | "1654 0.0 0.0 0.0 0.0 0.0 0.0 \n",
654 | "1655 5.0 5.0 5.0 5.0 5.0 4.0 \n",
655 | "1656 4.0 4.0 4.0 4.0 4.0 4.0 \n",
656 | "\n",
657 | " url \n",
658 | "0 https://www.facebook.com/honeycombcafe2016/ \\\n",
659 | "1 https://www.facebook.com/thekaffalovers/?fref=ts \n",
660 | "2 https://www.facebook.com/acupofcoffeeshilin/ \n",
661 | "3 https://www.facebook.com/FOBcafe.gallery/ \n",
662 | "4 http://www.wonmi.com.tw/home.php \n",
663 | "... ... \n",
664 | "1652 \n",
665 | "1653 https://www.facebook.com/greenday209/ \n",
666 | "1654 https://www.facebook.com/goldenlionkafe \n",
667 | "1655 IG FB tuckawaytaipei \n",
668 | "1656 \n",
669 | "\n",
670 | " address latitude longitude \n",
671 | "0 新北市永和區永貞路214號 25.004097 121.515287 \\\n",
672 | "1 台北市中正區金山北路3號 25.044354 121.530456 \n",
673 | "2 台北市士林區中山北路五段505巷36號 25.093021 121.526678 \n",
674 | "3 台北市中山區龍江路21巷9-6號 25.047838 121.541138 \n",
675 | "4 台北市八德路四段138號 (京華城 Living Mall 10 F) 25.048354 121.562300 \n",
676 | "... ... ... ... \n",
677 | "1652 242新北市新莊區中原東路206號 25.054470 121.460515 \n",
678 | "1653 新北市板橋區重慶路209號 25.001575 121.462947 \n",
679 | "1654 台北市中山區民生東路2段151號 25.058156 121.535403 \n",
680 | "1655 台北市文山區木柵路三段48巷1弄6號1樓 24.987979 121.565233 \n",
681 | "1656 新北市中和區中和路400巷31號 25.002081 121.512065 \n",
682 | "\n",
683 | " limited_time socket standing_desk mrt \n",
684 | "0 no no yes 永安市場站 \\\n",
685 | "1 no maybe yes 忠孝新生 \n",
686 | "2 no yes yes \n",
687 | "3 \n",
688 | "4 \n",
689 | "... ... ... ... ... \n",
690 | "1652 maybe no \n",
691 | "1653 maybe yes no \n",
692 | "1654 maybe yes yes \n",
693 | "1655 no maybe no \n",
694 | "1656 maybe yes yes 永安市場 \n",
695 | "\n",
696 | " open_time \n",
697 | "0 雙週四公休,有變更另外公告 \n",
698 | "1 週二至週五 10:00-19:00 六日09:00-19:00 \n",
699 | "2 \n",
700 | "3 \n",
701 | "4 \n",
702 | "... ... \n",
703 | "1652 \n",
704 | "1653 \n",
705 | "1654 \n",
706 | "1655 \n",
707 | "1656 \n",
708 | "\n",
709 | "[1657 rows x 18 columns]"
710 | ]
711 | },
712 | "execution_count": 4,
713 | "metadata": {},
714 | "output_type": "execute_result"
715 | }
716 | ],
717 | "source": [
718 | "# 讀取 json 格式檔案\n",
719 | "'''\n",
720 | "參考連結:\n",
721 | "[1] pandas.read_json\n",
722 | "https://pandas.pydata.org/docs/reference/api/pandas.read_json.html\n",
723 | "[2] pandas.json_normalize\n",
724 | "https://pandas.pydata.org/docs/reference/api/pandas.json_normalize.html\n",
725 | "'''\n",
726 | "df = pd.read_json('./files/taipei.json'); df"
727 | ]
728 | },
729 | {
730 | "cell_type": "code",
731 | "execution_count": 5,
732 | "id": "39dc90ce",
733 | "metadata": {},
734 | "outputs": [],
735 | "source": [
736 | "# 寫入 json 檔案\n",
737 | "'''\n",
738 | "參考連結:\n",
739 | "[1] pandas.DataFrame.to_json\n",
740 | "https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_json.html\n",
741 | "'''\n",
742 | "df.to_json(\n",
743 | " './output.json', \n",
744 | " indent=None, \n",
745 | " orient='records', \n",
746 | " lines=False, \n",
747 | " force_ascii=False\n",
748 | ")"
749 | ]
750 | },
751 | {
752 | "cell_type": "markdown",
753 | "id": "7b1cbd38",
754 | "metadata": {},
755 | "source": [
756 | "# 讀寫 xml\n",
757 | "- eXtensible Markup Language\n",
758 | " - pd.read_xml(): 讀取 xml 檔\n",
759 | " - df.to_xml(): 寫入 xml 檔\n",
760 | "- 使用 [臺北市政府求職徵才職缺資訊](https://data.taipei/dataset/detail?id=f2f3f0d3-9e84-4fc5-af4d-5814563e17b3) 的資料來測試\n",
761 | " - 請另存下載: [https://dop.blob.core.windows.net/ipsnworkcontainer/jobs.xml](https://dop.blob.core.windows.net/ipsnworkcontainer/jobs.xml)"
762 | ]
763 | },
764 | {
765 | "cell_type": "code",
766 | "execution_count": 6,
767 | "id": "6c8e2f2c",
768 | "metadata": {
769 | "scrolled": false
770 | },
771 | "outputs": [
772 | {
773 | "data": {
774 | "text/html": [
775 | "\n",
776 | "\n",
789 | "
\n",
790 | " \n",
791 | " \n",
792 | " | \n",
793 | " No | \n",
794 | " dept_code | \n",
795 | " dept_name | \n",
796 | " Job_no | \n",
797 | " Modify_date | \n",
798 | " tel | \n",
799 | " level | \n",
800 | " job_Kind_Name | \n",
801 | " title | \n",
802 | " pop_Kind_Name | \n",
803 | " ... | \n",
804 | " apply_rule | \n",
805 | " job_desc | \n",
806 | " job_location_Name | \n",
807 | " job_address | \n",
808 | " official_rule | \n",
809 | " is_duty | \n",
810 | " Special_rule | \n",
811 | " contact | \n",
812 | " File_Path | \n",
813 | " Note | \n",
814 | "
\n",
815 | " \n",
816 | " \n",
817 | " \n",
818 | " | 0 | \n",
819 | " 1 | \n",
820 | " 379590000E | \n",
821 | " 臺北市政府文化局 | \n",
822 | " 62120 | \n",
823 | " 112/04/06 | \n",
824 | " NaN | \n",
825 | " 280薪點,月支報酬新臺幣36,316元 | \n",
826 | " 無 | \n",
827 | " 約僱科員 | \n",
828 | " 約僱人員 | \n",
829 | " ... | \n",
830 | " 一、中華民國國民並無雙重國籍者。<br>二、大專以上畢業者。<br>三、具土木、建築、營建工... | \n",
831 | " 一、古蹟、歷史建築等文化資產修復及文化設施之委託技術服務招標、工程招標、施工監督及驗收等相關... | \n",
832 | " NaN | \n",
833 | " 臺北市政府文化局(11008 臺北市信義區市府路一號四樓) | \n",
834 | " 否 | \n",
835 | " 無需輪值 | \n",
836 | " 歡迎身心障礙、歡迎原住民族 | \n",
837 | " 報名應繳文件:\\n一、個人履歷表。\\n二、最高學歷畢業證書等資料影本(國內外學歷須經教育部認... | \n",
838 | " NaN | \n",
839 | " NaN | \n",
840 | "
\n",
841 | " \n",
842 | " | 1 | \n",
843 | " 2 | \n",
844 | " 379670000G | \n",
845 | " 臺北市政府產業發展局 | \n",
846 | " 62119 | \n",
847 | " 112/04/06 | \n",
848 | " NaN | \n",
849 | " 280薪點 | \n",
850 | " 無 | \n",
851 | " 約僱辦事員 | \n",
852 | " 約僱人員 | \n",
853 | " ... | \n",
854 | " 1、國內外之公、私立大專以上學校畢業。<br>2、具中華民國國籍,無公務人員任用法第26、2... | \n",
855 | " 1.辦理工廠設立登記、動產擔保交易登記。<br>2.工廠管理輔導法相關法規與專案性質業務與查... | \n",
856 | " NaN | \n",
857 | " 臺北市信義區市府路1號北區10樓 | \n",
858 | " 否 | \n",
859 | " 無需輪值 | \n",
860 | " 歡迎身心障礙、歡迎原住民族 | \n",
861 | " 1、本職缺⽉薪280薪點,折合為新臺幣36,316元,尚需扣除勞、健保及勞退個⼈⾃付等費⽤。... | \n",
862 | " NaN | \n",
863 | " NaN | \n",
864 | "
\n",
865 | " \n",
866 | " | 2 | \n",
867 | " 3 | \n",
868 | " 379040300E | \n",
869 | " 臺北市立圖書館 | \n",
870 | " 62118 | \n",
871 | " 112/04/06 | \n",
872 | " NaN | \n",
873 | " 280薪點 | \n",
874 | " 無 | \n",
875 | " 政風室約僱課員 | \n",
876 | " 約僱人員 | \n",
877 | " ... | \n",
878 | " (一)國內外專科以上學校畢業者。<br> (二)高級中等學校畢業,並具有與擬任工作性質相當... | \n",
879 | " (一)廉政宣導。<br>(二)安全維護業務。<br>(三)錄影監視系統管理。<br>(四)採... | \n",
880 | " NaN | \n",
881 | " 臺北市立圖書館政風室(106210 臺北市大安區建國南路二段125號7樓) | \n",
882 | " 否 | \n",
883 | " 無需輪值 | \n",
884 | " 歡迎身心障礙、歡迎原住民族 | \n",
885 | " (一)意者請檢具履歷、自傳及相關學歷畢業證書影本,如具政風、工程或建築管理及與本職務相關之實... | \n",
886 | " NaN | \n",
887 | " NaN | \n",
888 | "
\n",
889 | " \n",
890 | " | 3 | \n",
891 | " 4 | \n",
892 | " 379490000A | \n",
893 | " 臺北市文山區公所 | \n",
894 | " 62117 | \n",
895 | " 112/04/06 | \n",
896 | " NaN | \n",
897 | " 約僱5等280薪點(約新台幣36,316元) | \n",
898 | " 無 | \n",
899 | " 約僱人員 | \n",
900 | " 約僱人員 | \n",
901 | " ... | \n",
902 | " 1.國內外大專以上學校畢業,或高級中等學校畢業,並具有與擬任工作性質相當之訓練6個月以上或2... | \n",
903 | " 1.總收文及相關公文處理等業務。<br>2.協助檔案管理相關作業。<br>3.每日郵局寄信及... | \n",
904 | " NaN | \n",
905 | " 116008臺北市文山區木柵路3段220號8、9樓 | \n",
906 | " 否 | \n",
907 | " 無需輪值 | \n",
908 | " NaN | \n",
909 | " (一)網路報名者:請於公告日期截止前至行政院人事行政總處「事求人」網頁-本職缺公告點選「我要... | \n",
910 | " NaN | \n",
911 | " NaN | \n",
912 | "
\n",
913 | " \n",
914 | " | 4 | \n",
915 | " 5 | \n",
916 | " 379064100X | \n",
917 | " 臺北市立北政國民中學 | \n",
918 | " 62116 | \n",
919 | " 112/04/06 | \n",
920 | " NaN | \n",
921 | " 委任第5職等至薦任第7職等 | \n",
922 | " 綜合行政 | \n",
923 | " 事務組長 | \n",
924 | " 一般人員 | \n",
925 | " ... | \n",
926 | " 一、經銓敘合格實授委任第五職等(含)以上,並具綜合行政職系任用資格之<br>公務人員,且無特... | \n",
927 | " 一、大額工程發包、大額財物招標、大額勞物招標。<br>二、各招標合約製作及採購案之擴充續約等... | \n",
928 | " NaN | \n",
929 | " 臺北市立北政國民中學總務處(臺北市文山區指南路三段 2 巷 14 號)。 | \n",
930 | " 是 | \n",
931 | " 無需輪值 | \n",
932 | " NaN | \n",
933 | " (02)29393651轉12,聯絡人:劉主任。 | \n",
934 | " NaN | \n",
935 | " NaN | \n",
936 | "
\n",
937 | " \n",
938 | " | ... | \n",
939 | " ... | \n",
940 | " ... | \n",
941 | " ... | \n",
942 | " ... | \n",
943 | " ... | \n",
944 | " ... | \n",
945 | " ... | \n",
946 | " ... | \n",
947 | " ... | \n",
948 | " ... | \n",
949 | " ... | \n",
950 | " ... | \n",
951 | " ... | \n",
952 | " ... | \n",
953 | " ... | \n",
954 | " ... | \n",
955 | " ... | \n",
956 | " ... | \n",
957 | " ... | \n",
958 | " ... | \n",
959 | " ... | \n",
960 | "
\n",
961 | " \n",
962 | " | 144 | \n",
963 | " 145 | \n",
964 | " 379700300A | \n",
965 | " 臺北市建成地政事務所 | \n",
966 | " 61824 | \n",
967 | " 112/04/06 | \n",
968 | " NaN | \n",
969 | " 委任第5職等或薦任第6職等至第7職等 | \n",
970 | " 地政 | \n",
971 | " 課員 | \n",
972 | " 一般人員 | \n",
973 | " ... | \n",
974 | " 1.教育部認可之國內外大專以上學歷,且具地政職系任用資格者。<br>2.熟稔地政業務,具審查... | \n",
975 | " 1.辦理土地登記案件審查。<br>2.承辦相關公文業務。<br>3.土地登記法令諮詢服務。<... | \n",
976 | " NaN | \n",
977 | " 臺北市建成地政事務所(臺北市萬華區和平西路3段120號7~9樓) | \n",
978 | " 是 | \n",
979 | " 無需輪值 | \n",
980 | " 歡迎身心障礙、歡迎原住民族 | \n",
981 | " (一)\\t本職缺採線上作業方式,意者請於112年4月6日前進入行政院人事行政總處「事求人」徵... | \n",
982 | " NaN | \n",
983 | " NaN | \n",
984 | "
\n",
985 | " \n",
986 | " | 145 | \n",
987 | " 146 | \n",
988 | " 379145700I | \n",
989 | " 臺北市中山區健康服務中心 | \n",
990 | " 61806 | \n",
991 | " 112/04/06 | \n",
992 | " NaN | \n",
993 | " 無 | \n",
994 | " 無 | \n",
995 | " 技工 | \n",
996 | " 技工 | \n",
997 | " ... | \n",
998 | " 1.需為臺北市政府所屬各機關現職技工、工友或駕駛,並符合下列資格條件:<br>(1)國民小學... | \n",
999 | " 1.公文交換。<br>2.辦公機具簡易維護。<br>3.環境清潔及維護。<br>4.協助庶務... | \n",
1000 | " NaN | \n",
1001 | " 臺北市中山區健康服務中心(臺北市中山區松江路367號7樓) | \n",
1002 | " 否 | \n",
1003 | " 無需輪值 | \n",
1004 | " 歡迎身心障礙、歡迎原住民族 | \n",
1005 | " 1.請將「調僱意願表」親自簽章後,併同履歷表(亦可採用公務人員簡式履歷表)、畢業證書影本、身... | \n",
1006 | " NaN | \n",
1007 | " NaN | \n",
1008 | "
\n",
1009 | " \n",
1010 | " | 146 | \n",
1011 | " 147 | \n",
1012 | " 379023300A | \n",
1013 | " 臺北市中山區戶政事務所 | \n",
1014 | " 61770 | \n",
1015 | " 112/04/06 | \n",
1016 | " NaN | \n",
1017 | " 無 | \n",
1018 | " 無 | \n",
1019 | " 工友 | \n",
1020 | " 工友 | \n",
1021 | " ... | \n",
1022 | " 需為臺北市政府所屬各機關學校現職職工,並符合下列資格條件:<br>1.國小以上畢業或具有同等... | \n",
1023 | " 1.行政庶務(市府公文交換及繳款外勤工作等)。<br>2.勞務工作(辦公廳舍打掃清潔等)。<... | \n",
1024 | " NaN | \n",
1025 | " 臺北市中山區戶政事務所(臺北市中山區松江路367號2樓) | \n",
1026 | " 否 | \n",
1027 | " 無需輪值 | \n",
1028 | " 歡迎身心障礙、歡迎原住民族 | \n",
1029 | " 一、符合資格條件且有意願者,請填妥事務工友甄選履歷表及職工調僱意願表後由當事人簽章,並檢附(... | \n",
1030 | " NaN | \n",
1031 | " NaN | \n",
1032 | "
\n",
1033 | " \n",
1034 | " | 147 | \n",
1035 | " 148 | \n",
1036 | " 379091000Y | \n",
1037 | " 臺北市中山區濱江國民小學 | \n",
1038 | " 61758 | \n",
1039 | " 112/04/06 | \n",
1040 | " NaN | \n",
1041 | " 無 | \n",
1042 | " 無 | \n",
1043 | " 代理教師 | \n",
1044 | " 代理教師 | \n",
1045 | " ... | \n",
1046 | " 凡中華民國國民,且身心健康、品德優良,無現行教師法第14條、109年6月30日施行之教師法第... | \n",
1047 | " 幼兒園教學工作(詳見簡章) | \n",
1048 | " NaN | \n",
1049 | " 臺北市中山區濱江國民小學(臺北市中山區樂群二路266巷99號) | \n",
1050 | " 否 | \n",
1051 | " 無需輪值 | \n",
1052 | " 歡迎身心障礙、歡迎原住民族 | \n",
1053 | " 一、甄選類別與員額:\\n代理教師職缺(幼兒園差假代理教師,詳見簡章11-20招)\\n二、報考... | \n",
1054 | " NaN | \n",
1055 | " NaN | \n",
1056 | "
\n",
1057 | " \n",
1058 | " | 148 | \n",
1059 | " 149 | \n",
1060 | " 379110300G | \n",
1061 | " 臺北市政府工務局公園路燈工程管理處 | \n",
1062 | " 61726 | \n",
1063 | " 112/04/06 | \n",
1064 | " NaN | \n",
1065 | " 聘用7等-支328薪點(約新台幣42,541元/每月) | \n",
1066 | " 無 | \n",
1067 | " 職務代理約僱人員(A620087) | \n",
1068 | " 聘用人員 | \n",
1069 | " ... | \n",
1070 | " 1.具中華民國國籍,且未具雙重國籍者。<br>2.無公務人員任用法第26條、28條所列各款情... | \n",
1071 | " 1.綜理大安區所轄公園維護相關業務。<br>2.綜理大安區公文彙辦、會勘、陳情業務。<br>... | \n",
1072 | " NaN | \n",
1073 | " 臺北市政府工務局公園路燈工程管理處\\n青年公園管理所 | \n",
1074 | " 否 | \n",
1075 | " 無需輪值 | \n",
1076 | " 歡迎身心障礙、歡迎原住民族 | \n",
1077 | " 1.配合行政院人事行政總處(下稱人事總處)推動線上徵才作業,本職缺應徵作業一律採線上方式辦理... | \n",
1078 | " NaN | \n",
1079 | " NaN | \n",
1080 | "
\n",
1081 | " \n",
1082 | "
\n",
1083 | "
149 rows × 24 columns
\n",
1084 | "
"
1085 | ],
1086 | "text/plain": [
1087 | " No dept_code dept_name Job_no Modify_date tel \n",
1088 | "0 1 379590000E 臺北市政府文化局 62120 112/04/06 NaN \\\n",
1089 | "1 2 379670000G 臺北市政府產業發展局 62119 112/04/06 NaN \n",
1090 | "2 3 379040300E 臺北市立圖書館 62118 112/04/06 NaN \n",
1091 | "3 4 379490000A 臺北市文山區公所 62117 112/04/06 NaN \n",
1092 | "4 5 379064100X 臺北市立北政國民中學 62116 112/04/06 NaN \n",
1093 | ".. ... ... ... ... ... ... \n",
1094 | "144 145 379700300A 臺北市建成地政事務所 61824 112/04/06 NaN \n",
1095 | "145 146 379145700I 臺北市中山區健康服務中心 61806 112/04/06 NaN \n",
1096 | "146 147 379023300A 臺北市中山區戶政事務所 61770 112/04/06 NaN \n",
1097 | "147 148 379091000Y 臺北市中山區濱江國民小學 61758 112/04/06 NaN \n",
1098 | "148 149 379110300G 臺北市政府工務局公園路燈工程管理處 61726 112/04/06 NaN \n",
1099 | "\n",
1100 | " level job_Kind_Name title \n",
1101 | "0 280薪點,月支報酬新臺幣36,316元 無 約僱科員 \\\n",
1102 | "1 280薪點 無 約僱辦事員 \n",
1103 | "2 280薪點 無 政風室約僱課員 \n",
1104 | "3 約僱5等280薪點(約新台幣36,316元) 無 約僱人員 \n",
1105 | "4 委任第5職等至薦任第7職等 綜合行政 事務組長 \n",
1106 | ".. ... ... ... \n",
1107 | "144 委任第5職等或薦任第6職等至第7職等 地政 課員 \n",
1108 | "145 無 無 技工 \n",
1109 | "146 無 無 工友 \n",
1110 | "147 無 無 代理教師 \n",
1111 | "148 聘用7等-支328薪點(約新台幣42,541元/每月) 無 職務代理約僱人員(A620087) \n",
1112 | "\n",
1113 | " pop_Kind_Name ... apply_rule \n",
1114 | "0 約僱人員 ... 一、中華民國國民並無雙重國籍者。
二、大專以上畢業者。
三、具土木、建築、營建工... \\\n",
1115 | "1 約僱人員 ... 1、國內外之公、私立大專以上學校畢業。
2、具中華民國國籍,無公務人員任用法第26、2... \n",
1116 | "2 約僱人員 ... (一)國內外專科以上學校畢業者。
(二)高級中等學校畢業,並具有與擬任工作性質相當... \n",
1117 | "3 約僱人員 ... 1.國內外大專以上學校畢業,或高級中等學校畢業,並具有與擬任工作性質相當之訓練6個月以上或2... \n",
1118 | "4 一般人員 ... 一、經銓敘合格實授委任第五職等(含)以上,並具綜合行政職系任用資格之
公務人員,且無特... \n",
1119 | ".. ... ... ... \n",
1120 | "144 一般人員 ... 1.教育部認可之國內外大專以上學歷,且具地政職系任用資格者。
2.熟稔地政業務,具審查... \n",
1121 | "145 技工 ... 1.需為臺北市政府所屬各機關現職技工、工友或駕駛,並符合下列資格條件:
(1)國民小學... \n",
1122 | "146 工友 ... 需為臺北市政府所屬各機關學校現職職工,並符合下列資格條件:
1.國小以上畢業或具有同等... \n",
1123 | "147 代理教師 ... 凡中華民國國民,且身心健康、品德優良,無現行教師法第14條、109年6月30日施行之教師法第... \n",
1124 | "148 聘用人員 ... 1.具中華民國國籍,且未具雙重國籍者。
2.無公務人員任用法第26條、28條所列各款情... \n",
1125 | "\n",
1126 | " job_desc job_location_Name \n",
1127 | "0 一、古蹟、歷史建築等文化資產修復及文化設施之委託技術服務招標、工程招標、施工監督及驗收等相關... NaN \\\n",
1128 | "1 1.辦理工廠設立登記、動產擔保交易登記。
2.工廠管理輔導法相關法規與專案性質業務與查... NaN \n",
1129 | "2 (一)廉政宣導。
(二)安全維護業務。
(三)錄影監視系統管理。
(四)採... NaN \n",
1130 | "3 1.總收文及相關公文處理等業務。
2.協助檔案管理相關作業。
3.每日郵局寄信及... NaN \n",
1131 | "4 一、大額工程發包、大額財物招標、大額勞物招標。
二、各招標合約製作及採購案之擴充續約等... NaN \n",
1132 | ".. ... ... \n",
1133 | "144 1.辦理土地登記案件審查。
2.承辦相關公文業務。
3.土地登記法令諮詢服務。<... NaN \n",
1134 | "145 1.公文交換。
2.辦公機具簡易維護。
3.環境清潔及維護。
4.協助庶務... NaN \n",
1135 | "146 1.行政庶務(市府公文交換及繳款外勤工作等)。
2.勞務工作(辦公廳舍打掃清潔等)。<... NaN \n",
1136 | "147 幼兒園教學工作(詳見簡章) NaN \n",
1137 | "148 1.綜理大安區所轄公園維護相關業務。
2.綜理大安區公文彙辦、會勘、陳情業務。
... NaN \n",
1138 | "\n",
1139 | " job_address official_rule is_duty \n",
1140 | "0 臺北市政府文化局(11008 臺北市信義區市府路一號四樓) 否 無需輪值 \\\n",
1141 | "1 臺北市信義區市府路1號北區10樓 否 無需輪值 \n",
1142 | "2 臺北市立圖書館政風室(106210 臺北市大安區建國南路二段125號7樓) 否 無需輪值 \n",
1143 | "3 116008臺北市文山區木柵路3段220號8、9樓 否 無需輪值 \n",
1144 | "4 臺北市立北政國民中學總務處(臺北市文山區指南路三段 2 巷 14 號)。 是 無需輪值 \n",
1145 | ".. ... ... ... \n",
1146 | "144 臺北市建成地政事務所(臺北市萬華區和平西路3段120號7~9樓) 是 無需輪值 \n",
1147 | "145 臺北市中山區健康服務中心(臺北市中山區松江路367號7樓) 否 無需輪值 \n",
1148 | "146 臺北市中山區戶政事務所(臺北市中山區松江路367號2樓) 否 無需輪值 \n",
1149 | "147 臺北市中山區濱江國民小學(臺北市中山區樂群二路266巷99號) 否 無需輪值 \n",
1150 | "148 臺北市政府工務局公園路燈工程管理處\\n青年公園管理所 否 無需輪值 \n",
1151 | "\n",
1152 | " Special_rule contact \n",
1153 | "0 歡迎身心障礙、歡迎原住民族 報名應繳文件:\\n一、個人履歷表。\\n二、最高學歷畢業證書等資料影本(國內外學歷須經教育部認... \\\n",
1154 | "1 歡迎身心障礙、歡迎原住民族 1、本職缺⽉薪280薪點,折合為新臺幣36,316元,尚需扣除勞、健保及勞退個⼈⾃付等費⽤。... \n",
1155 | "2 歡迎身心障礙、歡迎原住民族 (一)意者請檢具履歷、自傳及相關學歷畢業證書影本,如具政風、工程或建築管理及與本職務相關之實... \n",
1156 | "3 NaN (一)網路報名者:請於公告日期截止前至行政院人事行政總處「事求人」網頁-本職缺公告點選「我要... \n",
1157 | "4 NaN (02)29393651轉12,聯絡人:劉主任。 \n",
1158 | ".. ... ... \n",
1159 | "144 歡迎身心障礙、歡迎原住民族 (一)\\t本職缺採線上作業方式,意者請於112年4月6日前進入行政院人事行政總處「事求人」徵... \n",
1160 | "145 歡迎身心障礙、歡迎原住民族 1.請將「調僱意願表」親自簽章後,併同履歷表(亦可採用公務人員簡式履歷表)、畢業證書影本、身... \n",
1161 | "146 歡迎身心障礙、歡迎原住民族 一、符合資格條件且有意願者,請填妥事務工友甄選履歷表及職工調僱意願表後由當事人簽章,並檢附(... \n",
1162 | "147 歡迎身心障礙、歡迎原住民族 一、甄選類別與員額:\\n代理教師職缺(幼兒園差假代理教師,詳見簡章11-20招)\\n二、報考... \n",
1163 | "148 歡迎身心障礙、歡迎原住民族 1.配合行政院人事行政總處(下稱人事總處)推動線上徵才作業,本職缺應徵作業一律採線上方式辦理... \n",
1164 | "\n",
1165 | " File_Path Note \n",
1166 | "0 NaN NaN \n",
1167 | "1 NaN NaN \n",
1168 | "2 NaN NaN \n",
1169 | "3 NaN NaN \n",
1170 | "4 NaN NaN \n",
1171 | ".. ... ... \n",
1172 | "144 NaN NaN \n",
1173 | "145 NaN NaN \n",
1174 | "146 NaN NaN \n",
1175 | "147 NaN NaN \n",
1176 | "148 NaN NaN \n",
1177 | "\n",
1178 | "[149 rows x 24 columns]"
1179 | ]
1180 | },
1181 | "execution_count": 6,
1182 | "metadata": {},
1183 | "output_type": "execute_result"
1184 | }
1185 | ],
1186 | "source": [
1187 | "# 讀取 xml 格式檔案\n",
1188 | "'''\n",
1189 | "參考連結:\n",
1190 | "[1] pandas.read_xml\n",
1191 | "https://pandas.pydata.org/docs/reference/api/pandas.read_xml.html\n",
1192 | "'''\n",
1193 | "df = pd.read_xml(\"./files/jobs.xml\"); df"
1194 | ]
1195 | },
1196 | {
1197 | "cell_type": "code",
1198 | "execution_count": 7,
1199 | "id": "9f0b5649",
1200 | "metadata": {},
1201 | "outputs": [],
1202 | "source": [
1203 | "# 寫入 xml 檔案\n",
1204 | "'''\n",
1205 | "參考連結:\n",
1206 | "[1] pandas.DataFrame.to_xml\n",
1207 | "https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_xml.html\n",
1208 | "'''\n",
1209 | "df.to_xml(\"./output.xml\")"
1210 | ]
1211 | },
1212 | {
1213 | "cell_type": "markdown",
1214 | "id": "5fe3cbe7",
1215 | "metadata": {},
1216 | "source": [
1217 | "# 讀寫 excel\n",
1218 | "- 語法: \n",
1219 | " - pd.read_excel(): 讀取 excel 檔\n",
1220 | " - df.to_excel(): 寫入 excel 檔\n",
1221 | "- 記得先安裝套件: `pip install openpyxl`"
1222 | ]
1223 | },
1224 | {
1225 | "cell_type": "code",
1226 | "execution_count": 8,
1227 | "id": "f16823c7",
1228 | "metadata": {},
1229 | "outputs": [
1230 | {
1231 | "data": {
1232 | "text/html": [
1233 | "\n",
1234 | "\n",
1247 | "
\n",
1248 | " \n",
1249 | " \n",
1250 | " | \n",
1251 | " 中文姓名 | \n",
1252 | " 電話 | \n",
1253 | " 英文名稱 | \n",
1254 | "
\n",
1255 | " \n",
1256 | " \n",
1257 | " \n",
1258 | " | 0 | \n",
1259 | " 楊○○ | \n",
1260 | " 978000000 | \n",
1261 | " Darren | \n",
1262 | "
\n",
1263 | " \n",
1264 | " | 1 | \n",
1265 | " 林○○ | \n",
1266 | " 910000000 | \n",
1267 | " Lin | \n",
1268 | "
\n",
1269 | " \n",
1270 | " | 2 | \n",
1271 | " 江○○ | \n",
1272 | " 939000000 | \n",
1273 | " Jiang | \n",
1274 | "
\n",
1275 | " \n",
1276 | "
\n",
1277 | "
"
1278 | ],
1279 | "text/plain": [
1280 | " 中文姓名 電話 英文名稱\n",
1281 | "0 楊○○ 978000000 Darren\n",
1282 | "1 林○○ 910000000 Lin\n",
1283 | "2 江○○ 939000000 Jiang"
1284 | ]
1285 | },
1286 | "execution_count": 8,
1287 | "metadata": {},
1288 | "output_type": "execute_result"
1289 | }
1290 | ],
1291 | "source": [
1292 | "# 讀取 excel 格式檔案\n",
1293 | "'''\n",
1294 | "參考連結:\n",
1295 | "[1] openpyxl - A Python library to read/write Excel 2010 xlsx/xlsm files\n",
1296 | "https://openpyxl.readthedocs.io/en/stable/\n",
1297 | "[2] pandas.read_excel\n",
1298 | "https://pandas.pydata.org/docs/reference/api/pandas.read_excel.html\n",
1299 | "'''\n",
1300 | "\n",
1301 | "df = pd.read_excel(\"./files/通訊錄.xlsx\"); df"
1302 | ]
1303 | },
1304 | {
1305 | "cell_type": "code",
1306 | "execution_count": 9,
1307 | "id": "82d25004",
1308 | "metadata": {},
1309 | "outputs": [],
1310 | "source": [
1311 | "# 寫入 excel 檔案\n",
1312 | "'''\n",
1313 | "參考連結:\n",
1314 | "[1] pandas.DataFrame.to_excel\n",
1315 | "https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_excel.html\n",
1316 | "'''\n",
1317 | "df.to_excel(\"./output.xlsx\", index=False)"
1318 | ]
1319 | }
1320 | ],
1321 | "metadata": {
1322 | "kernelspec": {
1323 | "display_name": "python3@nlp",
1324 | "language": "python",
1325 | "name": "k_nlp"
1326 | },
1327 | "language_info": {
1328 | "codemirror_mode": {
1329 | "name": "ipython",
1330 | "version": 3
1331 | },
1332 | "file_extension": ".py",
1333 | "mimetype": "text/x-python",
1334 | "name": "python",
1335 | "nbconvert_exporter": "python",
1336 | "pygments_lexer": "ipython3",
1337 | "version": "3.10.11"
1338 | }
1339 | },
1340 | "nbformat": 4,
1341 | "nbformat_minor": 5
1342 | }
1343 |
--------------------------------------------------------------------------------