【对比Python】分组子集运算
任务:计算出指定时间段内各种货物每天的库存状态
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 = [] |
14 | for index,group in stock_gr: |
15 | |
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) |
集算器
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 |
集算器9行代码完成Python32行代码完成的任务,而且再阅读代码时,集算器也更好理解。