跟踪数据在两个数据集(或矩阵)之间的移动

时间:2018-08-15 11:53:18

标签: python r excel excel-vba

我有两个数据集,例如7月和8月数据,每个数字表示下订单的数量。 我想比较两组之间的数据并找出它们之间的任何差异。 主要可以有三个差异
a)=订单已取消(数字存在于左侧数据集中,而不存在于右侧)
b)=新订单(右侧数据集中存在编号,但左侧不存在)
c)=延后的订单(两个数据集中均存在编号(但右侧数据集中的编号在下个月M0处存在)
d)=优先(为简化起见,我们将假定不会发生)

     July                       August              
TypeM09 M10 M11 M12     TypeM09 M10 M11 M12
A   0   1   2   0       A   0   1   2   0
B   1   0   0   0       B   0   0   1   0
C   1   2   0   0       C   0   1   0   0
D   1   2   2   0       D   1   0   0   2

注意-在上述类型D中,数字2在M10和M11的左侧数据集中出现两次,在M12的右侧数据集中出现一次。由于程序正在从左到右检查数据,因此一旦程序识别出M12(在左数据集中)存在M10(在左数据集中),因此M11(左数据集中的数字实际上被取消了,因为没有以便在正确的数据集中与之匹配的更多“免费”数字。

程序应读取如下内容

Type    M09                   M10                     M11            M12
A       -                     no change no change     -              -
B       postponement to M11   -                       -              -
C       postponement to M10   cancellation  -   -
D       no change             postponement to M11      cancellation  -

作为输出,我希望实现以下目标:

Type    Detail          Previous month  New month
x       Postponement    M07             M11
x       Postponement    M08             M12
y       Cancellation    M08             -
z       New order       -               M12

1 个答案:

答案 0 :(得分:0)

我仍然没有什么疑问,因此只能产生中间输出。 对于上面提到的类型A,B,C,D的示例,请在期望的输出中添加更多的解释

from collections import defaultdict
data_2dlist_1 = [
    ['Type', 'M09' ,'M10', 'M11', 'M12'],
    ['A' ,  0 , 1 , 2 , 0] ,     
    ['B' ,  1 , 0 , 0 , 0] ,     
    ['C' ,  1 , 2 , 0 , 0] ,     
    ['D' ,  1 , 2 , 2 , 0] ]

data_2dlist_2 =[
['Type', 'M09' ,'M10', 'M11', 'M12'],
['A', 0,   1,   2,   0],
['B', 0,   0,   1,   0],
['C', 0,   1,   0,   0],
['D', 1,   0,   0,   2]]

output_2d = [['Type', 'M09' ,'M10', 'M11', 'M12']]
final_output_2d = [['Type','Detail','Previous month'  ,'New month']]


for d1, d2 in zip(data_2dlist_1[1:],data_2dlist_2[1:]):
    #print(d1,d2)
    output_2d.append([d1[0]]) #new_type row creation
    looked = defaultdict()

    for i in range(1,len(d1),1):

        if d1[i] == 0: 
            output_2d[-1].append('-')

        elif d1[i] == d2[i]:
            output_2d[-1].append('no change')

        elif d1[i] != 0: 
            start = i+1
            if d1[i] in looked:
                start = looked[d1[i]] + 1
            try:
                found_at = d2.index(d1[i],start)
                output_2d[-1].append('postponement to '+ str(data_2dlist_2[0][found_at]))
                looked[d1[i]] = found_at

            except ValueError: #not found 
                output_2d[-1].append('cancellation')

        elif d2[i] not in looked: #and d1[i] == 0
            output_2d[-1].append('new order')

print(output_2d)

'''       

[['Type', 'M09', 'M10', 'M11', 'M12'],
['A', '-', 'no change', 'no change', '-'],
['B', 'postponement to M11', '-', '-', '-'],
['C', 'postponement to M10', 'cancellation', '-', '-'],
['D', 'no change', 'postponement to M12', 'cancellation', '-']]

'''