Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions benchmarks/pandas/bench_advance_date_fn.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
"""
Benchmark: pandas DateOffset arithmetic — date frequency parsing and advancement.
Mirrors tsb advanceDate / parseFreq.
Outputs JSON: {"function": "advance_date_fn", "mean_ms": ..., "iterations": ..., "total_ms": ...}
"""
import json
import time
import pandas as pd

WARMUP = 5
ITERATIONS = 1000

d = pd.Timestamp("2023-06-15")
offsets = [
pd.DateOffset(days=1),
pd.DateOffset(days=3),
pd.offsets.BDay(1),
pd.offsets.Week(1),
pd.offsets.MonthBegin(1),
pd.offsets.MonthEnd(1),
pd.DateOffset(hours=1),
pd.DateOffset(hours=2),
pd.DateOffset(minutes=1),
pd.offsets.YearBegin(1),
]

for _ in range(WARMUP):
for off in offsets:
d + off
pd.Timestamp("2023-01-01")
pd.Timestamp(1672531200000, unit="ms")

t0 = time.perf_counter()
for _ in range(ITERATIONS):
for off in offsets:
d + off
pd.Timestamp("2023-01-01")
pd.Timestamp(1672531200000, unit="ms")
total = (time.perf_counter() - t0) * 1000

print(json.dumps({
"function": "advance_date_fn",
"mean_ms": round(total / ITERATIONS, 3),
"iterations": ITERATIONS,
"total_ms": round(total, 3),
}))
42 changes: 42 additions & 0 deletions benchmarks/pandas/bench_any_all_reduce_na.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"""
Benchmark: Series.any() / all() / DataFrame.any() / all() — boolean reductions.
Outputs JSON: {"function": "any_all_reduce_na", "mean_ms": ..., "iterations": ..., "total_ms": ...}
"""
import json
import time
import numpy as np
import pandas as pd

SIZE = 100_000
ROWS = 10_000
WARMUP = 5
ITERATIONS = 100

bool_data = np.arange(SIZE) % 3 != 0
s = pd.Series(bool_data)
df = pd.DataFrame({
"a": np.arange(ROWS) % 2 == 0,
"b": np.arange(ROWS) > ROWS // 2,
"c": np.ones(ROWS, dtype=bool),
})

for _ in range(WARMUP):
s.any()
s.all()
df.any()
df.all()

start = time.perf_counter()
for _ in range(ITERATIONS):
s.any()
s.all()
df.any()
df.all()
total = (time.perf_counter() - start) * 1000

print(json.dumps({
"function": "any_all_reduce_na",
"mean_ms": total / ITERATIONS,
"iterations": ITERATIONS,
"total_ms": total,
}))
39 changes: 39 additions & 0 deletions benchmarks/pandas/bench_dataframe_diff_shift_fn.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
"""
Benchmark: pandas DataFrame.diff() / DataFrame.shift() — discrete difference and shift.
Outputs JSON: {"function": "dataframe_diff_shift_fn", "mean_ms": ..., "iterations": ..., "total_ms": ...}
"""
import json
import time
import pandas as pd
import numpy as np

SIZE = 100_000
WARMUP = 5
ITERATIONS = 20

df = pd.DataFrame({
"a": np.arange(SIZE, dtype=float),
"b": np.sin(np.arange(SIZE) * 0.01) * 100,
"c": np.arange(SIZE) * 2.5,
})

for _ in range(WARMUP):
df.diff()
df.diff(periods=3)
df.shift(1)
df.shift(-2)

start = time.perf_counter()
for _ in range(ITERATIONS):
df.diff()
df.diff(periods=3)
df.shift(1)
df.shift(-2)
total = (time.perf_counter() - start) * 1000

print(json.dumps({
"function": "dataframe_diff_shift_fn",
"mean_ms": round(total / ITERATIONS, 3),
"iterations": ITERATIONS,
"total_ms": round(total, 3),
}))
37 changes: 37 additions & 0 deletions benchmarks/pandas/bench_dataframe_ffill_bfill_fn.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
"""
Benchmark: pandas DataFrame.ffill() / DataFrame.bfill() — forward/backward fill.
Outputs JSON: {"function": "dataframe_ffill_bfill_fn", "mean_ms": ..., "iterations": ..., "total_ms": ...}
"""
import json
import time
import pandas as pd
import numpy as np

