2017-03-20 2 views
0

Bien que Pandas ait des fonctionnalités de séries temporelles, je suis toujours aux prises avec des bases de données qui ont des données de séries temporelles incomplètes.Valeurs de décalage et différences dans les données pandas avec données trimestrielles manquantes

Voir les images ci-dessous, l'image inférieure a des données complètes, la partie supérieure a des lacunes. Les deux photos montrent des valeurs correctes. En rouge sont les colonnes que je veux calculer en utilisant les données en noir. Colonne Cumm_Issd montre les actions émises cumulées au cours de l'année, MV est la valeur marchande.

Je veux calculer les actions émises par trimestre (IssdQtr), la variation trimestrielle valeur marchande (D_MV_Q) et la MV de l'année dernière (L_MV_Y).

Voir pour les données cvs sous-jacentes ce link pour les données complètes et cette link pour les données gapped. Il y a deux entreprises 1020180 et 1020201.

Cependant, lorsque j'essaie la méthode Pandas shift, elle échoue quand il y a des lacunes, essayez-vous en utilisant les fichiers csv et le code ci-dessous. Toutes les colonnes (DiffEq, Dif1MV, Lag4MV) diffèrent - pour certains trimestres - de IssdQtr, D_MV_Q, L_MV_Y, respectivement.

Existe-t-il des moyens de gérer les lacunes dans les données à l'aide des 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) 

données Gapped:

enter image description here

Données complètes:

enter image description here

+1

Que voulez-vous faire avec vous des calculs quand il y a des lacunes? 'Pd.DataFrame.fillna (method = 'ffill')' est-il une option pour vous? –

+0

Les espaces doivent être NaN –

+0

Peut-être que vous pouvez vous en sortir avec 'dfg.groupby (['Firm']) ['MV'] .. fillna (np.nan) .shift (4)' alors. 'pandas' propage automatiquement les valeurs NaN dans des opérations comme celle-ci. –

Répondre

0

résolu le problème de base à l'aide d'une fusion. Commencez par créer une variable indiquant la date ou le trimestre décalé. Ici, nous voulons MV l'an dernier (4 quarts arrière):

from pandas.tseries.offsets import QuarterEnd 
dfg['lagQ'] = dfg['date'] + QuarterEnd(-4) 

Créez ensuite une trame de données avec les touches (ferme et date) et la variable correspondante (ici MV).

lagset=dfg[['Firm','date', 'MV']].copy() 
lagset.rename(columns={'MV':'Lag_MV', 'date':'lagQ'}, inplace=True) 

Enfin, fusionner le nouveau cadre dans l'existant:

dfg=pd.merge(dfg, lagset, on=['Firm', 'lagQ'], how='left') 
+0

Sinon, suivez cette question: https://stackoverflow.com/questions/23664877/pandas-equivalent-of-oracle-lead-lag-function –