如何在熊猫中进行滚动求和与乘法?

赫温尼

我有以下熊猫DataFrame:

df = pd.DataFrame([[100,100,0,0,0,0,0,0,0,0],[1.03, 1.02, 0.97, 1.02, 0.92, 1.08, 1.03 ,1.02, 1.03, 0.98],[0,0,0,0,0,0,0,0,0,0]]).T
df.index = ['2017-12-30', '2017-12-30', '2017-12-31','2018-01-01','2018-01-01',
            '2018-01-02','2018-01-02','2018-01-02','2018-01-03','2018-01-03']

输出:

                0     1    2
2017-12-30  100.0  1.03  0.0
2017-12-30  100.0  1.02  0.0
2017-12-31    0.0  0.97  0.0
2018-01-01    0.0  1.02  0.0
2018-01-01    0.0  0.92  0.0
2018-01-02    0.0  1.08  0.0
2018-01-02    0.0  1.03  0.0
2018-01-02    0.0  1.02  0.0
2018-01-03    0.0  1.03  0.0
2018-01-03    0.0  0.98  0.0

但是,我想将此DataFrame转换为如下所示的DataFrame:

                0     1    2
2017-12-30  100.00  1.03   3.0
2017-12-30  100.00  1.02   2.0
2017-12-31  105.00  0.97  -3.15
2018-01-01  101.85  1.02   2.037
2018-01-01  101.85  0.92  -8.15
2018-01-02  95.737  1.08   7.65
2018-01-02  95.737  1.03   2.87
2018-01-02  95.737  1.02   1.91
2018-01-03  108.17  1.03   3.25
2018-01-03  108.17  0.98  -2.16
2018-01-04  109.26  np.nan  np.nan

执行的计算如下:计算最后一列的前2个值。

100 * (1.03-1) = 3
100 * (1.02 -1) = 2

那么第一列中的第三个值将是:

100 + 3 + 2 = 105

计算最后一列第三行的值。

105 * (0.97-1) = -3.15

那么第一列中的第四和第五个值(与日期相关)将是:

105 -3.15 = 101.85

计算最后一列的第四和第五个值。

 101.85 * (1.02-1) = 2.037
 101.85 * (0.92-1) = -8.15

一直进行到所有值都填满为止。

Columns 2column 0时代column 1 - 1Columns 0结果从summation过去(时间有关)值column 2

每天每一行的第0列具有相同的值。这是通过对第2列的过去(在此特定日期之前)值进行求和来实现的。

会有什么帮助!

我想要一片T骨牛排

由于您只有3000行,并且很难对这些操作进行矢量化处理,因此可以使用循环。

#initiate varaibles
res_col2 = []
res_col0 = []
s = 0 # same date result sum
# initiate values
mult = df.iloc[0,0]
idx0 = df.index[0]

# loop with iteritems, not too bad with 3000 rows
for idx, val in (df[1]-1).iteritems(): #note the -1 is here already
    # update the mult and idx0 in case of not same date
    if idx != idx0:
        mult += s
        idx0 = idx
        s = 0
    # calculate the result
    r = mult*val
    s += r
    res_col2.append(r)
    res_col0.append(mult)

df[0] = res_col0
df[2] = res_col2

你会得到:

print(df)
                    0     1         2
2017-12-30  100.00000  1.03  3.000000
2017-12-30  100.00000  1.02  2.000000
2017-12-31  105.00000  0.97 -3.150000
2018-01-01  101.85000  1.02  2.037000
2018-01-01  101.85000  0.92 -8.148000
2018-01-02   95.73900  1.08  7.659120
2018-01-02   95.73900  1.03  2.872170
2018-01-02   95.73900  1.02  1.914780
2018-01-03  108.18507  1.03  3.245552
2018-01-03  108.18507  0.98 -2.163701

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章