SIZE = 100_000
WARMUP = 5
ITERATIONS = 20

df = pd.DataFrame({
"a": [float("nan") if i % 5 == 0 else i * 0.1 for i in range(SIZE)],
"b": [float("nan") if i % 7 == 0 else i * 2.0 for i in range(SIZE)],
"c": [float("nan") if i % 3 == 0 else i * 0.5 for i in range(SIZE)],
})

for _ in range(WARMUP):
df.ffill()
df.bfill()
df.ffill(limit=3)

start = time.perf_counter()
for _ in range(ITERATIONS):
df.ffill()
df.bfill()
df.ffill(limit=3)
total = (time.perf_counter() - start) * 1000

print(json.dumps({
"function": "dataframe_ffill_bfill_fn",
"mean_ms": round(total / ITERATIONS, 3),
"iterations": ITERATIONS,
"total_ms": round(total, 3),
}))
32 changes: 32 additions & 0 deletions benchmarks/pandas/bench_date_range_fn.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
"""
Benchmark: pandas.date_range() — generate a fixed-frequency date sequence.
Outputs JSON: {"function": "date_range_fn", "mean_ms": ..., "iterations": ..., "total_ms": ...}
"""
import json
import time
import pandas as pd

WARMUP = 5
ITERATIONS = 100

start = "2020-01-01"
end = "2022-12-31"

for _ in range(WARMUP):
pd.date_range(start=start, end=end, freq="D")
pd.date_range(start=start, periods=365, freq="D")
pd.date_range(start=start, periods=24, freq="h")

t0 = time.perf_counter()
for _ in range(ITERATIONS):
pd.date_range(start=start, end=end, freq="D")
pd.date_range(start=start, periods=365, freq="D")
pd.date_range(start=start, periods=24, freq="h")
total = (time.perf_counter() - t0) * 1000

print(json.dumps({
"function": "date_range_fn",
"mean_ms": round(total / ITERATIONS, 3),
"iterations": ITERATIONS,
"total_ms": round(total, 3),
}))
30 changes: 30 additions & 0 deletions benchmarks/pandas/bench_date_range_stats_na.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
"""
Benchmark: pd.date_range — generate date arrays with various frequencies.
Outputs JSON: {"function": "date_range_stats_na", "mean_ms": ..., "iterations": ..., "total_ms": ...}
"""
import json
import time
import pandas as pd

WARMUP = 5
ITERATIONS = 100

start_ = "2020-01-01"
end_ = "2022-12-31"

for _ in range(WARMUP):
pd.date_range(start=start_, end=end_, freq="D")
pd.date_range(start=start_, periods=365, freq="D")

start = time.perf_counter()
for _ in range(ITERATIONS):
pd.date_range(start=start_, end=end_, freq="D")
pd.date_range(start=start_, periods=365, freq="D")
total = (time.perf_counter() - start) * 1000

print(json.dumps({
"function": "date_range_stats_na",
"mean_ms": total / ITERATIONS,
"iterations": ITERATIONS,
"total_ms": total,
}))
40 changes: 40 additions & 0 deletions benchmarks/pandas/bench_date_utils_na.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
"""
Benchmark: date parsing utilities — equivalent to advanceDate / parseFreq / toDateInput.
Outputs JSON: {"function": "date_utils_na", "mean_ms": ..., "iterations": ..., "total_ms": ...}
"""
import json
import time
import pandas as pd
from datetime import datetime

WARMUP = 5
ITERATIONS = 200

d = pd.Timestamp("2023-06-15")

for _ in range(WARMUP):
pd.tseries.frequencies.to_offset("D")
pd.tseries.frequencies.to_offset("MS")
d + pd.tseries.frequencies.to_offset("D")
d + pd.tseries.frequencies.to_offset("MS")
d + pd.tseries.frequencies.to_offset("QS")
pd.Timestamp("2023-06-15")
pd.Timestamp(1686787200000, unit="ms")

