pandas 数据框中的滞后值和差异,缺少季度数据
Lag values and differences in pandas dataframe with missing quarterly data
虽然 Pandas 具有时间序列功能,但我仍在为具有不完整时间序列数据的数据帧而苦苦挣扎。
见下图,下图数据完整,上图有缺口。两张图片都显示正确的值。红色是我想使用黑色数据计算的列。 Cumm_Issd
列为当年累计发行股数,MV
为市值。
我想计算每个季度的已发行股票 (IssdQtr
)、市场价值的季度变化 (D_MV_Q
) 和去年的 MV
(L_MV_Y
).
查看底层 cvs 数据,link for the full data and this link 获取间隙数据。有两家公司 1020180
和 1020201
.
但是,当我尝试 Pandas shift
方法时,如果存在间隙,它会失败,请尝试使用 csv 文件和下面的代码。对于某些季度,所有列 (DiffEq, Dif1MV, Lag4MV
) 分别与 IssdQtr, D_MV_Q, L_MV_Y
不同。
有没有办法使用 Pandas 来处理数据中的差距?
import pandas as pd
import numpy as np
import os
dfg = pd.read_csv('example_soverflow_gaps.csv',low_memory=False)
dfg['date'] = pd.to_datetime(dfg['Period'], format='%Y%m%d')
dfg['Q'] = pd.DatetimeIndex(dfg['date']).to_period('Q')
dfg['year'] = dfg['date'].dt.year
dfg['DiffEq'] = dfg.sort_values(['Q']).groupby(['Firm','year'])['Cumm_Issd'].diff()
dfg['Dif1MV'] = dfg.groupby(['Firm'])['MV'].diff(1)
dfg['Lag4MV'] = dfg.groupby(['Firm'])['MV'].shift(4)
差距数据:
完整数据:
使用合并解决了基本问题。首先,创建一个显示滞后日期或季度的变量。这里我们要去年的 MV(4 个季度后):
from pandas.tseries.offsets import QuarterEnd
dfg['lagQ'] = dfg['date'] + QuarterEnd(-4)
然后用键(公司和日期)和相关变量(这里是 MV)创建一个数据框。
lagset=dfg[['Firm','date', 'MV']].copy()
lagset.rename(columns={'MV':'Lag_MV', 'date':'lagQ'}, inplace=True)
最后,将新框架合并到现有框架中:
dfg=pd.merge(dfg, lagset, on=['Firm', 'lagQ'], how='left')
虽然 Pandas 具有时间序列功能,但我仍在为具有不完整时间序列数据的数据帧而苦苦挣扎。
见下图,下图数据完整,上图有缺口。两张图片都显示正确的值。红色是我想使用黑色数据计算的列。 Cumm_Issd
列为当年累计发行股数,MV
为市值。
我想计算每个季度的已发行股票 (IssdQtr
)、市场价值的季度变化 (D_MV_Q
) 和去年的 MV
(L_MV_Y
).
查看底层 cvs 数据,link for the full data and this link 获取间隙数据。有两家公司 1020180
和 1020201
.
但是,当我尝试 Pandas shift
方法时,如果存在间隙,它会失败,请尝试使用 csv 文件和下面的代码。对于某些季度,所有列 (DiffEq, Dif1MV, Lag4MV
) 分别与 IssdQtr, D_MV_Q, L_MV_Y
不同。
有没有办法使用 Pandas 来处理数据中的差距?
import pandas as pd
import numpy as np
import os
dfg = pd.read_csv('example_soverflow_gaps.csv',low_memory=False)
dfg['date'] = pd.to_datetime(dfg['Period'], format='%Y%m%d')
dfg['Q'] = pd.DatetimeIndex(dfg['date']).to_period('Q')
dfg['year'] = dfg['date'].dt.year
dfg['DiffEq'] = dfg.sort_values(['Q']).groupby(['Firm','year'])['Cumm_Issd'].diff()
dfg['Dif1MV'] = dfg.groupby(['Firm'])['MV'].diff(1)
dfg['Lag4MV'] = dfg.groupby(['Firm'])['MV'].shift(4)
差距数据:
完整数据:
使用合并解决了基本问题。首先,创建一个显示滞后日期或季度的变量。这里我们要去年的 MV(4 个季度后):
from pandas.tseries.offsets import QuarterEnd
dfg['lagQ'] = dfg['date'] + QuarterEnd(-4)
然后用键(公司和日期)和相关变量(这里是 MV)创建一个数据框。
lagset=dfg[['Firm','date', 'MV']].copy()
lagset.rename(columns={'MV':'Lag_MV', 'date':'lagQ'}, inplace=True)
最后,将新框架合并到现有框架中:
dfg=pd.merge(dfg, lagset, on=['Firm', 'lagQ'], how='left')