回答編集履歴

1

修正

2023/03/04 04:50

投稿

can110
can110

スコア38266

test CHANGED
@@ -1,10 +1,11 @@
1
1
 
2
2
  ID毎に、1,2または1,2以外の2種類の日付を昇順にキューで管理することで処理速度はあがると思います。
3
+ ただし、このコードでも200万行だとデータ分布にもよりますが数分はかかります。
3
4
  ```Python
4
-
5
5
  import pandas as pd
6
6
  from collections import deque
7
7
  from io import StringIO
8
+ from itertools import product
8
9
 
9
10
  s = """date,ID,no
10
11
  2022-01-01,1,1
@@ -17,6 +18,12 @@
17
18
  """
18
19
  df = pd.read_csv(StringIO(s), parse_dates=['date'])
19
20
 
21
+ # 2192000 rows
22
+ #data = product(pd.date_range('2020-01-01','2022-12-31'), range(100), range(20))
23
+ #df = pd.DataFrame(data=data, columns=['date','ID','no'])
24
+
25
+ print(df)
26
+
20
27
  # 古い日付を削除
21
28
  def remove(q,dt):
22
29
  while len(q) > 0:
@@ -27,8 +34,8 @@
27
34
  # (同日を除く)対象数を取得
28
35
  def count(q,dt):
29
36
  cnt = len(q)
30
- for i in range(cnt):
37
+ for i in reversed(q):
31
- if (dt - q[-(i+1)]).days >= 1:
38
+ if (dt - i).days >= 1:
32
39
  break
33
40
  cnt -= 1
34
41
  return cnt
@@ -55,7 +62,6 @@
55
62
 
56
63
 
57
64
  df = df.sort_values('date')
58
-
59
65
  que = {} # キー=ID, 値=[1,2以外の日付, 1,2の日付]
60
66
  df['ab'] = df.apply(func, axis=1)
61
67
  print(df)
@@ -70,4 +76,3 @@
70
76
  6 2022-08-01 1 1 (3, 2)
71
77
  """
72
78
  ```
73
-