? ? ?? 好用的Python妆距,便捷的Pandas穷遂,在數(shù)據(jù)計算和分析中其強大的功能堪比數(shù)據(jù)庫的存在,操作卻如同Excel般易于上手毅厚。他比Excel塞颁、Word浦箱、PPT使用VBA更能提升辦公自動化程度吸耿,也更讓人有發(fā)展和想象的空間!人類科技的進步酷窥,在開源這個共享智慧的時代里咽安,一日千里。
? ? ? 這么好的東西蓬推,因為各種原因妆棒,如教材的高不可攀,或案例脫離應用場景沸伏,常常將人拒之門外糕珊,或者枯躁得讓人無法堅持學習下去。
? ? ? 作為數(shù)據(jù)分析的擁躉毅糟,有義務也有責任將這么好的技術和工具推薦給大家红选。接下來的日子里,將會和大家一起來學習Python這個語言姆另,我們使用Spyder這個Python開發(fā)環(huán)境喇肋,[參考資料https://blog.csdn.net/yusongcan/article/details/77073794]
? ?? 首先我們需要安裝Anaconda坟乾,建議安裝3.7以上的版本,這個啊蝶防,想想看甚侣,有iphone6和iphone 11免費讓你選,你會選哪個间学?[參考資料 https://blog.csdn.net/ITLearnHall/article/details/81708148]
? ? ? 聲明:對于長的參考資料殷费,可以隨便看,不想看的時候可以不看菱鸥,想看的時候再看宗兼,這樣才會走得更遠!還有看教程一定要動手氮采,可以一天選一個主題或一個任務來訓練自己殷绍。欲成強者:動眼、動腦鹊漠、還動手主到!網上看到好的資料,收藏到分類的收藏夾里躯概。網上的文章登钥、電子書和紙質的書都是學習的好幫手和好工具。
? ? ?? 眼見為實娶靡,現(xiàn)在我們就通過一個遞歸函數(shù)和MRP物料需求計劃的計算來看一下我們“好用的Python牧牢,便捷的Pandas”,體驗一下“人生苦短姿锭,我用Python”是何等深情的“告白”吧塔鳍!
? ? ?? 用到的表單釋義,抓住重點呻此,我們盡量符合數(shù)據(jù)庫第三范式轮纫。
進入正題,在Spyder新建一個空白文件焚鲜,復制下列代碼和注釋
# -&- coding: utf-8 -&-
"""
Created on Mon Jul? 8 22:05:32 2019
@author: same3
"""
#引入三個python 包
#pandas:數(shù)據(jù)分析包
import pandas as pd #"as"顧名思義掌唾,即以后可以在程序中以縮寫pd 代表 pandas
#numpy:科學計算包
import numpy? as np
#xlwings:python操作Excel的模塊,最好的Excel操作包之一忿磅,有取代VBA的趨勢
#中文入門學習資料之一: https://www.cnblogs.com/catgatp/p/7875683.html
#英文官方學習網站https://docs.xlwings.org/en/stable/ 建設初學者有空翻翻糯彬,隨便看看就好,不要太深入葱她,因為太無趣
import xlwings as xw
#聲明Excel應用程序撩扒,或直接使用 wb=xw.Book(file) 也可以
#app=xw.App(visible=True,add_book=False) ?
"""
visible
Ture:可見excel
False:不可見excel
add_book
True:打開excel并且新建工作簿
False:不新建工作簿
"""
# display_alerts= False ,禁止Excel彈出提示的對話框
#app.display_alerts=False
#Excel 文件路徑
file = r'D:\VBA\LEARNING_ERP.xlsm' #字符串前面加r览效,是表示其后的字符串不轉義却舀,使用真實字符
#打開Excel工作簿虫几,文件路徑:'D:\VBA\LEARNING_ERP.xlsm' ,可根據(jù)實際設定
wb=xw.Book(file)
wb.app.display_alerts=False
#引用工作簿(workbook)里的工作表(worksheet)
sht_test=wb.sheets['base'] #存放基礎數(shù)據(jù)
sht_view=wb.sheets['view'] #存放計算后的數(shù)據(jù)
'''
引用單元格當前拓展區(qū)域挽拔,注意四周行和列的單元格(黃色部分)為空
工作表(worksheet)引用辆脸,下標從0從始,如sht_test[19,0]螃诅;單元格(range)引用啡氢,下標從1開始,如sht_test.range(20,1)這是python的特例术裸。
RNG1[第20行倘是,第1列]的拓展區(qū)域(綠色部分),即20-45行袭艺,A-C列的區(qū)域,即Bom物料清單
RNG2(藍色部分)搀崭,即Plan產品生產計劃
'''
RNG1= sht_test[19,0].api.currentregion
RNG2= sht_test[19,5].api.currentregion
#命名Excel單元格區(qū)域名稱
RNG1.name='Bom'
RNG2.name='Plan'
'''
Plan及Bom資料導入pandas的DataFrame中
header=1表示單元格區(qū)第一行為列標題行
index=True表示單元格區(qū)第一列為索引列,F(xiàn)alse表示自動索引(從0開始)
'''
dfsz5= sht_test['Plan'].options(pd.DataFrame, header=1,index=True).value
dfsz6 = sht_test['Bom'].options(pd.DataFrame, header=1,index=True).value
'''
連接Plan和Bom猾编,merge橫向(列)連接瘤睹,類似SQL SERVER數(shù)據(jù)庫連接join,
left_index=True,right_index=True表示左右兩個DataFrame以索引列為基準進行連接
how='inner'表示內連接
Bom(bill of material)根據(jù)物料清單(遞歸)計算 MRP 物料需求計劃
第二階開始到最尾階的物料分解,從第一階分解后取得所需數(shù)據(jù)
'''
def eeBom(df4A,df4,df2,CX1):
? ? df5=df4[['CID','PCQT','PROCID']]
? ? df5.rename(columns={'CID':'PID','PCQT':'PQT','PROCID':'PROPID'}, inplace = True)
? ? df5.reset_index(drop=True,inplace = True)
? ? df5.set_index('PID',inplace = True)
? ? df6=pd.merge(df5,df2,left_index=True,right_index=True,how='inner')
? ? if df6.empty :
? ? ? ? return df4A
? ? else:? ? ? ?
? ? ? ? df6['PCQT']=df6['PQT']*df6['CQT']
? ? ? ? df6['PROCID']=df6['PROPID']+'-'+str(CX1+1)
? ? ? ? df6['LEVEL']=CX1+1
? ? ? ? df4A=df4A.append(df6)
? ? ? ? return eeBom(df4A,df6,df2,CX1+1)? ?
#第一階的物料分解答倡,從Plan取得所需數(shù)據(jù)
#首先調動eBom函數(shù)轰传,eBom函數(shù)再調用eeBom,但是eeBom要定義在eBom之前瘪撇,不然會出錯获茬,會顯示找不到eeBom函數(shù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
def eBom(df1,df2):? ? ? ? ? ? ? ? ?
? ? df3=pd.merge(df1,df2,left_index=True,right_index=True,how='inner')
? ? df3['PCQT']=df3['PQT']*df3['CQT']
? ? df3['PROCID']=df3['PROPID']+'-'+str(1)? ? ? ? ? ? ?
? ? df3['LEVEL']=1
? ? return eeBom(df3,df3,df2,1)
#計算MRP,并按單據(jù)號,物料父項編號排序? ?
dfsz7=eBom(dfsz5,dfsz6).sort_values(by=['PROCID','PID'])
#'FC'列標志物料子項是否為:'F'-尾階(最終件)倔既,'M'-非尾階(中間件)
#全部先標注為'M'
dfsz7['FC']='M'
#獲取Bom表中所有物料父項編號恕曲,取唯一值即可
list1=list(dfsz6.index.unique())
#print(list1)
#對MRP物料需求計劃表中的最終件標識為'F'
dfsz7.loc[~dfsz7['CID'].isin( list1),['FC']]='F'
#就這樣完成啦!超簡潔叉存,有沒有小伙伴們码俩!
print(dfsz7)?
#導出到Excel度帮,首先刪除A:AA列歼捏,把格式也一起刪除,用cells.delete或clear無法刪除格式
sht_view.api.columns('A:AA').delete
sht_view.api.cells.delete
sht_view.clear
#在Excel view表'A1'單元格的擴展位置顯示dfsz5(即:Plan生產計劃表)
sht_view.range(1,1).expand().value =? dfsz5
#在Excel view表'E1'單元格的擴展位置顯示dfsz6(即:Bom物料清單表)
sht_view.range(1,5).expand().value =? dfsz6
#在Excel view表'I1'單元格的擴展位置顯示dfsz7(即:MRP物料需求計劃表)
sht_view.range(1,9).expand().value = dfsz7
#在Excel view表'第4笨篷、8列設置列的顏色瞳秽,便于在Excel中區(qū)分各個計算出來的數(shù)據(jù)集
sht_view.cells.columns(4).color=(255,128,255)
sht_view.cells.columns(8).color=(255,128,255)
#列自動調整寬度,如果要指定列寬可用 sht_view.range((1,1),(1,20)).api.ColumnWidth = 8
sht_view.api.columns('A:AA').autofit
結果如下:
? ? ? 看不明白的小伙伴們不要著急率翅,今天只是展示了Python強大功能的一角练俐,接下來的日子里,我們就一起共同來學習和進步吧冕臭!
? ? ? 工作之余要學習腺晾,學習之余要分享燕锥。平時只是看別人寫,現(xiàn)在自己寫一寫悯蝉,才知道其中需要巨大的努力归形,所謂的臺上一分鐘,臺下十年功鼻由,誠不欺人也暇榴!