MultiIndexなDataFrameの第一インデックス毎に累積和を求める

例えば、日時+αのMultiIndexなDataFrameで、日時毎の累積和を求める。

環境

  • pandas 1.5.2

import io
import pandas as pd

csv = """date,AM/PM,no
2022-01-01,AM,1
2022-01-01,PM,2
2022-01-02,AM,3
2022-01-02,PM,4
2022-02-01,AM,11
2022-02-01,PM,12
"""

df = pd.read_csv(io.StringIO(csv), index_col=[0, 1], parse_dates=[0])

df = (
    df
        .groupby(
            by=[
                pd.Grouper(level='date', freq='M'),
                'AM/PM'
            ]
        )
        .sum()
)

df['cumsum'] = (
    df
        .sort_values(by=['date', 'AM/PM'], ascending=[True, True])
        .groupby(level=0)
        .cumsum()
)

df
>>>
              no cumsum
date    AM/PM       
2022-01-31 AM 4 4
           PM 6 10
2022-02-28 AM 11 11
           PM 12 23

参考

SymPyで不等式を解く

solve_univariate_inequality()を使うのが良さそう。

環境

  • SymPy 1.11

import sympy as sp

x = sp.Symbol('x', nonnegative=True)
expr = x ** 2 + 4 * x + 4
threshold = 9

sp.solve_univariate_inequality(expr >= threshold, x, relational=False, continuous=True)

> (−∞,−5]∪[1,∞)

domainを使うことで、正数範囲のみを指定できたりする。

import sympy as sp

x = sp.Symbol('x', nonnegative=True)
expr = x ** 2 + 4 * x + 4
threshold = 9
domain = sp.Interval(0, sp.S.Infinity)

sp.solve_univariate_inequality(expr >= threshold, x, relational=False, continuous=True, domain=domain)

> [1,∞)

参考