Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 巨蟒/熊猫:如何检测趋势是否突然增加;X";数量_Python 3.x_Pandas - Fatal编程技术网

Python 3.x 巨蟒/熊猫:如何检测趋势是否突然增加;X";数量

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

我想检测是否有某个特定的日志事件使“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 = "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中。。。别忘了投赞成票或接受它作为答案;-)