大熊猫数据框中两个值的长度之差之间的差异

时间:2019-11-27 07:25:22

标签: pandas shift stock

我正在尝试自动计算交易的盈亏。目前,我已将我的pandas daatframe设置为返回一个保留列,该列包含1,而purcahse处于活动状态,售出后为-1。 “价格”列记录了股票的价格,而“保留时间”和“计数”列则以两种不同的方式跟踪交易被持有了多长时间。

我正在努力做的是计算我赚了/亏了多少钱。我需要它来计算(以百分比为单位)购买价格(第一个非零值)和销售价(一系列的最后一个非零值)之间的差额。挑战来自可变长度的焦油,因此df.shift不起作用。

以下是样本数据集:

谢谢,如果不清楚,请询问

         Date   Hold  Price  Hold_Time   count
148  20190801     0   0.00          0       0
149  20190802     0   0.00          0       0
150  20190805     0   0.00          0       0
151  20190806     1  21.50          1       1
152  20190807     1  22.48          1       2
153  20190808     1  22.78          1       3
154  20190809     1  24.17          1       4
155  20190812     1  23.72          1       5
156  20190813    -1  23.39          0       0
157  20190814     0   0.00          0       0
158  20190815     0   0.00          0       0
159  20190816     0   0.00          0       0
160  20190819     0   0.00          0       0
161  20190820     0   0.00          0       0
162  20190821     0   0.00          0       0
163  20190822     0   0.00          0       0
164  20190823     1  24.80          1       1
165  20190826     1  24.00          1       2
166  20190827    -1  24.65          0       0
167  20190828     0      0          0       0
168  20190829     0      0          0       0

2 个答案:

答案 0 :(得分:0)

pd.groupby是您的朋友在这里,尽管有些round回。通过将值与0和先前的值进行比较,您可以使用它来获取每个单独的“持有”系列在单独的仓中-“ 0”系列还在此处创建了一个组,我们随后必须将其删除。

blocks = df["Price"].groupby(((df["Price"] != 0) != (df["Price"] != 0).shift()).cumsum())
buy_values = blocks.first()
buy_values = buy_values[buy_values != 0]
sell_values = blocks.last()
sell_values = sell_values[sell_values != 0]
difference = sell_values - buy_values
percent_difference = difference / buy_values * 100

这仅使用数据集的“价格”列。使用其他列可以使解决方案更容易/更清晰,但这应该可以满足您的要求!

答案 1 :(得分:0)

感谢您提供易于使用的数据集。考虑到它被命名为“数据”, 我提出以下解决方案

$( document ).ready(function() {
    $("#pr_id").keypress(function(){
      var inp = $(this).val();
      if(inp != ''){
         e.preventDefault(); 
        return false;
      }
    }); 
});