【问题标题】:make correlation plot on time series data in python在python中制作时间序列数据的相关图
【发布时间】:2021-02-03 19:04:25
【问题描述】:

我想查看时间序列数据中滚动周的相关性。原因是我想看看滚动相关性每年如何变化。为此,我尝试使用pandas.corr()pandas.rolling_corr() 内置函数来获取滚动相关并尝试制作折线图,但我无法更正相关折线图。我不知道我应该如何聚合时间序列以获得滚动相关折线图。有谁知道在python中这样做的任何方法?是否有任何解决方法可以从熊猫中的时间序列数据中获取滚动相关折线图?有什么想法吗?

我的尝试

我尝试使用pandas.corr() 获得相关性,但生成滚动相关性折线图没有帮助。所以,这是我的新尝试,但它不起作用。我想我应该考虑正确的数据聚合方式来制作滚动相关折线图。

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

url = 'https://gist.githubusercontent.com/adamFlyn/eb784c86c44fd7ed3f2504157a33dc23/raw/79b6aa4f2e0ffd1eb626dffdcb609eb2cb8dae48/corr.csv'
df = pd.read_csv(url)
df['date'] = pd.to_datetime(df['date'])

def get_corr(df, window=4):
    dfs = []
    for key, value in df:
        value["ROLL_CORR"] = pd.rolling_corr(value["prod_A_price"],value["prod_B_price"], window)
        dfs.append(value)
    df_final = pd.concat(dfs)
    return df_final

corr_df = get_corr(df, window=12)

fig, ax = plt.subplots(figsize=(7, 4), dpi=144)
sns.lineplot(x='week', y='ROLL_CORR', hue='year', data=corr_df,alpha=.8)
plt.show()
plt.close()

这样做对我不起作用。通过这样做,我想看看滚动相关性每年如何变化。谁能指出我可以从python中的时间序列数据中做滚动相关折线图吗?有什么想法吗?

期望的输出

这是我想要得到的desired rolling correlation line chart。请注意,所需的绘图是从 MS excel 生成的。我想知道在python中有没有可能的方法?是否有任何解决方法可以从 python 中的时间序列数据中获取滚动相关折线图?我应该如何纠正我当前的尝试以获得所需的输出?有什么想法吗?

【问题讨论】:

    标签: python pandas matplotlib


    【解决方案1】:

    以您的代码和描述为起点。 Panda 的Rolling 类有一个可以利用的apply 函数(https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.window.rolling.Rolling.apply.html#pandas.core.window.rolling.Rolling.apply)

    要使代码正常工作涉及两个技巧:

    1. 访问应用函数中的整行 (Pandas rolling apply using multiple columns)
    2. 我们在 pandas.Series(此处为 df['week'])上调用 rolling 函数以避免每列执行一次应用函数
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    url = 'https://gist.githubusercontent.com/adamFlyn/eb784c86c44fd7ed3f2504157a33dc23/raw/79b6aa4f2e0ffd1eb626dffdcb609eb2cb8dae48/corr.csv'
    df = pd.read_csv(url)
    
    def get_corr(ser):
        rolling_df = df.loc[ser.index]
        return rolling_df['prod_A_price'].corr(rolling_df['prod_B_price'])
    
    df['ROLL_CORR'] = df['week'].rolling(4).apply(get_corr)
    
    number_years = 3
    for week, df_week in df.groupby('week'):
        df = df.append({
            'week': week,
            'year': f'{number_years} year avg',
            'ROLL_CORR': df_week.sort_values(by='date').head(number_years)['ROLL_CORR'].mean()
        }, ignore_index=True)
    
    fig, ax = plt.subplots(figsize=(7, 4), dpi=144)
    sns.lineplot(x='week', y='ROLL_CORR', hue='year', data=df,alpha=.8)
    plt.show()
    plt.close()
    

    You'll find here the generated image by seaborn

    With the 3 year average

    【讨论】:

    • 我们如何像我在所需输出中显示的那样相应地添加 3 年平均相关性?
    • @Adam 请在上面的帖子中查看我的编辑。您可以使用number_years 变量来选择要平均多少年。这段代码不是最漂亮的,但它应该可以很好地完成工作。
    • 我认为仍然存在获得 3 年平均相关性的问题,即使输出看起来像预期的输出也是有问题的。
    • 例如,如果将年数更改为 2 或 4,情节仍然相同。我认为目前的尝试是不正确的。
    猜你喜欢
    • 2018-03-05
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2020-07-11
    • 2021-11-05
    • 2021-04-20
    • 2021-10-22
    相关资源
    最近更新 更多