Стойности на забавяне и разлики в рамката от данни на 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