Grouped subsets operations
Task:Calculate the daily inventory  status of various goods in the specified time period.
Python
| 1 | import pandas as pd | 
| 2 | import numpy as np | 
| 3 | starttime = ‘2015-01-01’ | 
| 4 | endtime = ‘2015-12-31’ | 
| 5 | stock_data = pd.read_csv(‘E:\\txt\\stocklog.csv’,sep=‘\t’) | 
| 6 | stock_data[‘DATE’]=pd.to_datetime(stock_data[‘DATE’]) | 
| 7 | stock_data = stock_data[(stock_data[‘DATE’]>=starttime)&(stock_data[‘DATE’]<=endtime)] | 
| 8 | stock_data[‘ENTER’]=stock_data[‘QUANTITY’][stock_data[‘INDICATOR’]!=‘ISSUE’] | 
| 9 | stock_data[‘ISSUE’]=stock_data[‘QUANTITY’][stock_data[‘INDICATOR’]==‘ISSUE’] | 
| 10 | stock_g = stock_data[[‘STOCKID‘,‘DATE’,‘ENTER’,‘ISSUE’]].groupby(by=[‘STOCKID’,‘DATE’],as_index=False).sum() | 
| 11 | stock_gr = stock_g.groupby(by=‘STOCKID’,as_index = False) | 
| 12 | date_df = pd.DataFrame(pd.date_range(starttime,endtime),columns=[‘DATE’]) | 
| 13 | stock_status_list = [] | 
| 1415 | for index,group in stock_gr: | 
| 16 | date_df[‘STOCKID’]=group[‘STOCKID’].values[0] | 
| 17 | stock_status = pd.merge(date_df,group,on=[‘STOCKID’,‘DATE’],how=‘left’) | 
| 18 | stock_status = stock_status.sort_values([‘STOCKID’,‘DATE’]) | 
| 19 | stock_status[‘OPEN’]=0 | 
| 20 | stock_status[‘CLOSE’]=0 | 
| 21 | stock_status[‘TOTAL’]=0 | 
| 22 | stock_status = stock_status.fillna(0) | 
| 23 | stock_value = stock_status[[‘STOCKID’,‘DATE’,‘OPEN’,‘ENTER’,‘TOTAL’,‘ISSUE’,‘CLOSE’]].values | 
| 24 | open = 0 | 
| 25 | for value in stock_value: | 
| 26 | value[2] = open | 
| 27 | value[4] = value[2] + value[3] | 
| 28 | value[6] = value[4] – value[5] | 
| 29 | open = value[6] | 
| 30 | stock = pd.DataFrame(stock_value,columns = [‘STOCKID’,‘DATE’,‘OPEN’,‘ENTER’,‘TOTAL’,‘ISSUE’,‘CLOSE’]) | 
| 31 | stock_status_list.append(stock) | 
| 32 | stock_status = pd.concat(stock_status_list,ignore_index=True) | 
| print(stock_status) | 
esProc
| A | B | |
| 1 | =file("E:\\txt\\stocklog.csv").import@t() | |
| 2 | =A1.select(DATE>=date("2015-01-01") && DATE<=date("2015-12-31")) | |
| 3 | =A2.groups(STOCKID,DATE; sum(if(INDICATOR=="ISSUE",QUANTITY,0)):ISSUE, sum(if(INDICATOR!="ISSUE",QUANTITY,0)):ENTER) | |
| 4 | =periods(start,end) | |
| 5 | for A3.group(STOCKID) | =A5.align(A4,DATE) | 
| 6 | >b=c=0 | |
| 7 | =B5.new(A5.STOCKID:STOCKID,A4(#):DATE,c:OPEN,ENTER, (b=c+ENTER):TOTAL,ISSUE, (c=b-ISSUE):CLOSE) | |
| 8 | >B7.run(ENTER=ifn(ENTER,0),ISSUE=ifn(ISSUE,0)) | |
| 9 | =@|B7 | 
esProc 9 lines of code complete the task of Python 32 lines of code, and when you read the code later on, esProc is easier to understand.

