2017-03-20 90 views
0

儘管熊貓有時間序列功能,但我仍在努力處理具有不完整時間序列數據的數據幀。滯後值和大熊貓數據幀與缺失季度數據的差異

看下面的圖片,下面的圖片有完整的數據,上面有空白。兩張照片都顯示正確的值。紅色是我想用黑色數據計算的列。 Cumm_Issd列顯示年內累計已發行股數,MV爲市場價值。

我想要計算每個季度(IssdQtr)已發行股份,市值(D_MV_Q)的季度變化,去年(L_MV_Y)的MV

查看基礎CVS數據,該數據爲link,空位數據爲link。有兩家公司10201801020201

但是,當我嘗試使用Pandas shift方法時,如果有間隙,它會失敗,請嘗試使用下面的csv文件和代碼。所有列(DiffEq, Dif1MV, Lag4MV)分別與IssdQtr, D_MV_Q, L_MV_Y不同 - 對於某些季度。

有沒有辦法處理使用熊貓的數據差距?

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) 

跳空數據:

enter image description here

完整數據:

enter image description here

+1

你想在你計算時有差距,怎麼辦?是'pd.DataFrame.fillna(method ='ffill')'給你一個選項嗎? –

+0

缺口應該是NaN –

+0

也許你可以用'dfg.groupby(['Firm'])['MV'] .. fillna(np.nan).shift(4)''離開。 'pandas'自動在像這樣的操作中傳播NaN值。 –

回答

0

通過合併解決的基本問題。首先,創建一個顯示滯後日期或季度的變量。在這裏,我們希望去年的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') 
+0

或者按照這個問題:https://stackoverflow.com/questions/23664877/pandas-equivalent-of-oracle-lead-lag-function –