回答編集履歴
4
c
test
CHANGED
@@ -114,6 +114,10 @@
|
|
114
114
|
|
115
115
|
"""
|
116
116
|
|
117
|
+
# 列 lamp の区間と列 correct_time の区間のすべての組み合わせにおいて、
|
118
|
+
|
119
|
+
# 共通部分を計算し、その和集合をとる。
|
120
|
+
|
117
121
|
overlaps = sy.EmptySet()
|
118
122
|
|
119
123
|
for i1, i2 in itertools.product(row["lamp"], row["correct_time"]):
|
3
d
test
CHANGED
@@ -114,45 +114,17 @@
|
|
114
114
|
|
115
115
|
"""
|
116
116
|
|
117
|
-
overlaps =
|
117
|
+
overlaps = sy.EmptySet()
|
118
118
|
|
119
119
|
for i1, i2 in itertools.product(row["lamp"], row["correct_time"]):
|
120
120
|
|
121
|
-
|
121
|
+
overlaps += i1 & i2
|
122
122
|
|
123
|
-
|
123
|
+
# Union の場合は、Interval のリストとして返す。
|
124
124
|
|
125
|
-
|
125
|
+
# 区間が1つの場合でも Interval のリストとして返す。
|
126
126
|
|
127
|
-
|
128
|
-
|
129
|
-
return si
|
127
|
+
return overlaps.args if isinstance(overlaps, sy.Union) else [overlaps]
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
def simplify_intervals(intervals):
|
136
|
-
|
137
|
-
"""区間のリストを簡素化する。
|
138
|
-
|
139
|
-
例: [[200, 400), [400, 600)] -> [200, 600)
|
140
|
-
|
141
|
-
"""
|
142
|
-
|
143
|
-
union = sum(intervals, sy.EmptySet())
|
144
|
-
|
145
|
-
if isinstance(union, sy.Union):
|
146
|
-
|
147
|
-
# Union の場合は、Interval のリストとして返す。
|
148
|
-
|
149
|
-
return union.args
|
150
|
-
|
151
|
-
else:
|
152
|
-
|
153
|
-
# 区間が1つの場合でも Interval のリストとして返す。
|
154
|
-
|
155
|
-
return [union]
|
156
128
|
|
157
129
|
|
158
130
|
|
2
d
test
CHANGED
@@ -92,6 +92,22 @@
|
|
92
92
|
|
93
93
|
|
94
94
|
|
95
|
+
def intervals_to_str(intervals):
|
96
|
+
|
97
|
+
"""sympy.Interval を文字列に戻す。
|
98
|
+
|
99
|
+
例: [Interval.Ropen(111, 151), Interval.Ropen(412, 567)] -> "[(111 151) (412 567)]"
|
100
|
+
|
101
|
+
"""
|
102
|
+
|
103
|
+
str_intervals = [f"({i.left} {i.right})" for i in intervals]
|
104
|
+
|
105
|
+
return "[" + " ".join(str_intervals) + "]"
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
|
110
|
+
|
95
111
|
def calc_overlap(row):
|
96
112
|
|
97
113
|
"""列 lamp と列 correct_time の共通する区間のリストを返す。
|
@@ -142,22 +158,6 @@
|
|
142
158
|
|
143
159
|
|
144
160
|
|
145
|
-
def interval_to_str(intervals):
|
146
|
-
|
147
|
-
"""sympy.Interval を文字列に戻す。
|
148
|
-
|
149
|
-
例: [Interval.Ropen(111, 151), Interval.Ropen(412, 567)] -> "[(111 151) (412 567)]"
|
150
|
-
|
151
|
-
"""
|
152
|
-
|
153
|
-
str_intervals = [f"({i.left} {i.right})" for i in intervals]
|
154
|
-
|
155
|
-
return "[" + " ".join(str_intervals) + "]"
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
# csv ファイルを読み込む。
|
160
|
-
|
161
161
|
df = pd.read_csv(
|
162
162
|
|
163
163
|
"test.csv", converters={"lamp": str_to_intervals, "correct_time": str_to_intervals}
|
@@ -170,7 +170,7 @@
|
|
170
170
|
|
171
171
|
# sympy.Interval を文字列表現に戻す。
|
172
172
|
|
173
|
-
df = df.applymap(interval_to_str)
|
173
|
+
df = df.applymap(intervals_to_str)
|
174
174
|
|
175
175
|
# csv ファイルとして保存する。
|
176
176
|
|
1
d
test
CHANGED
@@ -22,9 +22,9 @@
|
|
22
22
|
|
23
23
|
|
24
24
|
|
25
|
-
1. pandas の read_csv() で csv ファイルを読み込む。
|
25
|
+
* 1. pandas の read_csv() で csv ファイルを読み込む。
|
26
|
-
|
26
|
+
|
27
|
-
2. 文字列をタプルのリストに変換する。
|
27
|
+
* 2. 文字列をタプルのリストに変換する。
|
28
28
|
|
29
29
|
```
|
30
30
|
|
@@ -32,11 +32,11 @@
|
|
32
32
|
|
33
33
|
```
|
34
34
|
|
35
|
-
3. タプルのリストを sympy.Interval のリストに変換する。
|
35
|
+
* 3. タプルのリストを sympy.Interval のリストに変換する。
|
36
|
-
|
36
|
+
|
37
|
-
4. 列 lamp と列 correct_time の共通する区間のリストを計算する。(集合の積)
|
37
|
+
* 4. 列 lamp と列 correct_time の共通する区間のリストを計算する。(集合の積)
|
38
|
-
|
38
|
+
|
39
|
-
5. sympy.Interval のリストを文字列に戻す。
|
39
|
+
* 5. sympy.Interval のリストを文字列に戻す。
|
40
40
|
|
41
41
|
|
42
42
|
|