2016-09-15 167 views
0

我有一個使用Pandas處理大型數據集的python程序。目前大約需要15分鐘才能完成。我想記錄(stdout &發送指標給Datadog)有關任務進度的信息。有沒有辦法獲得任務(或函數)的%完成?將來,我可能正在處理更大的數據集。我正在做的Python任務是一個大型熊貓數據框的簡單分組。事情是這樣的:完成長時間運行的Python任務的完成百分比

dfDict = {} 
for cat in categoryList: 
    df1 = df[df['category'] == cat] 
    if len(df1.index) > 0: 
     df1[dateCol] = pd.to_datetime(df[dateCol]) 
     dfDict[cat] = df1 

這裏,所屬分類擁有約20000項,和df是具有(比如說)500萬行的大型數據幀。

我不尋找任何幻想(如進度條..)。只是比例完整的價值。有任何想法嗎?

謝謝!

+0

可能是[Python Progress Bar](http://stackoverflow.com/questions/3160699/python-progress-bar) – dodell

回答

0

您可以根據需要修改以下內容。

from time import sleep 

for i in range(12): 
    sleep(1) 
    print("\r\t> Progress\t:{:.2%}".format((i + 1)/12), end='') 

什麼這個基本上沒有,是防止print()從寫默認結束字符(end=''),並在同一時間,把它寫任何東西之前,回車('\r')。簡而言之,您將覆蓋前面的print()聲明。

0

天真的解決辦法是隻使用行的總金額在你的數據集和你是在索引,然後計算的進展:

size = len(dataset) 
for index, element in enumerate(dataset): 
    print(index/size * 100) 

這隻會是有點可靠的,如果每一行約需同時完成。因爲你有一個很大的數據集,它可能會隨着時間的推移而平均,但是如果某些行需要一毫秒,而另一個需要10分鐘,則百分比將是垃圾。

還要考慮四捨五入的百分比到小數點後:

size = len(dataset) 
for index, element in enumerate(dataset): 
    print(round(index/size * 100), 1) 

打印的每一行可能會減慢你的任務分解顯著所以認爲這改善:

size  = len(dataset) 
percentage = 0 
for index, element in enumerate(dataset): 
    new_percentage = round(index/size * 100), 1) 
    if percentage != new_percentage: 
     percentage = new_percentage 
     print(percentage) 

有,當然,也模塊爲此:

progressbar

progress

+0

的重複!一些子集將會更快,有些將需要更長的時間。我看到了進度條......而且我的直覺告訴他們他們也會有類似的表現。不過,我現在會仔細查看進度條。 – user1717931