【问题标题】:How to multiply 2 non-aligned Pandas series and receive the product-series with multi-index如何将 2 个未对齐的 Pandas 系列相乘并接收具有多索引的产品系列
【发布时间】:2020-07-18 02:38:30
【问题描述】:

我想从 installed_capacity_yearly * full_load_hours_quarterly 计算产生的风能。我有

installed_capacity_yearly = pd.Series(
    data=[12, 15, 21],
    index=[2020, 2021, 2022])

full_load_hours_quarterly = pd.Series(
    data=[900, 700, 600, 800], 
    index=['Q1', 'Q2', 'Q3', 'Q4'])

full_load_hours_quarterly“形状”应在 installed_capacity_yearly 中每年重复。预期的结果应该是这样的

quarterly_energy

year  quarter    volume
2020  Q1         10800
      Q2          8400
      Q3          7200
      Q4          9600
2021  Q1         13500
      Q2         10500
      Q3          9000
      Q4         12000
2022  Q1         18900
      Q2         14700
      Q3         12600
      Q4         16800

【问题讨论】:

    标签: python pandas series multi-index


    【解决方案1】:

    你可以使用dot:

    (installed_capacity_yearly.to_frame()
        .dot(full_load_hours_quarterly.to_frame().T)
        .stack()
    )
    

    输出:

    2020  Q1    10800
          Q2     8400
          Q3     7200
          Q4     9600
    2021  Q1    13500
          Q2    10500
          Q3     9000
          Q4    12000
    2022  Q1    18900
          Q2    14700
          Q3    12600
          Q4    16800
    dtype: int64
    

    【讨论】:

    • 干净的解决方案和pandas.DataFrame.dot 矩阵乘法的一个很好的用例。令我惊讶的是,这不适用于不同名称的系列,但我想人们可以忍受。
    • @Peter 可以通过将相同的name='dummy' 传递给to_frame() 来解决。
    【解决方案2】:

    通过两个索引值创建MultiIndex.from_product,然后使用Series.reindex,最后通过Series.mul创建多个:

    mux = pd.MultiIndex.from_product([installed_capacity_yearly.index, 
                                      full_load_hours_quarterly.index])
    s1 = installed_capacity_yearly.reindex(mux, level=0)
    s2 = full_load_hours_quarterly.reindex(mux, level=1)
    s = s1.mul(s2)
    print (s)
    2020  Q1    10800
          Q2     8400
          Q3     7200
          Q4     9600
    2021  Q1    13500
          Q2    10500
          Q3     9000
          Q4    12000
    2022  Q1    18900
          Q2    14700
          Q3    12600
          Q4    16800
    dtype: int64
    

    【讨论】:

    • 我的想法也朝着这个方向发展,但我更喜欢使用矩阵乘法的解决方案。然而,根据 PEP8,有人可能会争辩说“显式优于隐式”
    • @Peter - 性能怎么样?是否可以在真实数据中进行测试?
    • 每个循环有 10000 个循环 mul: 2.08 ms ± 333 µs per loop vs. `dot: 1.14 ms ± 25.1 µs per loop´。
    猜你喜欢
    • 2018-09-17
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2023-02-09
    • 2021-02-22
    • 2021-03-02
    相关资源
    最近更新 更多