# Python 資料分析學習筆記
## 實作ㄧ:以User ID為索引,加總個別User ID的所有費用
整理前:

整理後:

### 使用工具:
* pandas
> 套件安裝指令
> `pip install 套件名稱`
## 讀取本地csv,轉成DataFrame
```python=
df = pd.read_csv("demo.csv")
print(df)
```
可以用`usecols=['col1','col2']`指定想擷取的欄位
```python=
df = pd.read_csv('billing.csv',
usecols=['User ID','Original Cost', 'Pretax Cost(Before Round Down Discount)'])
```
## 整理DataFrame
**土法煉鋼的演算法**
> 時間複雜度 O(n* m),資料量越龐大,處理時間會指數成長
先取出User ID欄位的唯一值,再用迴圈比對Original Cost所有值,並且丟入userid_ori_cost變數做加總
```python=
import pandas as pd
df = pd.read_csv('billing.csv')
df_userid_uni = df['User ID'].unique()
for userid in df_userid_uni:
userid_ori_cost = df[df['User ID'] == userid]['Original Cost'].sum()
print(f'使用者{userid}的加總費用為:{userid_ori_cost}')
```
**樞紐分析表**
> 時間複雜度 接近O(n) ,取決於資料中n的重複率
這個寫法預設會是取values的平均值
```python=
pvt = df.pivot_table(index='User ID', values='Original Cost')
print(pvt)
```
若要做加總,就再加上這個
```python=
pvt = df.pivot_table(index='User ID', values='Original Cost', aggfunc='sum')
print(pvt)
```
要做多重樞紐的話在`aggfunc=['','']`以陣列形式表達即可
```python=
pvt = df.pivot_table(index='User ID', values='Original Cost', aggfunc=['sum', 'median'])
print(pvt)
```
**目前可以完成樞紐分析了,剩下的工作是轉成新的工作表存進同個檔案內**
```python=
import pandas as pd
df = pd.read_csv('billing.csv',
usecols=['User ID','Original Cost','Discount','Discount(%)', 'Coupon Deduct', 'Pretax Cost(Before Round Down Discount)'])
pvt = df.pivot_table(index='User ID', values=['Original Cost','Discount','Discount(%)', 'Coupon Deduct', 'Pretax Cost(Before Round Down Discount)'], aggfunc='sum')
print(pvt)
```
存檔也是異常的方便,這樣就可以了
```python=
pvt.to_csv('filter_file.csv')
```
## 實作二:為每個客戶名稱加入SO編號
step1
取得「客戶名稱」欄位的唯一值,匯入dataframe
step2
建立一個字典`customer_dic`
step3
用for loop遍歷`df_costomer_name`,將客戶名稱放進`customer_dic`,並以index為基礎,修飾成我們要的流水號格式`value`後,放進`customer_dic`即可!
step4
```python=
import pandas as pd
df = pd.read_csv('202306匯入總檔.csv')
df_costomer_name = df['客戶名稱'].unique()
customer_dic = {}
for index, name in enumerate(df_costomer_name):
date_prefix = pd.to_datetime('now').strftime('%Y%m%d')
serial_num = str(index + 1).zfill(2)
value = f"SO-{date_prefix}-10{serial_num}"
customer_dic[name] = value
# print('\n'.join(customer_dic.values()))
print(customer_dic)
```
```python=
python3 main.py
{'公司測試': 'SO-20231214-1001', '創力美股份有限公司': 'SO-20231214-1002', '廣州東立網路科技': 'SO-20231214-1003', '傑富資訊科技有限公司 - Lilian': 'SO-20231214-1004', '永鼎數位科技有限公司': 'SO-20231214-1005', '宇匯知識股份有限公司': 'SO-20231214-1006', 'Ming Jie Limited': 'SO-20231214-1007', '博聿股份有限公司': 'SO-20231214-1008', '風純實業股份有限公司': 'SO-20231214-1009', 'Insag Limited': 'SO-20231214-1010', '星雲多媒體科技有限公司': 'SO-20231214-1011', '富亞科技': 'SO-20231214-1012', '艾克森科技有限公司': 'SO-20231214-1013', '艾爾默科技有限公司': 'SO-20231214-1014', 'BIABIA Limited': 'SO-20231214-1015', 'Ruiguang Limited': 'SO-20231214-1016', '周飞有限公司': 'SO-20231214-1017', '有病制作所股份有限公司': 'SO-20231214-1018', 'CHUAN KAI INTERNATIONAL Co.,LTD': 'SO-20231214-1019', 'little fish Limited': 'SO-20231214-1020', 'biabia-9 Limited': 'SO-20231214-1021', 'ZG Limited': 'SO-20231214-1022', '東方匯有限公司': 'SO-20231214-1023', '北京駭爾科技有限公司': 'SO-20231214-1024', '摩可數位科技有限公司': 'SO-20231214-1025', 'YC LIMITED': 'SO-20231214-1026', 'George Ltd': 'SO-20231214-1027', '逆風有限公司': 'SO-20231214-1028', 'Mesh Ltd.': 'SO-20231214-1029', 'Rio Ltd.': 'SO-20231214-1030', '環鴻科技股份有限公司': 'SO-20231214-1031', '銓鍇國際股份有限公司': 'SO-20231214-1032', '一步科技有限公司': 'SO-20231214-1033', 'Stan Limited': 'SO-20231214-1034', '雅信科技股份有限公司': 'SO-20231214-1035', '加密實驗股份有限公司': 'SO-20231214-1036', 'MI MI HUA Limited': 'SO-20231214-1037', 'Rich Mark Ltd.': 'SO-20231214-1038', 'Cat Limited': 'SO-20231214-1039', '康仕坦實業股份有限公司': 'SO-20231214-1040', 'OOFY technology co. ,limited': 'SO-20231214-1041'}
```
## 參考文件
[Pandas Pivot Table 樞紐分析](https://www.learncodewithmike.com/2022/02/pandas-pivot-table.html)
[Pandas Data Frame 實戰手冊](https://leemeng.tw/practical-pandas-tutorial-for-aspiring-data-scientists.html#%E7%94%A8-Python-dict-%E5%BB%BA%E7%AB%8B-DataFrame)
[Python Tkinter教學](https://yayar.medium.com/python-tkinter%E5%90%84%E7%A8%AE%E5%85%83%E4%BB%B6%E4%BD%BF%E7%94%A8-%E4%B8%8A-dd9d680ee602)
[資料分析思維養成](https://medium.com/%E6%95%B8%E6%93%9A%E5%88%86%E6%9E%90%E4%B8%8D%E6%98%AF%E5%80%8B%E4%BA%8B/%E5%AD%B8%E7%BF%92%E8%A8%88%E5%8A%83-%E5%B8%B6%E4%BD%A010%E5%91%A8%E5%85%A5%E9%96%80%E8%B3%87%E6%96%99%E5%88%86%E6%9E%90-66a48503e1b2)