0

我正在尝试计算 2 个时间序列数据帧之间的滚动差异。

我有 2 个数据集,df1 有一个入站时间序列,df2 有一个出站序列。

        Date    Code    Quantity
0   10/01/2019  A   20
1   10/01/2019  B   12
2   10/01/2019  C   10
3   11/01/2019  A   2
4   11/01/2019  B   30
5   11/01/2019  C   2
6   11/01/2019  D   1
7   12/01/2019  A   4
8   12/01/2019  B   6
9   12/01/2019  D   3
10  12/01/2019  E   2
11  13/01/2019  A   10
12  13/01/2019  B   12
13  13/01/2019  C   1

df2 - 输出

    Date     Code   Quantity
0   11/01/2019  A   5
1   11/01/2019  B   1
2   11/01/2019  C   3
3   12/01/2019  A   100
4   12/01/2019  D   2
5   12/01/2019  E   1
6   13/01/2019  B   1
7   13/01/2019  C   1

我正在尝试计算每个日期结束时的数量(df1 [数量] - df2 [数量]),然后将其添加到前一天结束时的数量,并规定数量不能<0在任何时候。

期望的输出

     Date      Code Quantity
0   10/01/2019  A   20
1   10/01/2019  B   12
2   10/01/2019  C   10
3   11/01/2019  A   17
4   11/01/2019  B   41
5   11/01/2019  C   9
6   11/01/2019  D   1
7   12/01/2019  A   0
8   12/01/2019  B   47
9   12/01/2019  D   2
10  12/01/2019  E   1
11  13/01/2019  A   10
12  13/01/2019  B   58
13  13/01/2019  C   9

我认为一个函数将是实现所需输出的最佳方式,但一直找不到任何东西来做到这一点。

4

1 回答 1

1

我不确定您想要的输出表是否正确。我可以匹配其中的一部分,但不能匹配全部。您可以使用代码来查看是否可以减少行,但我留下了一些额外的行,以便您可以通过它并查看发生了什么。目前尚不清楚您希望数量始终> = 0,因此有注释行可以做到这一点,而不是计算 q1-q2 并以负数结束。这样做,我仍然无法匹配您想要的输出。总是有另一种方法,但这应该让您了解在哪里查看以及如何优化代码。

s = """        Date    Code    Quantity
0   10/01/2019  A   20
1   10/01/2019  B   12
2   10/01/2019  C   10
3   11/01/2019  A   2
4   11/01/2019  B   30
5   11/01/2019  C   2
6   11/01/2019  D   1
7   12/01/2019  A   4
8   12/01/2019  B   6
9   12/01/2019  D   3
10  12/01/2019  E   2
11  13/01/2019  A   10
12  13/01/2019  B   12
13  13/01/2019  C   1"""

df1 = pd.read_csv(io.StringIO(s), sep='\s+', engine='python')

s ='''    Date     Code   Quantity
0   11/01/2019  A   5
1   11/01/2019  B   1
2   11/01/2019  C   3
3   12/01/2019  A   100
4   12/01/2019  D   2
5   12/01/2019  E   1
6   13/01/2019  B   1
7   13/01/2019  C   1'''
df2 = pd.read_csv(io.StringIO(s), sep='\s+', engine='python')

df3 = df1.merge(df2, how='outer', left_on=['Date', 'Code'], right_on=['Date', 'Code']).fillna(0)
df3['Qty'] = df3['Quantity_x'] - df3['Quantity_y']
# df3['Qty'] = df3.apply(lambda x: (x['Quantity_x'] - x['Quantity_y']) if (x['Quantity_x'] - x['Quantity_y']) > 0 else 0, axis=1)
df3['Quantity'] = 0
def final_adder(x):
    x.Quantity_x = x.Quantity_x.shift(1, fill_value=0)
    x.Quantity = x.Quantity_x + x.Qty
    # print(x)
    return x
df_final = df3.groupby(['Code']).apply(final_adder)
df_final['Quantity'] = df_final['Quantity'].clip(lower=0)
df_final.drop(['Quantity_x', 'Quantity_y', 'Qty'], inplace=True, axis=1)
print(df_final)

输出

          Date Code  Quantity
0   10/01/2019    A      20.0
1   10/01/2019    B      12.0
2   10/01/2019    C      10.0
3   11/01/2019    A      17.0
4   11/01/2019    B      41.0
5   11/01/2019    C       9.0
6   11/01/2019    D       1.0
7   12/01/2019    A       0.0
8   12/01/2019    B      36.0
9   12/01/2019    D       2.0
10  12/01/2019    E       1.0
11  13/01/2019    A      14.0
12  13/01/2019    B      17.0
13  13/01/2019    C       2.0
于 2020-12-22T04:53:16.657 回答