Python 在数据框中创建ID列
我有一个包含交易日志的数据框。我的问题是,我没有任何ID来匹配股票的买卖。该股票可以交易多次,我想有一个ID来匹配每个完成的交易。 我的原始数据帧是带有时间戳的顺序timeseries数据帧。下面的例子说明了我的问题,我需要按顺序匹配和识别交易的股票。 非常简单的示例:Python 在数据框中创建ID列,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个包含交易日志的数据框。我的问题是,我没有任何ID来匹配股票的买卖。该股票可以交易多次,我想有一个ID来匹配每个完成的交易。 我的原始数据帧是带有时间戳的顺序timeseries数据帧。下面的例子说明了我的问题,我需要按顺序匹配和识别交易的股票。 非常简单的示例: df1 = pd.DataFrame({'stock': ['A', 'B', 'C', 'A','C', 'A', 'A'], 'deal': ['buy', 'buy', 'b
df1 = pd.DataFrame({'stock': ['A', 'B', 'C', 'A','C', 'A', 'A'],
'deal': ['buy', 'buy', 'buy', 'sell','sell', 'buy', 'sell']})
df1
Out[84]:
stock deal
0 A buy
1 B buy
2 C buy
3 A sell
4 C sell
5 A buy
6 A sell
这是我想要的输出:
df1 = pd.DataFrame({'stock': ['A', 'B', 'C', 'A','C', 'A', 'A'],
'deal': ['buy', 'buy', 'buy', 'sell','sell', 'buy', 'sell'],
'ID': [1, 2, 3, 1,3, 4, 4]})
df1
Out[82]:
stock deal ID
0 A buy 1
1 B buy 2
2 C buy 3
3 A sell 1
4 C sell 3
5 A buy 4
6 A sell 4
有什么想法吗?试试这个:
m = df1['deal'] == 'buy'
df1['ID'] = m.cumsum().where(m)
df1['ID'] = df1.groupby('stock')['ID'].ffill()
df1
输出:
stock deal ID
0 A buy 1.0
1 B buy 2.0
2 C buy 3.0
3 A sell 1.0
4 C sell 3.0
5 A buy 4.0
6 A sell 4.0
enter code here
stock deal id
0 A buy 1
1 B buy 2
2 C buy 3
3 A sell 1
4 C sell 3
5 A buy 4
6 A sell 4
详情:
- 创建一个布尔级数,如果deal等于“buy”,则为True
- Cumsum并分配给“ID”以购买记录
- 使用groupby和ffill将“ID”分配给下一个“sell”记录购买 “股票”
import pandas as pd
df1 = pd.DataFrame({'stock': ['A', 'B', 'C', 'A','C', 'A', 'A'],
'deal': ['buy', 'buy', 'buy', 'sell','sell', 'buy', 'sell']})
def sequential_buy_sell_id_generator(df1):
column_length = len(df1["stock"])
found = [0]*column_length
id = [0]*column_length
counter = 0
for row_pointer_head in range(column_length):
if df1["deal"][row_pointer_head]=="buy":
id[row_pointer_head]= counter
counter+=1
found[row_pointer_head] = 1
id[row_pointer_head]= counter
for row_pointer_tail in range(row_pointer_head+1, column_length):
if df1["stock"][row_pointer_head]== df1["stock"][row_pointer_tail] and df1["deal"][row_pointer_tail] =="sell" and found[row_pointer_tail] == 0:
found[row_pointer_tail] = 1
id[row_pointer_tail]= counter
break
df1 = df1.assign(id = id)
return df1
print(sequential_buy_sell_id_generator(df1))
输出:
stock deal ID
0 A buy 1.0
1 B buy 2.0
2 C buy 3.0
3 A sell 1.0
4 C sell 3.0
5 A buy 4.0
6 A sell 4.0
enter code here
stock deal id
0 A buy 1
1 B buy 2
2 C buy 3
3 A sell 1
4 C sell 3
5 A buy 4
6 A sell 4
另一个例子:
For df1 = pd.DataFrame({'stock': ['A', 'B', 'C', 'A','C', 'A', 'A'],
'deal': ['buy', 'buy', 'buy', 'buy','sell', 'sell', 'sell']})
stock deal ID
0 A buy 1
1 B buy 2
2 C buy 3
3 A buy 4
4 C sell 3
5 A sell 1
6 A sell 4
没有数量,这是一个徒劳的目标。例如,一个人可以在今天购买A股,明天再购买更多,然后在第三天全部卖出。或者在再次买入之前卖出一半头寸。或者你可以通过卖空来打开一个头寸。这只是一个简单的例子,原始的df包含了你提到的内容。我已经办妥了。好评论!那么你可能应该根据累计数量为零的时间来确定你的标识符。你能添加一个例子作为答案吗,我不确定我是否能理解。很高兴upvoteI可以稍后添加一个。对于数据df1=pd.DataFrame({'stock':['a','B','C','a','C','C','a','deal':[“买”、“买”、“买”、“买”、“卖”、“卖”]],输出是:股票交易ID 0 A buy 1.0 1 B buy 2.0 2 C buy 3.0 3 A buy 4.0 4 C sell 3.0 5 A sell 4.0 6 A sell 4.0,这是错误的。是的,按交易类型排序交易不适用于此代码,但如果按时间戳排序交易,则会起作用。啊,非常好的Mahir.Trouted,结果不同。对你来说最后一个示例结果是:打印(顺序买入卖出id生成器(df1))股票交易id 0 A买入1 B买入2 C买入3 A买入4 C卖出0 5 A卖出0 6 A卖出0第二个“如果”后面的代码中存在缩进错误子句,在stackoverflow中上载代码时发生。请立即查看代码在本笔记本中查找代码: