# Python 資料分析學習筆記 ## 實作ㄧ:以User ID為索引,加總個別User ID的所有費用 整理前: ![image](https://hackmd.io/_uploads/rJGpZfvBT.png) 整理後: ![image](https://hackmd.io/_uploads/HyLQzzwSp.png) ### 使用工具: * 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)