我正在尝试为各种场景创建金额累积总和的"幻灯片",并每次从下一行开始累积总和。
我正在尝试获得类似于以下内容的内容:
Start Price Amt. 1 2 3 4 5
4105 1.6 1234
4105 1.65 1183 3986.7
4105 1.74 235 3963.2 4081.5
4105 1.5 1848 3778.4 3896.7 3920.2
4105 1.45 3183 3460.1 3578.4 3601.9 3786.7
4105 1.47 7295 2730.6 2848.9 2872.4 3057.2 3375.5
4105 1.31 4384 2292.2 2410.5 2434 2618.8 2937.1
4105 1.41 734 2218.8 2337.1 2360.6 2545.4 2863.7
4105 1.4 2773 1941.5 2059.8 2083.3 2268.1 2586.4
4105 1.4 4429 1498.6 1616.9 1640.4 1825.2 2143.5
4105 1.4 396 1459 1577.3 1600.8 1785.6 2103.9
4105 1.38 461 1412.9 1531.2 1554.7 1739.5 2057.8
4105 1.38 186 1394.3 1512.6 1536.1 1720.9 2039.2
4105 1.38 368 1357.5 1475.8 1499.3 1684.1 2002.4
4105 1.47 362 1321.3 1439.6 1463.1 1647.9 1966.2
4105 1.43 601 1261.2 1379.5 1403 1587.8 1906.1
4105 1.4292 307 1230.5 1348.8 1372.3 1557.1 1875.4
4105 1.368 132 1217.3 1335.6 1359.1 1543.9 1862.2
4105 1.31 1891 1028.2 1146.5 1170 1354.8 1673.1
4105 1.31 335 994.7 1113 1136.5 1321.3 1639.6
4105 1.34 265 968.2 1086.5 1110 1294.8 1613.1
4105 1.22 701 898.1 1016.4 1039.9 1224.7 1543
4105 1.2 832 814.9 933.2 956.7 1141.5 1459.8
4105 1.17 2759 539 657.3 680.8 865.6 1183.9
4105 1.1799 7 538.3 656.6 680.1 864.9 1183.2
4105 1.2 2 538.1 656.4 679.9 864.7 1183
4105 1.19 100 528.1 646.4 669.9 854.7 1173
4105 1.08 2561 272 390.3 413.8 598.6 916.9
4105 1.1 3063 0 84 107.5 292.3 610.6
4105 1.05 660 18 41.5 226.3 544.6
4105 1.11 947 0 0 131.6 449.9
4105 1.3 4381 0 11.8
4105 1 103 1.5
4105 1.0799 1 1.4
4105 1.0068 124 0
"开始"、"价格"和"Amt"值位于数据帧中。第一个值 (3986.7( 是当天 Amt 的 10% (118.3(,从起始值(常量(中减去。下一个值是从 4105 中减去第一个金额的 10% 加上第二个金额 (118.3+23.5( 的总和。在第二列中,我们从相同的 4105 开始,但从减去 23.5 开始,依此类推。每个"幻灯片"的行应为空,或 NaN。
下面的代码让我接近(末尾的两行将负数替换为 0(:
import pandas as pd
df = pd.read_csv("datafile.csv")
length = len(df)
begPos = df.Position
df['sub_value'] = df.Volume*.1
for x in range(10):
df['slide_' +str(x)] = begPos.shift(1-x) - df.sub_value.shift(-x).cumsum()
numb = df._get_numeric_data()
numb[numb < 0] = 0
这将为我提供正确的值,但将它们全部从第一行开始。
我尝试过使用移位值(对于每个组合,我在每个排列 x、-x、x-1、X+1 等上都有一个完整的矩阵(,但无法让它工作。
在我解决这个问题之后,这个程序还有一些部分,但我希望这些部分在比较中会很容易。
为 10% 的值创建一个列,然后在循环中将其与 cumsum(( 一起使用。 最后,您可以将 NaN 替换为 ",并删除不需要的列。
df["10pcnt"]=df["Amt."].div(10)
Start Price Amt. 10pcnt
0 4105 1.6000 1234 123.4
1 4105 1.6500 1183 118.3
2 4105 1.7400 235 23.5
3 4105 1.5000 1848 184.8
4 4105 1.4500 3183 318.3
5 4105 1.4700 7295 729.5
6 4105 1.3100 4384 438.4
7 4105 1.4100 734 73.4
8 4105 1.4000 2773 277.3
9 4105 1.4000 4429 442.9
10 4105 1.4000 396 39.6
11 4105 1.3800 461 46.1
...
for i in range(1,len(df)):
df[i]= df.Start.sub(df.loc[i:,"10pcnt"].cumsum())
df[i]= df[i].where(df[i]>=0,np.nan)
Start Price Amt. 10pcnt 1 2 3 ...
0 4105 1.6000 1234 123.4 NaN NaN NaN ...
1 4105 1.6500 1183 118.3 3986.7 NaN NaN ...
2 4105 1.7400 235 23.5 3963.2 4081.5 NaN ...
3 4105 1.5000 1848 184.8 3778.4 3896.7 3920.2 ...
4 4105 1.4500 3183 318.3 3460.1 3578.4 3601.9 ...
5 4105 1.4700 7295 729.5 2730.6 2848.9 2872.4 ...
6 4105 1.3100 4384 438.4 2292.2 2410.5 2434.0 ...
7 4105 1.4100 734 73.4 2218.8 2337.1 2360.6 ...
8 4105 1.4000 2773 277.3 1941.5 2059.8 2083.3 ...
9 4105 1.4000 4429 442.9 1498.6 1616.9 1640.4 ...
10 4105 1.4000 396 39.6 1459.0 1577.3 1600.8 ...
11 4105 1.3800 461 46.1 1412.9 1531.2 1554.7
df.drop(columns="10pcnt")
df.replace(np.nan,"")