python - 在 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 的最后几条记录。而且也不关心随机交易。
解决方案
分两部分:
第一部分是创建行之间的差异:
#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()}))
推荐阅读
- python - 我可以使用 python 脚本获取用户在登录 Maximo 时运行的查询吗?
- c# - 为什么 INotifyPropertyChanged 的 SetProperty() 方法需要一个 ref 参数?
- java - 如何通过对话框类中的 button-actionPerformed 从我的面板类中调用一个方法,得到它在面板类中的实例?
- sql-server - tSQLt 测试中的模拟和安全权限如何工作?
- css - 如何设置 CSS 网格以显示未知数量的动态数据
- html - 需要在悬停时更改网格中图像的图像
- javascript - 如何使用 Jest 测试同一类中的方法调用?
- javascript - 如何不制作 div 堆栈?
- javascript - 在 Vue 中的 axios 请求后更新关注状态
- java - SQLite 数据库游标返回错误的资源 ID