如何计算不同长度多站点同物品时间序列的相关系数
问题描述
现有包含站点(site)、物品(item)、日期(date)、数量(quantity)的DataFrame示例代码如下:
data = {'site': ['A', 'A', 'B', 'B', 'C', 'C'], 'item': ['x', 'x', 'x', 'x', 'x', 'x'], 'date': ['2023-03-01', '2023-03-10', '2023-03-20', '2023-03-27', '2023-03-5', '2023-03-12'], 'quantity': [10,20,30, 20, 30, 50]} df_sample = pd.DataFrame(data=data) df_sample.head()
需求是计算同一物品x下,站点A和站点B的quantity时间序列相关系数,但两者的时间序列长度不一样。目前已经拆分出两个子DataFrame:
df1 = df_sample[(df_sample['site'] == 'A') & (df_sample['item'] == 'x')] df2 = df_sample[(df_sample['site'] == 'B') & (df_sample['item'] == 'x')]
之后强行对齐长度来计算相关系数,现在想找更合理的解决办法。
更优解决方案
1. 先规整日期格式
首先得把日期列转成标准的datetime类型,不然像示例里2023-03-5这种不规范格式会影响后续对齐,同时筛选出需要的物品x和站点A、B的数据:
import pandas as pd # 转换日期为标准格式 df_sample['date'] = pd.to_datetime(df_sample['date']) # 筛选目标数据 target_df = df_sample[(df_sample['item'] == 'x') & (df_sample['site'].isin(['A', 'B']))]
2. 用透视表自动对齐时间序列
用透视表把站点A、B的quantity按日期列对齐,缺失的日期会自动补NaN,不用手动去凑长度:
aligned_df = target_df.pivot(index='date', columns='site', values='quantity')
3. 直接计算相关系数
用pandas自带的corr()方法就能直接算,默认会自动排除两个站点都没数据的行(只保留双方都有记录的日期来计算):
corr_value = aligned_df['A'].corr(aligned_df['B']) print(f"站点A和B的quantity相关系数:{corr_value}")
可选:填充缺失值再计算(如果需要完整时间序列)
要是不想丢弃缺失日期的记录,可以先填充NaN值(比如前向填充、后向填充或者均值填充),再算相关系数:
# 前向填充缺失值(用前一个日期的数值填充) filled_df = aligned_df.fillna(method='ffill') # 计算填充后的相关系数 filled_corr = filled_df['A'].corr(filled_df['B']) print(f"填充缺失值后的相关系数:{filled_corr}")
内容的提问来源于stack exchange,提问作者Wolfy
相关产品推荐
相关产品推荐

