[英]How do you iterate through groups in a pandas Dataframe, operate on each group, then assign values to the original dataframe?
[英]How can you form a new dataframe reflecting the changes of values in an original dataframe?
如果你能窥视到未来,确切地知道什么股票购买和出售给他们的整个历史价格,你将如何实现它,给定约束,你只值Shares
是1000
, 0
,和-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.