【问题标题】:Difference between grouped sums for two different dates in multi-index pandas dataframe多索引熊猫数据框中两个不同日期的分组总和之间的差异
【发布时间】:2020-04-21 08:54:45
【问题描述】:

我有一个按三列分组的多索引DataFramedateTickerSecurity Description):

df.groupby(['date','Ticker', 'Security Description']).sum()

接下来我想计算今天(示例中为 2020 年 1 月 2 日)和昨天之间的差异 ,或者如果缺少昨天,则为昨天之前有数据的最接近的日期股票代码和证券描述。

这是我正在使用的示例数据:

df = {'transactionID': {0: 5, 1: 7, 2: 5, 3: 7, 4: 6, 5: 6},
 'date': {0: '1/1/2020',
  1: '1/1/2020',
  2: '1/2/2020',
  3: '1/2/2020',
  4: '12/31/2019',
  5: '1/2/2020'},
 'Dollar Gain': {0: 500, 1: 100, 2: -200, 3: -200, 4: -50, 5: 50},
 'Date': {0: '4/24/2018',
  1: '4/24/2018',
  2: '4/24/2018',
  3: '4/24/2018',
  4: '5/24/2019',
  5: '5/24/2019'},
 'Notional': {0: 5, 1: 10, 2: 5, 3: 10, 4: 1, 5: -1},
 'Ticker': {0: 'AAPL', 1: 'MCD', 2: 'AAPL', 3: 'MCD', 4: 'SBUX', 5: 'SBUX'},
 'Security Description': {0: 'AAPL Equity',
  1: 'MCD Equity',
  2: 'AAPL Equity',
  3: 'MCD Equity',
  4: 'SBUX Equity',
  5: 'SBUX Equity'},
 'Price': {0: 100.0, 1: 80.0, 2: 105.5, 3: 105.5, 4: 80.0, 5: 80.0}}
df = pd.DataFrame(df)

df.set_index('date', 'Ticker')
df.groupby(['date','Ticker', 'Security Description']).sum()

下面是我想要的代码输出。

  • 1/2/2020 AAPL 股票代码美元收益为 -200。 2020 年 1 月 1 日 AAPL 股票代码美元收益为 500。差值为 -700。
  • 对于 SBUX,由于 2020 年 1 月 1 日没有条目,因此使用 2019 年 12 月 31 日(2020 年 1 月 1 日之前的最接近日期)的值,因此 50-(-50)=100。

编辑

除了能够处理昨天(之前的观察)之外,您如何将解决方案推广到本月至今、年初至今以及任意两个自定义日期之间?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用diff 修复您的代码

    g=df.groupby(['date','Ticker', 'Security Description']).sum()
    ydf=g.groupby(level=1).apply(lambda x : x.diff().sum())
    Out[35]: 
            transactionID  Dollar Gain  Notional  Price
    Ticker                                             
    AAPL              0.0       -700.0       0.0    5.5
    MCD               0.0       -300.0       0.0   25.5
    SBUX              0.0       -100.0       2.0    0.0
    

    【讨论】:

    • 这不起作用。 SBUX 应该是 100 美元收益和 -2 名义上的。
    • 这也行不通,因为一个股票代码可能在同一日期有多个证券。可能存在与“AAPL 股票”共享相同代码的“AAPL 债务”证券描述。
    • @cpage 先排序你的日期~:-)
    • 排序处理第一条评论而不是第二条。
    • @cpagec g.groupby(level=[1,2]).apply(lambda x : x.diff().sum())
    猜你喜欢
    • 2018-04-18
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多