【发布时间】:2017-01-07 22:27:12
【问题描述】:
我试图找到具有标准偏差的秒数异常值。我有两个数据框,如下所示。我试图找到的异常值与一周中的每一天的平均值相差 1.5 个标准差?当前代码位于数据框下方。
df1:
name dateTime Seconds
joe 2015-02-04 12:12:12 54321.0202
john 2015-01-02 13:13:13 12345.0101
joe 2015-02-04 12:12:12 54321.0202
john 2015-01-02 13:13:13 12345.0101
joe 2015-02-04 12:12:12 54321.0202
john 2015-01-02 13:13:13 12345.0101
joe 2015-02-04 12:12:12 54321.0202
john 2015-01-02 13:13:13 12345.0101
joe 2015-02-04 12:12:12 54321.0202
john 2015-01-02 13:13:13 12345.0101
joe 2015-02-04 12:12:12 54321.0202
joe 2015-01-02 13:13:13 12345.0101
当前输出:df2
name day standardDev mean count
Joe mon 22326.502700 40900.730647 1886
tue 9687.486726 51166.213836 159
john mon 10072.707891 41380.035108 883
tue 5499.475345 26985.938776 196
预期输出:
df2
name day standardDev mean count events
Joe mon 22326.502700 40900.730647 1886 [2015-02-04 12:12:12, 2015-02-04 12:12:13]
tue 9687.486726 51166.213836 159 [2015-02-04 12:12:12, 2015-02-04 12:12:14]
john mon 10072.707891 41380.035108 883 [2015-01-02 13:13:13, 2015-01-02 13:13:15]
tue 5499.475345 26985.938776 196 [2015-01-02 13:13:13, 2015-01-02 13:13:18]
代码:
allFiles = glob.glob(folderPath + "/*.csv")
list_ = []
for file_ in allFiles:
df = pd.read_csv(file_, index_col=None, names=['EventTime', "IpAddress", "Hostname", "TargetUserName", "AuthenticationPackageName", "TargetDomainName", "EventReceivedTime"])
df = df.ix[1:]
list_.append(df)
df = pd.concat(list_)
df['DateTime'] = pd.to_datetime(df['EventTime'])
df['day_of_week'] = df.DateTime.dt.strftime('%a')
df['seconds'] = pd.to_timedelta(df.DateTime.dt.time.astype(str)).dt.seconds
print(df.groupby((['TargetUserName', 'day_of_week'])).agg({'seconds': {'mean': lambda x: (x.mean()), 'std': lambda x: (np.std(x)), 'count': 'count'}}))
【问题讨论】:
-
可能是
df1[df1.groupby(pd.DatetimeIndex(df.dateTime).dayofweek)['Seconds'].apply(lambda x: x > (1.5*x.std() + x.mean()))]? -
“我不确定如何达到预期的输出”到底是什么意思?
-
我想弄清楚如何添加事件列并跟踪与上下均值相差 1.5 个标准差的所有事件?理想情况下,我想将包含完整数据的任何行添加到事件列中,作为事件列表。
-
@johnnyb,我之前提供的内容并不完整,因为它只找到了高于
1.5*std + mean的值。但是试试df1[df1.groupby(pd.DatetimeIndex(df.dateTime).dayofweek)['Seconds'].\ apply(lambda x: (x > (1.5*x.std() + x.mean())) | (x < (-1.5*x.std() + x.mean())))]。 -
我会像 @Abdou 那样做,尽管我会创建 groupby:
groupby(['name',df.dateTime.dt.day])。另请查看文档,那里有一个标准的 zscore 示例:pandas.pydata.org/pandas-docs/stable/…
标签: python python-3.x pandas statistics