首页 > 解决方案 > 在 Python 中的数据框中查找定期记录

问题描述

ID 代表一个实体,交易发生的日期以美元计。

我想检查每个 ID 是否定期发生交易。如果是,那么周期性是什么?15 天、20 天、45 天...等(+- 10 个时间增量的周期性变化)

另一个复杂性是,如果交易也有一些额外的随机交易,那么我将如何识别周期性?

我想避免循环,因为如果记录以百万计,它会花费太长时间。

请检查图像的数据

  [1]: https://i.stack.imgur.com/UL2Zs.jpg

下面是我创建的代码。我只检查了最后几条记录。

它也采取了。

store_df=[]
for idr in df['ID'].unique():
   inside_df=df[df['ID']==idr]
   inside_df['day_before']= inside_df['date'].shift(1)
   inside_df=inside_df.fillna(method='bfill')
   inside_df['days_difference']=inside_df['date']-inside_df['day_before']
   inside_df['days_difference']=inside_df['days_difference'].apply(lambda x:x.days)
   store_df.append(inside_df)
   #print(idr)
store_df=pd.concat(store_df)
store_df.head()



limit=0.1
count=0
obj = {}
ID_list=[]
diff_days_list=[]

for i in range(2, 100):
    obj['l'+'_'+str(i)] = []
    for idr in store_dfr['ID'].unique()[0:]:    
        temp_df=store_dfr[store_dfr['ID']==idr]
        #temp_df=temp_df
        if (i*(1-limit))<temp_df['days_difference'].iloc[-1]<(i*(1+limit)):
            if (i*(1-limit))<temp_df['days_difference'].iloc[-2]<(i*(1+limit)):
                if ((i*(1-limit))<temp_df['days_difference'].iloc[-3]<(i*(1+limit))) or ((2*i*(1-limit))<temp_df['days_difference'].iloc[-3]<(2*i*(1+limit))):
                    obj['l'+'_'+str(i)].append(temp_df)
                    count=count+1
                    ID_list.append(idr)
                    diff_days_list.append(i)
        else:
            del temp_df        
print(count)
list(ID_list)
list(diff_days_list)

上面的代码只检查每个 ID 的最后几条记录。而且也不关心随机交易。

标签: python

解决方案


分两部分:

第一部分是创建行之间的差异:

#Assuming the data is in dataframe df

df2 = df
df2.sort(['ID', 'Date'], inplace=True)
df2['diffs'] = df2.groupby(['ID'])['Date'].transform(lambda x: x.diff())


第二部分是寻找相同ID的模式差异(有效地忽略潜在随机交易的陈述问题,前提是随机交易不太频繁[例如每个周期性交易之间的1次交易])

d2f = (df2.groupby('ID', as_index=False)
        .agg({'diffs': lambda x: x.mode()}))

推荐阅读