【对比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行代码完成的任务,而且再阅读代码时,集算器也更好理解。