如何缩放两个时间序列以匹配累积 pct 变化但保持其中一个的初始值

问题描述 投票:0回答:1

我有两个这样的时间序列:

import pandas as pd

df = pd.DataFrame({
    'A': [1, 3, 2, 5, 2, 8, 3],
    'B': [10, 33, 22, 39, 30, 66, 34],
})

df.A.plot(color="blue")
df.B.plot(color="orange")

我想将它们绘制在同一张图上以进行比较,因此我需要对它们进行缩放。 我想将 A 和比例 B 的值保持在与 A 相同的范围内。

所以它应该看起来像这样(除了我需要 A 的原始值在 y 轴上显示它们):

df.A.pct_change().fillna(0).cumsum().plot(color="blue")
df.B.pct_change().fillna(0).cumsum().plot(color="orange")

我试过,例如minmax 缩放,但这不起作用(至少我是怎么做的):

import matplotlib.pyplot as plt
from sklearn.preprocessing import minmax_scale

fig, ax = plt.subplots()
df.A.plot(color="blue", ax=ax)
pd.DataFrame(minmax_scale(X=df.B.values, feature_range=(df.A.min(), df.A.max()))).plot(color="orange", ax=ax)

我也尝试过,例如这个(但我的数学不起作用):

df.A.plot(color="blue")
d = df.A.iloc[-1] / df.B.iloc[-1]
(df.B * d).plot(color="orange")

ChatGPT 提出了这种方法,它朝着正确的方向发展,但它也不起作用:

pca = df.A.pct_change().fillna(0)
pcb = df.B.pct_change().fillna(0)
cpca = (1 + pca).cumprod() - 1
cpcb = (1 + pcb).cumprod() - 1
ratio = cpca.iloc[-1] / cpcb.iloc[-1]
scaled = pd.Series(df.B * ratio)
scaled = scaled.add(df.A.iloc[0]).values

我怎样才能做到这一点?

python pandas numpy time-series scale
1个回答
0
投票

这是一种方法:

from matplotlib import pyplot as plt

# Scale values between 0 and 1
scaled_cols = {col: df[col] / df[col].max() for col in ("A", "B")}

# Plot values
for column, color in zip(scaled_cols, ("blue", "orange")):
    plt.plot(scaled_cols[column], color=color, label=column)

# Change y axis tick labels
plt.yticks(
    ticks=scaled_cols["A"],
    labels=df["A"],
)
plt.ylabel("A values")
plt.legend(loc="upper left")

在 Jupyter notebook 中输出:

© www.soinside.com 2019 - 2024. All rights reserved.