# 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() # 這個只是為了多空一行
```