繁体   English   中英

对 python 中的时间序列数据进行关联 plot

[英]make correlation plot on time series data in python

我想在时间序列数据中看到滚动周的相关性。 原因是我想看看滚动相关性每年如何变化。 To do so, I tried to use pandas.corr() , pandas.rolling_corr() built-in function for getting rolling correlation and tried to make line plot, but I couldn't correct the correlation line chart. 我不知道我应该如何聚合时间序列以获得滚动相关折线图。 有谁知道在 python 中这样做的任何方式? 是否有任何解决方法可以从 pandas 中的时间序列数据中获取滚动相关折线图? 任何想法?

我的尝试

我尝试使用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 中的时间序列数据中做滚动相关折线图吗? 有什么想法吗?

所需 output

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

使用您的代码和描述作为起点。 Panda's Rolling class has an apply function which can be leveraged ( https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.core.window.rolling.Rolling.apply.html#pandas.core. window.rolling.Rolling.apply )

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

  1. 访问应用的 function 中的整行( Pandas 滚动应用使用多列
  2. 我们在pandas.Series (此处为df['week'] )上调用rolling function 以避免每列应用一次 function
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()

您将在此处找到seaborn生成的图像

以 3 年平均值

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM