問題描述:我
正在嘗試模擬一臺機器,如果“VALUE”在前 3 個時間步長中大于或等于 5,則其運行模式“B”發生 - 這意味著“VALUE”> = 5 至少 3分鐘。操作模式“B”在下一個時間步長中保持為“B”,只要“VALUE”大于或等于 5 并在至少 3 個時間步長后變為“A” - 這意味著操作模式“B”在接下來的 3 分鐘內保持有效。3 分鐘后,如果“VALUE”小于 5,則操作模式“A”打開。
目標:
我需要一種使用python和pandas的方法,根據“VALUE”列中的值和“on”狀態來識別“A”和“B”(列:“statusA/B”)描述的操作模式和“down”(列:“VALUE<5 --> down, VALUE>=5 --> on”)。
必須考慮的條件如下:
- 案例“A”和“B”相互依賴。
- 如果之前至少發生了 3 個“on”并且實際 VALUE 大于或等于 5,則發生案例“B”。
- 一旦出現“B”,即使狀態為“down”,接下來的3個時間步也必須為“B”,只要“on”存在,它就保持為“B”。
我所做的嘗試:
我嘗試了多種方法為“down”和“on”的情況應用計數器,并嘗試根據計數器值跟蹤狀態,但不幸的是它不能正常作業。
| 時間 | 價值 | VALUE<5 --> 向下 / VALUE>=5 --> 開啟 | 狀態A/B |
|---|---|---|---|
| 00:00 | 0 | 下 | 一個 |
| 00:01 | 0 | 下 | 一個 |
| 00:02 | 0 | 下 | 一個 |
| 00:03 | 8 | 上 | 一個 |
| 00:04 | 4 | 下 | 一個 |
| 00:05 | 2 | 下 | 一個 |
| 00:06 | 1 | 下 | 一個 |
| 00:07 | 2 | 下 | 一個 |
| 00:08 | 1 | 下 | 一個 |
| 00:08 | 5 | 上 | 一個 |
| 00:09 | 6 | 上 | 一個 |
| 00:10 | 0 | 下 | 一個 |
| 00:11 | 10 | 上 | 一個 |
| 00:12 | 10 | 上 | 一個 |
| 00:13 | 10 | 上 | 一個 |
| 00:14 | 11 | 下 | 乙 |
| 00:15 | 2 | 下 | 乙 |
| 00:16 | 1 | 下 | 乙 |
| 00:17 | 3 | 下 | 一個 |
| 00:18 | 11 | 上 | 一個 |
| 00:19 | 10 | 上 | 一個 |
| 00:20 | 10 | 上 | 一個 |
| 00:21 | 10 | 上 | 乙 |
| 00:22 | 10 | 上 | 乙 |
| 00:23 | 11 | 上 | 乙 |
| 00:24 | 14 | 上 | 乙 |
| 00:25 | 11 | 上 | 乙 |
uj5u.com熱心網友回復:
修改后的解決方案。由于親愛的mozway提出的一個微妙的觀點,我編輯了我的解決方案:
import pandas as pd
df2['status'] = df2['VALUE'].mask(df2['VALUE'].shift().rolling(3, min_periods=3).min() >= 5, 'B')
m1 = df2['status'].shift().eq('B')
m2 = df2['status'].shift(2).eq('B')
df2['status'] = (df2['status']
.mask(m1 | m2).fillna('B')
.astype(str)
.str.replace(r'\d ', 'A'))
m5 = df2['status'].shift().eq('B')
m6 = df2['status'].shift(2).eq('B')
m3 = df2['status'].eq('A')
m4 = df2.iloc[:, 2].eq('on')
df2['status'] = df2['status'].mask((m5 & m3 & m4) | (m6 & m3 & m4)).fillna('B')
index VALUE ... resulted statusA/B status
0 0 3 ... A A
1 1 5 ... A A
2 2 2 ... A A
3 3 6 ... A A
4 4 3 ... A A
5 5 1 ... A A
6 6 7 ... A A
7 7 7 ... A A
8 8 2 ... A A
9 9 2 ... A A
10 10 3 ... A A
11 11 6 ... A A
12 12 8 ... A A
13 13 8 ... A A
14 14 7 ... B B
15 15 4 ... B B
16 16 4 ... B B
17 17 6 ... A(expected is B because is "on" and at least 3... B
18 18 6 ... A(expected is B because is "on" and at least 3... B
19 19 6 ... A(expected is B because is "on" and at least 3... B
20 20 7 ... B B
21 21 2 ... B B
22 22 9 ... B B
23 23 8 ... A(expected is B because "B" keeps a "B" for 3 ... B
24 24 7 ... A(expected is B because is "on" and at least 3... B
25 25 2 ... B B
26 26 4 ... A(expected is B because "B" keeps a "B" for 3 ... B
27 27 4 ... A(expected is B because "B" keeps a "B" for 3 ... B
28 28 1 ... A(this true because it is down and the 3 time ... A
29 29 4 ... A A
[30 rows x 5 columns]
uj5u.com熱心網友回復:
我將代碼與以下“VALUE”列一起使用。
import pandas as pd
df['status'] = df['VALUE'].mask(df['VALUE'].shift().rolling(3, min_periods=3).min() >= 5, 'B')
m1 = df['status'].shift().eq('B')
m2 = df['status'].shift(2).eq('B')
df['status'] = (df['status']
.mask(m1 & m2).fillna('B')
.astype(str)
.str.replace(r'\d ', 'A'))
我得到的結果與預期值不匹配。我為預期值添加了一些注釋。
問題詳細描述: 運行模式“B”可以理解為機器的冷卻時間。如果機器“開啟”至少 3 分鐘,則機器是溫暖的。如果有“向下”的時間步,機器會在接下來的 3 分鐘內保持溫暖。如果“停機”狀態持續 3 分鐘后機器變冷。
| 指數 | 價值 | VALUE<5 --> 向下 / VALUE>=5 --> 開啟 | 結果狀態A/B |
|---|---|---|---|
| 0 | 3 | 下 | 一個 |
| 1 | 5 | 上 | 一個 |
| 2 | 2 | 下 | 一個 |
| 3 | 6 | 上 | 一個 |
| 4 | 3 | 下 | 一個 |
| 5 | 1 | 下 | 一個 |
| 6 | 7 | 上 | 一個 |
| 7 | 7 | 上 | 一個 |
| 8 | 2 | 下 | 一個 |
| 9 | 2 | 下 | 一個 |
| 10 | 3 | 下 | 一個 |
| 11 | 6 | 上 | 一個 |
| 12 | 8 | 上 | 一個 |
| 13 | 8 | 上 | 一個 |
| 14 | 7 | 上 | 乙 |
| 15 | 4 | 下 | 乙 |
| 16 | 4 | 下 | 乙 |
| 17 | 6 | 上 | A(預計是 B,因為它是“開啟”的,并且之前至少有 3 個帶有 B 的步驟) |
| 18 | 6 | 上 | A(預計是 B,因為它是“開啟”的,并且之前至少有 3 個帶有 B 的步驟) |
| 19 | 6 | 上 | A(預計是 B,因為它是“開啟”的,并且之前至少有 3 個帶有 B 的步驟) |
| 20 | 7 | 上 | 乙 |
| 21 | 2 | 下 | 乙 |
| 22 | 9 | 上 | 乙 |
| 23 | 8 | 上 | A(預期為 B,因為“B”從索引 21 開始在 3 個時間步長內保持“B”) |
| 24 | 7 | 上 | A(預計是 B,因為它是“開啟”的,并且之前至少有 3 個帶有 B 的步驟) |
| 25 | 2 | 下 | 乙 |
| 26 | 4 | 下 | A(預期為 B,因為“B”從索引 25 開始在 3 個時間步長內保持“B”) |
| 27 | 4 | 下 | A(預期為 B,因為“B”從索引 25 開始在 3 個時間步長內保持“B”) |
| 28 | 1 | 下 | A(這是真的,因為它已關閉并且帶有“B”的 3 個時間步已結束 |
| 29 | 4 | 下 | 一個 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/532881.html
下一篇:熊貓列中按升序排序的問題
