Решение этой проблемы проще с .loc
, вы можете использовать следующий код, комментарии в коде объясняют логику:
Эта часть является просто копией вашего кода из вопроса: [ 119]
import pandas as pd
import numpy as np
stream = [2, 0, 1, 0, 3, 2, 100, 0, 0, -95, 3, 0, 2, -1, 0, 2, 93, -2, -89]
date = [
'2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04', '2019-01-05',
'2019-01-06', '2019-01-07', '2019-01-08', '2019-01-09', '2019-01-10',
'2019-01-11', '2019-01-13', '2019-01-14', '2019-01-15', '2019-01-16',
'2019-01-17', '2019-01-18', '2019-01-19', '2019-01-20'
]
df = pd.DataFrame({'date': date, 'stream': stream})
Этот код решает проблему:
p_list=[n for n in df.stream if n >0] # we are getting positive values from stream column
p_mean=sum(p_list)/len(p_list) # finding mean (as unusual value threshold)
n_list=[n for n in df.stream if n <0] #similarly getting negative values
n_mean=sum(n_list)/len(n_list) #finding threshold on the negative side.
После получения пороговых значений (убедитесь, что вы можете вручную установить эти значения, если вам нравится, это просто попытка автоматизация всего процесса).
p_flags=df.index[(df.stream > p_mean) &((df.stream.shift(-1) <=-.9*df.stream ) | (df.stream.shift(-2)<=-0.9*df.stream
)|(df.stream.shift(-3)<=-0.9*df.stream
)|(df.stream.shift(-4)<=-0.9*df.stream
)|(df.stream.shift(-5)<=-0.9*df.stream
))]
, что это будет делать, это возвращать индекс строк с соответствующими критериями, логика критериев очень проста: мы проверяем, больше ли строка, чем значение p_mean, если это так, мы проверяем, любая из следующих пяти строк имеет значение, которое составляет менее 90% от такого значения (то есть оттока), что означает оператор |
, или любой отток в следующих 5 будет означать, что часть возвращает значение true.
Для того, чтобы найти индекс отрицательных флагов, у нас есть похожая вещь только в реверсах:
n_flags=df.index[(df.stream < n_mean) &((df.stream.shift(1) >=0.9*df.stream ) | (df.stream.shift(2)>=0.9*df.stream
)|(df.stream.shift(3)>=0.9*df.stream
)|(df.stream.shift(4)>=0.9*df.stream
)|(df.stream.shift(5)>=0.9*df.stream
))]
Теперь у вас есть индексы, если строки соответствуют критериям, чтобы добавить это как столбец в фрейм данных просто выполните:
flags=np.zeros(len(df))
for i1,i2 in zip(n_flags,p_flags):
flags[i1]=1
flags[i2]=1
df["flags"]=flags
print(df)
Вывод будет:
date stream flags
0 2019-01-01 2 0.0
1 2019-01-02 0 0.0
2 2019-01-03 1 0.0
3 2019-01-04 0 0.0
4 2019-01-05 3 0.0
5 2019-01-06 2 0.0
6 2019-01-07 100 1.0
7 2019-01-08 0 0.0
8 2019-01-09 0 0.0
9 2019-01-10 -95 1.0
10 2019-01-11 3 0.0
11 2019-01-13 0 0.0
12 2019-01-14 2 0.0
13 2019-01-15 -1 0.0
14 2019-01-16 0 0.0
15 2019-01-17 2 0.0
16 2019-01-18 93 1.0
17 2019-01-19 -2 0.0
18 2019-01-20 -89 1.0
Если Вы имеете установленный procfs, можно найти идентификатор процесса через/proc/self символьную ссылку, которая указывает на каталог, имя которого является pid (существуют также файлы здесь с другой уместной информацией, включая PID, но каталог - все, в чем Вы нуждаетесь в этом случае).
Таким образом, с Java, можно сделать:
String pid = new File("/proc/self").getCanonicalFile().getName();
В JRuby, можно использовать то же решение:
pid = java.io.File.new("/proc/self").canonical_file.name
Особая благодарность #stackoverflow каналу на свободном узле для помощи мне решить это! (а именно, Jerub, gregh, и Topdeck)
Только протестированный в использовании Linux JVM Sun. Не мог бы работать с другими реализациями JMX.
String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];