Значения задержки и различия в кадре данных pandas с отсутствующими квартальными данными

Хотя у Pandas есть функциональные возможности временных рядов, я все еще борюсь с кадрами данных, которые содержат неполные данные временных рядов.

Смотрите рисунки ниже, на нижнем изображении есть полные данные, на верхнем есть пробелы. На обоих фото указаны правильные значения. Красным цветом показаны столбцы, которые я хочу рассчитать, используя данные черного цвета. Столбец Cumm_Issd показывает накопленное количество выпущенных акций в течение года, MV - рыночная стоимость.

Я хочу рассчитать количество выпущенных акций за квартал (IssdQtr), ежеквартальное изменение рыночной стоимости (D_MV_Q) и MV прошлого года (L_MV_Y).

Базовые данные cvs см. по этой ссылке для полных данных и по этой ссылка для пробелов в данных. Есть две фирмы 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)

Пропущенные данные:

введите здесь описание изображения

Полные данные:

введите здесь описание изображения


person Martien Lubberink    schedule 20.03.2017    source источник
comment
Что вы хотите делать со своими расчетами, когда есть пробелы? Подходит ли вам pd.DataFrame.fillna(method='ffill') вариант?   -  person Aleksey Bilogur    schedule 20.03.2017
comment
Пробелы должны быть NaN   -  person Martien Lubberink    schedule 20.03.2017
comment
Может тогда тебе сойдет с рук dfg.groupby(['Firm'])['MV']..fillna(np.nan).shift(4). pandas автоматически распространяет значения NaN в операциях, подобных этой.   -  person Aleksey Bilogur    schedule 20.03.2017


Ответы (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')
person Martien Lubberink    schedule 26.03.2017
comment
В качестве альтернативы задайте этот вопрос: stackoverflow. com/questions/23664877/ - person Martien Lubberink; 09.12.2017