# Amkor Python課程2024 ## 2024-04-26 ## Pandas #### Series ```python= import pandas as pd a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0] i = [4, 6, 'aa'] s = pd.Series(a) # 建立Series s1 = pd.Series([1, 2, 3], index=i) print(type(s)) print((s + 1)*2) print(s[ [1, 3, 6] ]) ``` #### dict ```python= # list, tuple, dict字典 a = [1, 2, 3] b = (1, 2, 3) c = {'a':999, True:888, (8, 8): 555} # 無序 # c['b'] = 777 # del c['b'] print(c[True]) print(c[(8, 8)]) ``` #### DataFrame ```python= import pandas as pd # 每個欄位的資料筆數必須相同 data = { 'a': [1, 2, 3, 4], # 'a'=欄位名稱 '姓名': ['aa', 'bb', 'cc', 'dd'], 4: [8, 7, 6, 5] } index = [88, 77, 66, 55] c = [4, 'a', '姓名'] df = pd.DataFrame(data, index=index, columns=c) print(df) print(df.T) df.T.to_excel('test.xlsx') ``` #### select dataframe ```python= import pandas as pd data = { '學號': [1, 2, 3, 4, 5], '姓名': ['Aaron', 'Amber', 'Apple', 'Andy', 'Astrid'], '國文': [100, 90, 80, 70, 60], '英文': [88, 77, 66, 55, 44], '數學': [32, 47, 63, 21, 98] } index = ['A', 'B', 'C', 'D', 'E'] df = pd.DataFrame(data, index=index) df.to_excel('score.xlsx') print(df) # print(df.loc['B', '姓名']) # print(df.loc['B', ['姓名','國文','數學'] ]) # # 練習: Apple andy的英文成績 # print(df.loc[ ['C', 'D'], '英文' ]) # print(df.loc[ : , ['學號', '姓名'] ]) # print(df.loc[ 'D' , '國文' ]) # Andy的國文成績 # print(df.iloc[3, 2]) print(df.iloc[[1, 2, 4], 1:4 ]) ``` ``` import pandas as pd data = { '學號': [1, 2, 3, 4, 5], '姓名': ['Aaron', 'Amber', 'Apple', 'Andy', 'Astrid'], '國文': [100, 90, 80, 70, 60], '英文': [88, 77, 66, 55, 44], '數學': [100, 47, 63, 21, 98] } index = ['A', 'B', 'C', 'D', 'E'] df = pd.DataFrame(data, index=index) # df.to_excel('score.xlsx') print(df[ df.英文 < 60 ].loc[:, ['姓名', '英文'] ] ) print(df[ (df.國文 == 100) and (df.數學 == 100) ] ) ``` #### sort ```python= import pandas as pd data = { '學號': [1, 2, 3, 4, 5], '姓名': ['Aaron', 'Amber', 'Apple', 'Andy', 'Astrid'], '國文': [100, 90, 80, 70, 60], '英文': [88, 77, 66, 55, 44], '數學': [100, 47, 63, 21, 98] } index = ['A', 'B', 'C', 'D', 'E'] df = pd.DataFrame(data, index=index) # df.to_excel('score.xlsx') # df.set_index('數學', inplace=True) # df.sort_index(ascending=True, inplace=True) df2 = df.sort_values(['數學'], ascending=False) print(df2) ``` ``` import pandas as pd data = { '學號': [1, 2, 3, 4, 5], '姓名': ['Aaron', 'Amber', 'Apple', 'Andy', 'Astrid'], '國文': [100, 90, 80, 70, 60], '英文': [88, 77, 66, 55, 44], '數學': [100, 47, 63, 21, 98] } index = ['A', 'B', 'C', 'D', 'E'] df = pd.DataFrame(data, index=index) # df.to_excel('score.xlsx') # df.英文 = [188, 177, 660, 5, 4] # def doSomething(val): # if val < 60: # return val + 10 # else: # return val # df.英文 = df.英文.apply(doSomething) df.英文 = df.英文.apply(lambda val: val + 100 if val < 60 else 0) print(df) ``` ``` import pandas as pd data = { '學號': [1, 2, 3, 4, 5], '姓名': ['Aaron', 'Amber', 'Apple', 'Andy', 'Astrid'], '國文': [100, 90, 80, 70, 60], '英文': [88, 77, 66, 55, 44], '數學': [100, 47, 63, 21, 98] } data2 = { '學號': [6, 7], '姓名': ['OK', 'GOOD'], '國文': [71, 61], '英文': [56, 45], '數學': [27, 44] } index = ['A', 'B', 'C', 'D', 'E'] df = pd.DataFrame(data, index=index) df2 = pd.DataFrame(data2) print(df) print(df2) df_result = pd.concat([df, df2], ignore_index=True) print(df_result) ``` ``` import pandas as pd data = { '學號': [1, 2, 3, 4, 5], '姓名': ['Aaron', 'Amber', 'Apple', 'Andy', 'Astrid'], '國文': [100, 90, 80, 70, 60], '英文': [88, 77, 66, 55, 44], '數學': [100, 47, 63, 21, 98] } data2 = { '姓名': ['Amber', 'Apple', 'Astrid'], '歷史': [97, 73, 8], '地理': [ 88, 65, 68] } index = ['A', 'B', 'C', 'D', 'E'] df = pd.DataFrame(data, index=index) index2 = ['B', 'C', 'E'] df2 = pd.DataFrame(data2, index=index2) print(df) print(df2) df_result = pd.merge(df, df2, how='left') print(df_result) df_result.to_excel('test2.xlsx') ``` #### 練習 ```python= import pandas as pd import os def process(part_no): # 讀取Bump Report df_br = pd.read_excel(f'Bump Report_{part_no}.xls') # 讀取plannarity Report df_pr = pd.read_excel(f'planarity Report_{part_no}.xls') # 安裝: pip3 install xlrd lot = df_br.iloc[2, 2] wafarId = df_br.iloc[2, 3] avgHeight = df_br.iloc[4:, 5] avgDiam = df_br.iloc[4:, 9] lms = df_pr.iloc[4:, 10] data = { 'Lot': [lot], 'WafarID': [wafarId], '': [''] } df1 = pd.DataFrame(data) data = { 'Lot': avgHeight, 'WafarID': avgDiam, '': lms } df2 = pd.DataFrame(data) # 合併 df_result = pd.concat([df1, df2]) df_result.to_excel(f'Final_{part_no}.xlsx', index=0) files = os.listdir() for f in files: if 'Bump Report_' in f: part_no = f.replace('Bump Report_', '') part_no = part_no.replace('.xls', '') process(part_no) ``` ## 2024-04-19 #### `elif` ```python= import random # 1~5之間隨機產生一個數字 a = random.randint(1, 5) if a == 1: print('今天會撿到錢') elif a == 2: print('今天會中樂透') elif a == 3: print('今年會加薪') elif a == 4: print('今天股票大漲') elif a == 5: print('沒事') else: print('程式壞掉了') ``` #### 剪刀石頭布 ```python= import random # 電腦出拳 pc = random.randint(0, 2) # 0=剪刀, 1=石頭, 2=布 print(f'電腦出了: {["剪刀", "石頭", "布"][pc]}') # 玩家出拳 user = int( input('請出拳(0=剪刀, 1=石頭, 2=布): ') ) if pc == 0 and user == 1: print('你贏了') elif pc == 0 and user == 2: print('你輸了') elif pc == 1 and user == 0: print('你輸了') elif pc == 1 and user == 2: print('你贏了') elif pc == 2 and user == 0: print('你贏了') elif pc == 2 and user == 1: print('你輸了') else: print('平手') ``` #### 邏輯運算子 ```python= # 邏輯運算子 print(not True) print(False and True) a = 2 b = 5 print(a > 3 or b < 9) ``` #### `match-case` ```python= match a: case 1: print('今天會撿到錢') case 2: print('今天會中樂透') case 3: print('今年會加薪') case 4: print('今天股票大漲') case 5: print('沒事') case _: print('程式壞掉了') ``` #### while迴圈 ```python= a = 0 while a < 10: if a % 2 == 0: print(a) a = a + 1 ``` #### `continue` ```python= a = 0 # for-in迴圈 while a < 10: a = a + 1 if a % 2 == 1: continue # 忽略剩下的程式碼, 直接跳到迴圈開頭進行下一次的迴圈 print(a) ``` #### 切片 ```python= a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] print(a[3:6]) print(a[6:]) print(a[:]) print(a[::2]) print(a[1::3]) # [2, 5, 8] print(a[::-1]) print(a[5::-1]) print(a[-2:-1]) print(a[-3::2]) # 拿[7, 5, 3] print(a[6:1:-2]) # 拿[10, 1] print(a[-1::-len(a)+1]) ``` #### tuple, pack, unpack ```python= # tuple 元組 a = [1, 2, 3, 4, 5] b = (1, 2, 3, 4, 5) print(type(a)) print(type(b)) a[0] = 6 print(b[3:]) a = 1, 2, 3, 4, 5, a1, *a2, a3 = a print(a1) print(a2) print(a3) ``` #### 命名規則 ```python= # define # 1. 名字只能是英文大小寫, 數字, 底線的組合 # 2. 名字第一個字不可以是數字 # 3. 大小寫視為不同的名字 # 4. 不能使用python的關鍵字來命名 a = [22, 33, 66] sum = 0 del sum # 復原功能 print(sum(a)) ``` ```python= def show(): print('hello') print('aaron') show() # 函式呼叫 ``` ``` def show(name): # 小括號內可以透過參數將資料傳遞給函式 print('hello') print(name) show('OK') # 函式呼叫 ``` ```python= def plus(a, b): total = a + b print(f'加總後為: {total}') plus(2, 3) plus(66, 88) ``` #### `resutn` ```python= def plus(a, b): total = a + b # print(f'加總後為: {total}') return total # 將資料回傳給呼叫方 plus(2, 3) result = plus(66, 88) print('result=', result) ``` ```python= # 有參數預設值的參數,右邊的所有參數都必須要有預設值 def showMe(name='無名氏', age='0', phone='無填寫', addr='無填寫'): # 參數預設值 print(f'name={name}') print(f'age={age}') print(f'phone={phone}') print(f'addr={addr}') showMe(99) #### ``` try: # 例外處理 a = int('AA') print(a) except ValueError: print('不是數字') ``` # 指定參數 showMe(age=99, name='aaron', phone='0987654321', addr='.....') a = 3 b = showMe b('一級函式') ``` ```python= import random a = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] answer = random.sample(a, 4) # 從a list裡面隨機挑出四筆資料 answer = ''.join(answer) print(f'答案是: {answer}') guess_count = 0 # 記錄猜了幾次 # 開始猜 while True: user = input('請猜0~9之前的四個數字,數字不可重覆: ') guess_count += 1 try: int(user) # 判斷書入的資料是不是數字 except ValueError: print('只能輸入數字, 請重新輸入') continue if len(user) != 4: print('只能輸入4個數字, 請重新輸入') continue if len(set(user)) != 4: print('數字不可以重覆, 請重新輸入') continue if answer == user: print(f'猜對了, 總共猜了{guess_count}次, 遊戲結束.') break # 紀錄幾個A how_many_a = 0 if answer[0] == user[0]: how_many_a += 1 if answer[1] == user[1]: how_many_a += 1 if answer[2] == user[2]: how_many_a += 1 if answer[3] == user[3]: how_many_a += 1 how_many_b = 0 if user[0] in answer and user[0] != answer[0]: how_many_b += 1 if user[1] in answer and user[1] != answer[1]: how_many_b += 1 if user[2] in answer and user[2] != answer[2]: how_many_b += 1 if user[3] in answer and user[3] != answer[3]: how_many_b += 1 print(f'{how_many_a}A{how_many_b}B, 已經猜了{guess_count}次.') ``` ## 2024-04-12 #### h4 ```python= print('Hello Python') hello = 43 print(hello) ``` #### h4 ```python= a = '3' b = '4' print(a + b) ``` #### 四則運算 ```python= print(3 + 1) print(3 - 1) print(3 * 1) print(7 / 2) print(7 // 2) print(7 ** 2) print(7 % 2) ``` #### ```python= user = input('請輸入數字: ') print('你輸入了: ', user) ``` #### 比較運算 ```python= print(3 > 2) a = 99 b = 88 print(a == b) print(b + 11 == a) print(2 ** 1 > 4 // 2) ``` #### 資料型態 ```python= print( type(5) ) print( type('5') ) print( type(True) ) ``` #### h4 ```python= user1 = input('Please input no1: ') user2 = input('Please input no2: ') user1 = int(user1) user2 = int(user2) print(user1 + user2) ``` #### h ```python= # 請寫一個程式,使用者輸入一個數字, # 程式判斷後顯示該數字為奇數或偶數 user = input('請輸入一個數字: ') user = int(user) if user % 2 == 1: print('奇數') else: print('偶數') ``` 簡化的寫法: ```python= # 請寫一個程式,使用者輸入一個數字, # 程式判斷後顯示該數字為奇數或偶數 print('奇數') if int( input('請輸入一個數字: ') ) % 2 == 1 else print('偶數') ``` #### list ```python= a = [33, 44, 55, 66, 77, 88, 99, 1120, 22] print(a) print(a[4]) a.append(4) a.remove(1120) # 用值刪除資料 del a[0] # 用位置刪除資料 print(a, len(a)) ``` #### 二維list ```python= a = [55, 'Aaron', True, [1, 2, 3], ['a', 'b', 'c']] print(a[3][1]) excel = [[1, 2, 3], ['a', 'b', 'c']] print(excel[1][2]) ``` #### ```python= a = [1, 'aaron', True, 'ok', 999] for t in a: print(t) ``` #### h ```python= a = [] # 空list a.append(int(input('請輸入一個數字: '))) a.append(int(input('請輸入一個數字: '))) a.append(int(input('請輸入一個數字: '))) print(a) total = 0 for t in a: total = total + t print('總和:', total) ``` #### while True ```python= a = [] # 空list while True: user = input('請輸入一個數字(quit=離開): ') if user == 'quit': break else: a.append(int(user)) print(a) total = 0 for t in a: total = total + t print('總和:', total) ``` #### in ```python= a = [1, 2, 44, 55, 66] b = 'Today is a good day, my name is aaron' print('55' in a) print('andy' in b) ``` #### \n ```python= print('abcde\n你好') # \n在字串裡是換行的意思 ``` #### 資料欄位說明 |索引|欄位名稱|說明| |-|-|-| |0|sareaen|行政區英文名| |1|sarea|行政區中文名| |2|lng|經度| |3|sna|中文站名| |4|snaen|英文站名| |5|bemp|空位數量| |6|ar|中文地址| |7|act|全站禁用狀態(0:禁用、1:啟用)| |8|sno|站編號| |9|aren|英文地址| |10|tot|場站總停車格| |11|_id|資料編號| |12|sbi|場站目前車輛數量| |13|mday|微笑單車各場站來源資料更新時間| |14|lat|緯度| > **資料來源:** > > https://data.gov.tw/dataset/137993 #### h4 ```python= import requests import csv # CSV網址 url = 'https://data.tycg.gov.tw/api/v1/rest/datastore/a1b4714b-3b75-4ff8-a8f2-cc377e4eaa0f?format=csv' response = requests.get(url) # 到網頁去抓取資料 rows = response.text.splitlines() data = list(csv.reader(rows)) # 將資料透過csv轉成兩層的list user = input('請輸入要搜尋的場站名稱: ') for row in data: if user in row[3]: print('站名:', row[3], ', 地址:', row[6]) print(' - 可借:', row[12]) print(' - 可還:', row[5]) print() # 這個只是為了多空一行 print(f'站名: {row[3]}, 地址: {row[6]}') print(f' - 可借: {row[12]}') print(f' - 可還: {row[5]}') print() # 這個只是為了多空一行 ```