【问题标题】:Lag values and differences in pandas dataframe with missing quarterly data缺少季度数据的熊猫数据框的滞后值和差异
【发布时间】:2017-08-11 05:19:05
【问题描述】:

虽然 Pandas 具有时间序列功能,但我仍然在处理时间序列数据不完整的数据帧。

见下图,下图数据完整,上图有缺口。两张图片都显示正确的值。红色是我想使用黑色数据计算的列。 Cumm_Issd栏为当年累计发行股数,MV为市值。

我想计算每季度的已发行股数 (IssdQtr)、市值的季度变化 (D_MV_Q) 和去年的MV (L_MV_Y)。

有关基础 cvs 数据,请参阅 link 获取完整数据,查看 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)

差距数据:

完整数据:

【问题讨论】:

  • 当有差距时,你想对你的计算做什么? pd.DataFrame.fillna(method='ffill') 适合您吗?
  • 间隙应该是NaN
  • 也许你可以摆脱dfg.groupby(['Firm'])['MV']..fillna(np.nan).shift(4)。 pandas 在类似这样的操作中自动传播 NaN 值。

标签: python pandas dataframe time-series financial


【解决方案1】:

通过使用合并解决了基本问题。首先,创建一个显示滞后日期或季度的变量。这里我们想要去年的 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')

【讨论】:

猜你喜欢
  • 2017-08-10
  • 2017-12-30
  • 2017-06-22
  • 2020-08-17
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2022-10-07
  • 2021-12-18
相关资源
最近更新 更多