我有一個資料框,在后續行中列出了交易活動。因此,第 1 行是買入資訊,第 2 行是賣出資訊,依此類推。
理想情況下,我希望在同一行中查看每個買入/??賣出對的資訊。通常我會使用pivot_table或pivot做這樣的事情,但問題是我想要旋轉的行是交替的。
這是我擁有的資料框的示例:
values = pd.DataFrame({
'Date': ['2010-01-03', '2011-02-06', '2012-03-06', '2012-05-15', '2013-04-12', '2014-03-18'],
'Signal': [1, -1, 1, -1, 1, -1],
'Close': [100, 103, 106, 108, 111, 114]
})
看起來像這樣:

但是,這是我想要的示例:
new_data = pd.DataFrame({
'Trade': [1, 2, 3],
'Begin Date': ['2010-01-03', '2012-03-06', '2013-04-12'],
'End Date': ['2011-02-06', '2012-05-15', '2014-03-18'],
'Trade Open': [100, 106, 111],
'Trade Close': [103, 108, 114]
})
看起來像這樣:

我知道有一種手動方法可以通過回圈遍歷每一行來執行此操作,但我想知道是否有更簡潔的矢量化方法來代替。
uj5u.com熱心網友回復:
嘗試:
- 每 2 行分配一個與交易編號對應的“idx”
- 根據“信號”分配“動作”
pivot獲得所需的結構rename列到所需值
values["idx"] = values.index // 2 1
values["action"] = np.where(values["Signal"].eq(1), "Open", "Close")
output = values.rename(columns={"Close": "Trade"}).pivot("idx", "action", ["Date", "Trade"])
output.columns = [" ".join(col) for col in output.columns.values]
output = output.reset_index().rename(columns={"idx": "Trade",
"Date Close": "End Date",
"Date Open": "Begin Date"})
>>> output
Trade End Date Begin Date Trade Close Trade Open
0 1 2011-02-06 2010-01-03 103 100
1 2 2012-05-15 2012-03-06 108 106
2 3 2014-03-18 2013-04-12 114 111
uj5u.com熱心網友回復:
values = values[values.Signal.eq(1)].reset_index(drop=True).join(values[values.Signal.eq(-1)].reset_index(drop=True),rsuffix="_").assign(Trade=lambda x: x.index 1)[['Trade','Date','Date_','Close','Close_']]
values.columns = ['Trade','Begin Date','End Date','Trade Open','Trade Close']
print(values)
Trade Begin Date End Date Trade Open Trade Close
0 1 2010-01-03 2011-02-06 100 103
1 2 2012-03-06 2012-05-15 106 108
2 3 2013-04-12 2014-03-18 111 114
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/369908.html
上一篇:合并丟失行的兩個資料幀中的兩個鍵
