【问题标题】:Subtract specific rows in Pandas, belonging to the same group of date减去 Pandas 中属于同一组日期的特定行
【发布时间】:2021-07-06 20:54:45
【问题描述】:

我正在尝试计算固定日期之间熊猫股票价格的差异,比如说“23.05.2021”和直到今天的所有其他日子。但是不知道如何以最简单的方式为每只股票做到这一点?可能我应该为每个股票和日期使用 groupby 或过滤器,然后有所作为?请在此处查看 df dataframe that I have

import pandas as pd
df = pd.read_csv("my_stocks.csv")
df["difference"] = ??
print(df)

   Stock       Date        Open       Close        High         Low

0    PEP 2021-06-23  146.059998  144.850006  146.130005  144.830002
1    PEP 2021-06-24  144.860001  145.669998  145.940002  144.610001
2    PEP 2021-06-25  145.759995  146.410004  146.789993  145.240005
3    PEP 2021-06-28  146.759995  147.039993  147.589996  146.619995
4    PEP 2021-06-29  147.449997  146.940002  147.699997  146.399994
5    PEP 2021-06-30  147.429993  148.169998  148.309998  147.199997
6    PEP 2021-07-01  148.080002  148.199997  149.080002  147.940002
7    PEP 2021-07-02  148.899994  148.910004  149.779999  148.559998
8     KO 2021-06-23   54.560001   54.119999   54.599998   54.110001
9     KO 2021-06-24   54.259998   54.389999   54.419998   54.000000
10    KO 2021-06-25   54.240002   54.320000   54.470001   54.009998
11    KO 2021-06-28   54.250000   54.259998   54.369999   54.000000
12    KO 2021-06-29   54.130001   53.860001   54.340000   53.720001
13    KO 2021-06-30   53.799999   54.110001   54.180000   53.750000
14    KO 2021-07-01   54.340000   53.959999   54.480000   53.860001
15    KO 2021-07-02   54.000000   54.180000   54.450001   54.000000
16  INFY 2021-06-23   20.549999   20.690001   20.709999   20.520000
17  INFY 2021-06-24   21.350000   21.190001   21.450001   21.190001
18  INFY 2021-06-25   21.430000   21.250000   21.510000   21.129999

enter image description here

【问题讨论】:

  • 请编辑您的问题并粘贴数据框的实际文本输出,而不是图像链接。您还需要显示每个股票在给定日期 23.05.2021 的行中的值。
  • 您应该将日期设置为索引。然后它只是groupby('Stock'),您可以直接索引 23.05.2021 的价格并从您感兴趣的列中减去它。当您说“价格”时,您是指开盘/收盘/高/低还是所有这些列?
  • df.set_index('Date', inplace=True)
  • 您好,感谢您的回复。对不起,但不知道如何相应地编辑这篇文章。
  • 希望我能提供更多关于您想到的解决方案的详细信息 :) thx

标签: python pandas stock


【解决方案1】:

首先,将 Date 设置为索引会让您的生活更轻松:

df.set_index('Date', inplace=True)

这样更好,现在您可以直接按日期索引您的数据框:

>>> df
           Stock        Open       Close        High         Low
Date                                                            
2021-06-23   PEP  146.059998  144.850006  146.130005  144.830002
2021-06-24   PEP  144.860001  145.669998  145.940002  144.610001
2021-06-25   PEP  145.759995  146.410004  146.789993  145.240005

现在我们通常会这样做:

df.groupby('Stock', as_index=False).transform(lambda x: x-x['2021-06-23'])  # or whatever reference date you want

但是pandas 1.x seems to have an ongoing unfixed bug where df.groupby(..., as_index=False) gets ignored 所以我们丢失了“库存”列。所以解决方法是:

dfd = df.copy()
for stk in df['Stock'].unique():
    dfd.loc[dfd['Stock']==stk, ['Open','Close','High','Low']] -= dfd[dfd['Stock']==stk].loc['2021-06-23'] # or whatever reference date

>>> dfd
           Stock      Open     Close      High       Low
Date                                                    
2021-06-23   PEP       0.0       0.0       0.0       0.0
2021-06-24   PEP -1.199997  0.819992 -0.190003 -0.220001
2021-06-25   PEP -0.300003  1.559998  0.659988  0.410003
2021-06-28   PEP  0.699997  2.189987  1.459991  1.789993
2021-06-29   PEP  1.389999  2.089996  1.569992  1.569992
2021-06-30   PEP  1.369995  3.319992  2.179993  2.369995
2021-07-01   PEP  2.020004  3.349991  2.949997      3.11
2021-07-02   PEP  2.839996  4.059998  3.649994  3.729996
2021-06-23    KO       0.0       0.0       0.0       0.0
2021-06-24    KO -0.300003      0.27     -0.18 -0.110001
2021-06-25    KO -0.319999  0.200001 -0.129997 -0.100003
2021-06-28    KO -0.310001  0.139999 -0.229999 -0.110001
2021-06-29    KO     -0.43 -0.259998 -0.259998     -0.39
2021-06-30    KO -0.760002 -0.009998 -0.419998 -0.360001
2021-07-01    KO -0.220001     -0.16 -0.119998     -0.25
2021-07-02    KO -0.560001  0.060001 -0.149997 -0.110001
2021-06-23  INFY       0.0       0.0       0.0       0.0
2021-06-24  INFY  0.800001       0.5  0.740002  0.670001
2021-06-25  INFY  0.880001  0.559999  0.800001  0.609999

(请注意,我们使用-= 进行就地减法;本可以使用dfd.sub(...)。您可以通过其他方式执行此操作。)

【讨论】:

    猜你喜欢
    • 2020-04-26
    • 1970-01-01
    • 2018-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    相关资源
    最近更新 更多