Python 3.x 巨蟒/熊猫:如何检测趋势是否突然增加;X";数量
我想检测是否有某个特定的日志事件使“X”数量增加了百分之,然后得到前10个增加趋势 我本以为pct_change().mean()会给我所需要的,但似乎我得到了一些奇怪的结果 这就是我得到的Python 3.x 巨蟒/熊猫:如何检测趋势是否突然增加;X";数量,python-3.x,pandas,Python 3.x,Pandas,我想检测是否有某个特定的日志事件使“X”数量增加了百分之,然后得到前10个增加趋势 我本以为pct_change().mean()会给我所需要的,但似乎我得到了一些奇怪的结果 这就是我得到的 import pandas as pd import numpy as np import csv from datetime import date, datetime, timedelta from matplotlib import pyplot as plt sample = "sampledat
import pandas as pd
import numpy as np
import csv
from datetime import date, datetime, timedelta
from matplotlib import pyplot as plt
sample = "sampledata.csv"
df = pd.read_csv(sample, sep=";")
df['DATE'] = pd.to_datetime(df['DATE'],
format='%d-%m-%Y')
grp = df.groupby(['DATE','EVENT'])['COUNT'].sum()
grp
DATE EVENT
2020-05-01 DOE711 2
ODO001 32
2020-05-02 ODO001 3
2020-05-03 DOE711 1
2020-05-04 DOE711 62
ODO001 46
2020-05-05 DOE711 101
ODO001 43
2020-05-06 DOE711 65
ODO001 61
2020-05-07 DOE711 102
ODO001 26
2020-05-08 ODO001 16
2020-05-09 ODO001 3
2020-05-10 ODO001 5
Name: COUNT, dtype: int64
grp.groupby('EVENT').apply(lambda x: x.pct_change().mean()).reset_index(name='avg_change').nlargest(10,'avg_change')
EVENT avg_change
0 DOE711 12.268365
1 ODO001 1.584531
grp = grp.reset_index()
grp = grp.set_index('DATE')
grp[grp.EVENT == "ODO001"].COUNT.plot()
现在,ODO001是1.58。这应该表明趋势在增加,但是:
如果我将数据导入excel,并要求excel创建一条线性趋势线,
它说它在减少
有人对如何解决这个问题有什么建议吗
在回答:@Marco Cerliani之后
这就是结果
所以这应该可以转化为:
def trend(series):
return np.polyfit(np.arange(0,len(series)), series.values, 1)[0]
trend(grp[grep.EVENT == "ODO001"].COUNT)
还是群比
df.groupby('EVENT').apply(lambda x: trend(x.count))
平均pct变化和线性趋势具有不同的行为。请看我的模拟示例:
start = 100
end = 0
peak = 1000
steps = 50
series = pd.Series(np.append(start, np.arange(end, peak+steps, steps)[::-1]))
series.plot()
该系列的pct平均变化为0.257(series.pct_change().mean()
),负线性系数为-38.73(np.polyfit(np.arange(0,len(series)),series.values,1)[0]
)
我们有一个巨大的正pct增加,而所有其他pct变化都是负的,但这足以产生一个平均值正(这对于存在极端异常值的平均指数来说是经典的)。相反,趋势对于数据中的线性模式更为重要
我建议你直接使用线性系数。你可以简单地用
np计算它。polyfit
啊,没有意识到代码块不受支持,在我的帖子中添加了我的结果,谢谢你的帮助,你能确认我上面的结果是否正确吗?谢谢,是的,类似的。。。在检查它是否在groupby之外工作之前,请尝试将其合并到groupby中。。。别忘了投赞成票或接受它作为答案;-)