আমি এই উত্তরে দুটি পদ্ধতি সরবরাহ করতে চাই, "জেড স্কোর" ভিত্তিক সমাধান এবং "আইকিউআর" ভিত্তিক সমাধান।
এই উত্তরের প্রদত্ত কোডটি একক ম্লান numpy
অ্যারে এবং একাধিক numpy
অ্যারে উভয় ক্ষেত্রেই কাজ করে ।
প্রথমে কিছু মডিউল আমদানি করা যাক।
import collections
import numpy as np
import scipy.stats as stat
from scipy.stats import iqr
z স্কোর ভিত্তিক পদ্ধতি
এই পদ্ধতিটি পরীক্ষা করবে যদি নম্বরটি তিনটি স্ট্যান্ডার্ড বিচ্যুতির বাইরে যায়। এই নিয়মের ভিত্তিতে, মানটি বহিরাগত হলে, পদ্ধতিটি সত্য হিসাবে প্রত্যাবর্তন করবে, যদি না হয় তবে মিথ্যা প্রত্যাবর্তন করবে।
def sd_outlier(x, axis = None, bar = 3, side = 'both'):
assert side in ['gt', 'lt', 'both'], 'Side should be `gt`, `lt` or `both`.'
d_z = stat.zscore(x, axis = axis)
if side == 'gt':
return d_z > bar
elif side == 'lt':
return d_z < -bar
elif side == 'both':
return np.abs(d_z) > bar
আইকিউআর ভিত্তিক পদ্ধতি
মানটি তার চেয়ে কম q1 - 1.5 * iqr
বা বেশি হলে এটি পরীক্ষা করবে q3 + 1.5 * iqr
যা এসপিএসএসের প্লট পদ্ধতির অনুরূপ।
def q1(x, axis = None):
return np.percentile(x, 25, axis = axis)
def q3(x, axis = None):
return np.percentile(x, 75, axis = axis)
def iqr_outlier(x, axis = None, bar = 1.5, side = 'both'):
assert side in ['gt', 'lt', 'both'], 'Side should be `gt`, `lt` or `both`.'
d_iqr = iqr(x, axis = axis)
d_q1 = q1(x, axis = axis)
d_q3 = q3(x, axis = axis)
iqr_distance = np.multiply(d_iqr, bar)
stat_shape = list(x.shape)
if isinstance(axis, collections.Iterable):
for single_axis in axis:
stat_shape[single_axis] = 1
else:
stat_shape[axis] = 1
if side in ['gt', 'both']:
upper_range = d_q3 + iqr_distance
upper_outlier = np.greater(x - upper_range.reshape(stat_shape), 0)
if side in ['lt', 'both']:
lower_range = d_q1 - iqr_distance
lower_outlier = np.less(x - lower_range.reshape(stat_shape), 0)
if side == 'gt':
return upper_outlier
if side == 'lt':
return lower_outlier
if side == 'both':
return np.logical_or(upper_outlier, lower_outlier)
অবশেষে, আপনি যদি বিদেশিদের ফিল্টার করতে চান তবে একটি numpy
নির্বাচক ব্যবহার করুন ।
আপনার দিনটি শুভ হোক.