start = time.perf_counter()
for _ in range(ITERATIONS):
pd.tseries.frequencies.to_offset("D")
pd.tseries.frequencies.to_offset("MS")
d + pd.tseries.frequencies.to_offset("D")
d + pd.tseries.frequencies.to_offset("MS")
d + pd.tseries.frequencies.to_offset("QS")
pd.Timestamp("2023-06-15")
pd.Timestamp(1686787200000, unit="ms")
total = (time.perf_counter() - start) * 1000

print(json.dumps({
"function": "date_utils_na",
"mean_ms": total / ITERATIONS,
"iterations": ITERATIONS,
"total_ms": total,
}))
35 changes: 35 additions & 0 deletions benchmarks/pandas/bench_diff_shift_df_na.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
"""
Benchmark: DataFrame.diff() / shift() — diff and shift on 10k-row DataFrame.
Outputs JSON: {"function": "diff_shift_df_na", "mean_ms": ..., "iterations": ..., "total_ms": ...}
"""
import json
import time
import numpy as np
import pandas as pd

ROWS = 10_000
WARMUP = 5
ITERATIONS = 50

df = pd.DataFrame({
"a": np.arange(ROWS) * 2.0,
"b": np.arange(ROWS) * 3.0,
"c": np.arange(ROWS) * 0.5,
})

for _ in range(WARMUP):
df.diff(periods=1)
df.shift(periods=2)

start = time.perf_counter()
for _ in range(ITERATIONS):
df.diff(periods=1)
df.shift(periods=2)
total = (time.perf_counter() - start) * 1000

print(json.dumps({
"function": "diff_shift_df_na",
"mean_ms": total / ITERATIONS,
"iterations": ITERATIONS,
"total_ms": total,
}))
36 changes: 36 additions & 0 deletions benchmarks/pandas/bench_ffill_bfill_df_na.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
"""
Benchmark: DataFrame.ffill() / bfill() — forward/backward fill on 10k-row DataFrame.
Outputs JSON: {"function": "ffill_bfill_df_na", "mean_ms": ..., "iterations": ..., "total_ms": ...}
"""
import json
import time
import numpy as np
import pandas as pd

ROWS = 10_000
WARMUP = 5
ITERATIONS = 50

data = {}
for col, offset in zip("abcde", range(5)):
arr = np.arange(ROWS, dtype=float) + offset
arr[::10] = np.nan
data[col] = arr
df = pd.DataFrame(data)

for _ in range(WARMUP):
df.ffill()
df.bfill()

start = time.perf_counter()
for _ in range(ITERATIONS):
df.ffill()
df.bfill()
total = (time.perf_counter() - start) * 1000

print(json.dumps({
"function": "ffill_bfill_df_na",
"mean_ms": total / ITERATIONS,
"iterations": ITERATIONS,
"total_ms": total,
}))
33 changes: 33 additions & 0 deletions benchmarks/pandas/bench_ffill_bfill_series_na.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
"""
Benchmark: Series.ffill() / bfill() — forward/backward fill on 100k-element Series.
Outputs JSON: {"function": "ffill_bfill_series_na", "mean_ms": ..., "iterations": ..., "total_ms": ...}
"""
import json
import time
import numpy as np
import pandas as pd

SIZE = 100_000
WARMUP = 5
ITERATIONS = 50

data = np.arange(SIZE, dtype=float) * 1.5
data[::10] = np.nan
s = pd.Series(data)

for _ in range(WARMUP):
s.ffill()
s.bfill()

start = time.perf_counter()
for _ in range(ITERATIONS):
s.ffill()
s.bfill()
total = (time.perf_counter() - start) * 1000

print(json.dumps({
"function": "ffill_bfill_series_na",
"mean_ms": total / ITERATIONS,
"iterations": ITERATIONS,
"total_ms": total,
}))
Loading
Loading