Python 熊猫在应用中有不一致的行为

Python 熊猫在应用中有不一致的行为,python,pandas,Python,Pandas,我有以下代码(在更广泛的代码库中),它本质上计算了一系列股票交易的平均买入价格。除了在price列中传递了一个float并且它似乎把代码弄乱了之外,代码按预期工作。渴望知道这里发生了什么-不理解为什么它与int一起工作而不是float。 我已经将问题隔离到合并中,但我不确定这是否是导致问题的原因 代码如下: 上述代码工作正常,并提供以下输出: Date Ticker Quantity Price Fees Direction CF CFBuy gro

我有以下代码(在更广泛的代码库中),它本质上计算了一系列股票交易的平均买入价格。除了在price列中传递了一个float并且它似乎把代码弄乱了之外,代码按预期工作。渴望知道这里发生了什么-不理解为什么它与int一起工作而不是float。 我已经将问题隔离到合并中,但我不确定这是否是导致问题的原因

代码如下:

上述代码工作正常,并提供以下输出:

                Date Ticker  Quantity  Price  Fees Direction   CF  CFBuy  grouping  AvgCostAdj
Ticker
FB     0  24/09/2020     FB        60     10    19       Buy -619   -619       0.0  -10.316667
GOOG   0  02/01/2020   GOOG        10     20    10       Buy -210   -210       0.0  -21.000000
                Date Ticker  Quantity  Price  Fees Direction     CF  CFBuy  grouping  AvgCostAdj
Ticker
FB     0  24/09/2020     FB        60   10.0    19       Buy -619.0 -619.0       0.0  -10.316667
GOOG   0  02/01/2020   GOOG        10   10.0    10       Buy -619.0 -619.0       0.0  -61.900000
如果我将输入数据帧的价格更改为浮动(如下所示),则输出不正确 进行以下更改:

trades_df = pd.DataFrame([
    ['02/01/2020', 'GOOG', 10, 20.0, 10, 'Buy'],
    ['24/09/2020', 'FB', 60, 10.0, 19, 'Buy'],
    ],
    columns=['Date', 'Ticker', 'Quantity', 'Price', 'Fees', 'Direction'])
这将导致以下输出:

                Date Ticker  Quantity  Price  Fees Direction   CF  CFBuy  grouping  AvgCostAdj
Ticker
FB     0  24/09/2020     FB        60     10    19       Buy -619   -619       0.0  -10.316667
GOOG   0  02/01/2020   GOOG        10     20    10       Buy -210   -210       0.0  -21.000000
                Date Ticker  Quantity  Price  Fees Direction     CF  CFBuy  grouping  AvgCostAdj
Ticker
FB     0  24/09/2020     FB        60   10.0    19       Buy -619.0 -619.0       0.0  -10.316667
GOOG   0  02/01/2020   GOOG        10   10.0    10       Buy -619.0 -619.0       0.0  -61.900000
正如您将看到的,GOOG平均成本为61.9美元,实际上应该是21美元。问题似乎围绕着价格变为10美元和CF变为-619美元

有趣的是,增加另一项交易(价格浮动)解决了这个问题。所以肯定是一个非常奇怪的边缘情况

抓挠我的头在这-渴望得到一些想法


谢谢

我运行了你的代码。结果如下。
GOOG 0 02/01/2020 GOOG 10 20 10购买-210-210 0.0-21.000000
Yes,没错。如果您按原样运行代码,它可以正常工作。如果你把价格改成浮动价格,它就会上涨。请看这里:如果您尝试调试它,您将看到输出在以下行之前和之后是不同的
df['grouping']=df['Quantity'].eq(0).shift().cumsum().fillna(0.)
这一行的作用是什么?基本上,这一行创建了一个名为grouping的新列,它根据股票的买卖时间对股票进行分组。假设1月份买入100股,2月份卖出100股,那就是零组。然后,如果同一只股票(股票代码)在今年晚些时候被购买,它将是第一组。需要注意的两件事是,删除除该行以外的所有内容,代码工作正常,所以我认为这不是问题所在。第二,在我的测试中,问题似乎出在合并行上(删除该行,一切都很好…),但在调试它时,我看不出哪里出了问题。。。我不明白的是为什么它在price中使用int值,而不是float。同样地,为什么它在每个组中有一个以上的交易时起作用。。。