У меня есть список времени (секунд), который выглядит так:
l = [2,4,6,8,2,4,6,8,10,30,60,30,60]
2,4,6,8 — первый временной интервал.
2,4,6,8,10 второй временной интервал.
30,60 третий временной интервал.
30,60 четвертый временной интервал.
Я хотел бы создать совокупный список времени, как показано ниже, чтобы я мог построить данные:
l = [2,4,6,8,10,12,14,16,18,48,78,108,138]
Вы можете использовать алгоритм для разбивки l
на основе арифметических последовательностей, генерирования ожидаемого результата с помощью res += [res[-1] + prev_diff]
и, наконец, построения графика результата:
import matplotlib.pyplot as plt
def _sequences(L):
if len(L) < 3:
return L
start, parts = 0, []
prev_diff = L[1] - L[0]
D = {}
j = 0
res = [L[0]]
for i in range(1, len(L)):
curr_diff = L[i] - L[i - 1]
if prev_diff != curr_diff:
D[j] = prev_diff
j += 1
parts.append(L[start:i])
start = i
prev_diff = L[i + 1] - L[i] if i + 1 < len(L) else 0
res += [res[-1] + prev_diff]
parts.append(L[start:])
D[j] = prev_diff
return parts, D, res
L = [2, 4, 6, 8, 2, 4, 6, 8, 10, 30, 60, 30, 60]
parts, D, res = _sequences(L)
print(parts, D, res)
plt.plot(res, marker='o')
plt.xlabel("X")
plt.ylabel("Y")
plt.grid(True)
plt.show()
[[2, 4, 6, 8], [2, 4, 6, 8, 10], [30, 60], [30, 60]] {0: 2, 1: 2, 2: 30, 3: 30} [2, 4, 6, 8, 10, 12, 14, 16, 18, 48, 78, 108, 138]
Им дают список, который выглядит как l = [2,4,6,8,2,4,6,8,10,30,60,30,60]
, а не parts = [[2, 4, 6, 8], [2, 4, 6, 8, 10], [30, 60], [30, 60]]
Похоже, вы проигнорировали главную проблему в вопросе.
Код
сделать l
серии панд s
import pandas as pd
l = [2,4,6,8,2,4,6,8,10,30,60,30,60]
s = pd.Series(l)
с
0 2
1 4
2 6
3 8
4 2
5 4
6 6
7 8
8 10
9 30
10 60
11 30
12 60
dtype: int64
Ваша логика слишком неясна, чтобы предоставить код, решающий вашу проблему. Однако если предполагается, что каждая из ваших групп интервалов представляет собой один и тот же интервал и каждая группа имеет достаточное количество интервалов (как в вашем примере), вы можете попробовать код ниже.
grp = s.mul(2).eq(s.shift(-1)).cumsum()
out = s.add(grp.map(s.groupby(grp).max().cumsum().shift(fill_value=0))).tolist()
вне
[2, 4, 6, 8, 10, 12, 14, 16, 18, 48, 78, 108, 138]
Можете ли вы объяснить мне, как работают grp и out??
По какому правилу группируется? Другими словами, откуда вы знаете, что группы не
[(2,4,6,8), (2,4,6,8,10,30), (60), (30,60)]
или[(2,4,6,8), (2,4,6,8), (10,30,60), (30,60)]
?