第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

要鎖定的數(shù)據(jù)幀單元格,并用于運行余額計算的條件是同一行上另一個單元格的結(jié)果

要鎖定的數(shù)據(jù)幀單元格,并用于運行余額計算的條件是同一行上另一個單元格的結(jié)果

慕妹3242003 2022-08-11 20:16:49
假設(shè)我有以下數(shù)據(jù)幀:import pandas as pddf = pd.DataFrame()df['A'] = ('1/05/2019','2/05/2019','3/05/2019','4/05/2019','5/05/2019','6/05/2019','7/05/2019','8/05/2019','9/05/2019','10/05/2019','11/05/2019','12/05/2019','13/05/2019','14/05/2019','15/05/2019','16/05/2019','17/05/2019','18/05/2019','19/05/2019','20/05/2019')df['B'] = ('SIT','SCLOSE', 'SHODL', 'SHODL', 'SHODL', 'SHODL', 'SHODL', 'SELL','SIT','SIT','BCLOSE', 'BHODL', 'BHODL', 'BHODL', 'BHODL', 'BHODL', 'BHODL','BUY','SIT','SIT')df['C'] = (0.00,1.00,10.00, 5.00,6.00,-6.00, 6.00, 0.00,0.00,0.00,-8.00,33.00,-15.00,6.00,-1.00,5.00,10.00,0.00,0.00,0.00)df.loc[19, 'D'] = 100.0000可以看出,我從最后一行的100開始D列。我正在嘗試為列D編寫計算代碼,因此從底部行(第19行)開始,當B列上顯示買入或賣出時,D列上的數(shù)字被鎖定(例如100),并用于基于每個SHODL或BHODL的col C的計算,直到顯示BCLOSE或SCLOSE之后的行。鎖定的數(shù)字用于根據(jù)列 C 中的百分比計算運行余額。如您在第 16 行中看到的,C 列的“10”表示 10%。當 100 的 10% = 10 時,新的運行平衡為 110。第 15 行 C 列有 5%,因此將 5 添加到運行余額中以產(chǎn)生 115。下一行 14 列 C 具有 -1% 的變化,因為 100 的 1% 是 = 1,因此新的運行余額是 114,依此類推。以下是運行正確的代碼后,應(yīng)在數(shù)據(jù)幀的 col D 中返回的結(jié)果df['D'] = ('158.60','158.60', '157.30', '144.30', '137.80', '130.00', '137.80', '130.00','130.00','130.00','130.00', '138.00', '105.00', '120.00', '114.00', '115.00', '110.00','100.00','100.00','100.00')這種情況一直持續(xù)到 SCLOSE 或 BCLOSE 顯示為 BCLOSE 或 SCLOSE 行是計算運行余額的最后一行。如您所見,當顯示新的買入或賣出時,此過程將重新啟動。
查看完整描述

3 回答

?
喵喵時光機

TA貢獻1846條經(jīng)驗 獲得超7個贊

下一個起始值取決于上一組的最后一個值,因此我認為它無法矢量化。它需要某種迭代過程。我想出了在groupby的組上進行迭代的解決方案。反轉(zhuǎn)并分配給 。處理每組組并將最終組列表分配給原始組dfdf1df1df


df1 = df[::-1]

s = df1.B.isin(['BCLOSE','SCLOSE']).shift(fill_value=False).cumsum()

grps = df1.groupby(s)

init_val= 100

l = []

for _, grp in grps:

    s = grp.C * 0.01 * init_val

    s.iloc[0] = init_val

    s = s.cumsum()

    init_val = s.iloc[-1]

    l.append(s)


df['D'] = pd.concat(l)


Out[50]:

             A       B     C      D

0    1/05/2019     SIT   0.0  158.6

1    2/05/2019  SCLOSE   1.0  158.6

2    3/05/2019   SHODL  10.0  157.3

3    4/05/2019   SHODL   5.0  144.3

4    5/05/2019   SHODL   6.0  137.8

5    6/05/2019   SHODL  -6.0  130.0

6    7/05/2019   SHODL   6.0  137.8

7    8/05/2019    SELL   0.0  130.0

8    9/05/2019     SIT   0.0  130.0

9   10/05/2019     SIT   0.0  130.0

10  11/05/2019  BCLOSE  -8.0  130.0

11  12/05/2019   BHODL  33.0  138.0

12  13/05/2019   BHODL -15.0  105.0

13  14/05/2019   BHODL   6.0  120.0

14  15/05/2019   BHODL  -1.0  114.0

15  16/05/2019   BHODL   5.0  115.0

16  17/05/2019   BHODL  10.0  110.0

17  18/05/2019     BUY   0.0  100.0

18  19/05/2019     SIT   0.0  100.0

19  20/05/2019     SIT   0.0  100.0        


查看完整回答
反對 回復 2022-08-11
?
慕斯王

TA貢獻1864條經(jīng)驗 獲得超2個贊

下面的這篇文章應(yīng)該可以幫助你。它產(chǎn)生預期的輸出,并且速度相對較快,因為它避免了對數(shù)據(jù)幀行的直接迭代。


endpoints = [df.first_valid_index(), df.last_valid_index()]

# occurrences of 'BCLOSE' or 'SCLOSE'

breakpoints = df.index[(df.B =='BCLOSE') | (df.B == 'SCLOSE')][::-1]

# remove the endpoints of the dataframe that do not break the structure

breakpoints = breakpoints.drop(endpoints, errors='ignore')


PERCENTAGE_CONST = 100

top = 100  # you can specify any initial value here


for i in range(len(breakpoints) + 1):


    prv = breakpoints[i - 1] - 1 if i else -1  # previous or first breakpoint

    try:

        nex = breakpoints[i] - 1  # next breakpoint

    except IndexError:

        nex = None  # last breakpoint


    # cumulative sum of appended to 'D' column

    res = top + (df['C'][prv: nex: -1] * top / PERCENTAGE_CONST).cumsum()[::-1]

    df.loc[res.index, 'D'] = res


    # saving the value that will be the basis for percentage calculations

    # for the next breakpoint

    top = res.iloc[0]


查看完整回答
反對 回復 2022-08-11
?
紅糖糍粑

TA貢獻1815條經(jīng)驗 獲得超6個贊

我認為有一種更優(yōu)化和pythonic的方法可以解決這個問題。但是一個帶有迭代的解決方案:


df['D'] = pd.to_numeric(df['D'])

df['C'] = pd.to_numeric(df['C'])

D_val = None

for i in range(len(df)-1, 0, -1):

    if df.loc[i, 'B'] == 'BUY':

        D_val = df.loc[i, 'D']

        continue

    if D_val is None:

        continue

    df.loc[i, 'D'] = df.loc[i+1, 'D'] + (D_val * df.loc[i, 'C']/100)

每次遇到 in 時,您都會更新 .我們還可以有一個停止的條件,如OP所提到的,如 或 。BUYcolumn DD_valSCLOSEBCLOSE


查看完整回答
反對 回復 2022-08-11
  • 3 回答
  • 0 關(guān)注
  • 145 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號