繁体   English   中英

如何形成一个新的数据框,以反映原始数据框中值的变化?

[英]How can you form a new dataframe reflecting the changes of values in an original dataframe?

如果你能窥视到未来,确切地知道什么股票购买和出售给他们的整个历史价格,你将如何实现它,给定约束,你只值Shares10000 ,和-1000 您还以1000股开始。 您还可以交易2000股,从1000直接增加到-1000 ,反之亦然。

我想要这样一个数据df_prices

              JPM
2008-01-02  38.47
2008-01-03  38.20
2008-01-04  37.33
2008-01-07  37.71
2008-01-08  36.21
2008-01-09  36.72

并将其转换为df_trades

            Symbol Order    Shares
2008-01-02  JPM    NOTHING  1000
2008-01-03  JPM    HOLD     1000
2008-01-04  JPM    HOLD     1000 
2008-01-07  JPM    BUY      0
2008-01-08  JPM    SELL     -1000
2008-01-09  JPM    HOLD     0

使用此代码:

if df_prices['JPM'].shift(1) > df_prices['JPM'] & curr_hold == 0:
    df_orders['Order'] = 'SELL'
    df_orders['Shares'] += 1000
elif df_prices['JPM'].shift(1) < df_prices['JPM'] & curr_hold == 0:
    df_orders['Order'] = 'BUY'
    df_orders['Shares'] -= 1000
elif df_prices['JPM'].shift(1) > df_prices['JPM'] & curr_hold == -1000:
    df_orders['Order'] = 'HOLD'
elif df_prices['JPM'].shift(1) < df_prices['JPM'] & curr_hold == 1000:
    df_orders['Order'] = 'HOLD'

但是,它不起作用。 我收到错误:

TypeError: cannot compare a dtyped [float64] array with a scalar of type [bool]

我能够弄清楚。

这足够了:

for i in range(len(df_prices)):
    if i == len(df_prices) - 1:
        df_orders.set_value(i, 'Date', df_prices.index[i])
        df_orders.set_value(i, 'Order', 'BUY')
        df_orders.set_value(i, 'Shares', 0)
        df_orders.set_value(i, 'Symbol', symbol)
        break
    if df_prices.loc[df_prices.index[i + 1]][symbol] > df_prices.loc[df_prices.index[i]][symbol] and curr_hold == 0:
        curr_hold += 1000
        df_orders.set_value(i, 'Date', df_prices.index[i])
        df_orders.set_value(i, 'Order', 'BUY')
        df_orders.set_value(i, 'Shares', 1000)
        df_orders.set_value(i, 'Symbol', 'JPM')
    elif df_prices.loc[df_prices.index[i + 1]][symbol] < df_prices.loc[df_prices.index[i]][symbol] and curr_hold == 0:
        curr_hold -= 1000
        df_orders.set_value(i, 'Date', df_prices.index[i])
        df_orders.set_value(i, 'Order', 'SELL')
        df_orders.set_value(i, 'Shares', 1000)
        df_orders.set_value(i, 'Symbol', symbol)
    elif df_prices.loc[df_prices.index[i + 1]][symbol] > df_prices.loc[df_prices.index[i]][symbol] and curr_hold == -1000:
        curr_hold += 2000
        df_orders.set_value(i, 'Date', df_prices.index[i])
        df_orders.set_value(i, 'Order', 'BUY')
        df_orders.set_value(i, 'Shares', 2000)
        df_orders.set_value(i, 'Symbol', symbol)
    elif df_prices.loc[df_prices.index[i + 1]][symbol] < df_prices.loc[df_prices.index[i]][symbol] and curr_hold == 1000:
        curr_hold -= 2000
        df_orders.set_value(i, 'Date', df_prices.index[i])
        df_orders.set_value(i, 'Order', 'SELL')
        df_orders.set_value(i, 'Shares', 2000)
        df_orders.set_value(i, 'Symbol', symbol)

尽管我可能可以将其中的许多模块进行模块化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM