【问题标题】:difference between two values in a pandas dataframe that are variable lengths apart熊猫数据框中两个不同长度的值之间的差异
【发布时间】:2019-11-27 07:25:22
【问题描述】:

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

我正在努力做的是计算我赚了/亏了多少钱。我需要它来计算(作为百分比)购买价格(第一个非零值)和销售值(一系列中的最后一个非零值)之间的差异。挑战来自 tardes 的长度可变,因此 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

【问题讨论】:

  • 您的真实数据集中的每笔交易是否都有唯一标识符?
  • 我不知道,我不知道我将如何去制作它
  • 那么你怎么知道什么交易/股票/股票赚了多少钱?还是每个数据集对特定股票都是唯一的
  • 每个数据集对股票来说都是唯一的

标签: pandas shift stock


【解决方案1】:

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

import pandas as pd
import numpy as np

data = pd.read_clipboard()

df = data.copy() # copy data on another dataframe

# keep only rows where you bought or sell:
df['transaction_id'] = df.Hold_Time - df.Hold_Time.shift()
df = df.query('transaction_id!=0').dropna()

# calculate profit/loss for each time you sold
df['profit'] = np.where(df.Hold == -1, df.Price - df.Price.shift(), 0)

# calculate total profit (or anything else you want, I hope it will be easy at this point) 
TOTAL_PROFIT = df.profit.sum()

【讨论】:

    【解决方案2】:

    pd.groupby 是您在这里的朋友,尽管方式有点迂回。您可以使用它通过将值与 0 和前一个值进行比较来将每个单独的“持有”系列放在单独的 bin 中 - “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
    

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

    【讨论】:

    • 我尝试了这个解决方案,并在尝试打印 percent_difference Price 2 -208.790698 4 -231.370968 6 -196.648045 时将其作为输出
    猜你喜欢
    • 2018-04-18
    • 2021-12-28
    • 1970-01-01
    • 2022-10-02
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 2020-08-05
    相关资源
    最近更新 更多