尝试在python中为数据集模式创建自己的实现

尝试在python中为数据集模式创建自己的实现,python,data-science,Python,Data Science,我完全了解计数器。大多数情况下,这对我来说就像是作弊。我想自己做 这是我的功能 def mode(self): unq = [] m = 0 for i in self.arrData: if i not in unq: unq.append(i) for i in unq: count = self.arrData.count(i)

我完全了解计数器。大多数情况下,这对我来说就像是作弊。我想自己做

这是我的功能

    def mode(self):
        unq = []
        m = 0
        for i in self.arrData:
            if i not in unq:
                unq.append(i)
        for i in unq:
            count = self.arrData.count(i)
            if count > m:
                m = i
        return m
使用测试数据时:

34.9,35.0,35.2,35.4,35.8,36.0,36.1,36.2,36.3,36.4,36.4,36.4,36.5,36.6,36.7,36.7,36.8,36.8,37.0,37.2,37.3,37.9,38.2,38.3,38.3,38.4,38.8,39.0,39.4


我一直将第一个元素作为m。

您需要维护两个变量——当前模式和当前模式的计数。您当前正在比较“计数”与“模式”,此时您应该比较计数与模式计数

def模式(自):
uniq=set()#set在这方面比列表更好
模式=无
模式计数=0
对于self.arrData中的i:
uniq.add(i)#不需要检查集合的成员资格
对于我在uniq:
i_count=self.arrData.count(i)
如果i_计数>模式_计数:
模式=i
模式计数=i计数
返回模式#对于空数组将不返回任何值
要一次性完成此操作(减少运行时间):

def模式(自):
seen=set()#set在这方面比列表更好;检查会员资格更便宜
模式=无
模式计数=0
对于self.arrData中的i:
如果我看到:
持续
见.添加(i)
i_count=self.arrData.count(i)
如果i_计数>模式_计数:
模式=i
模式计数=i计数
返回模式#对于空数组将不返回任何值
但这也会在arrData.count()中隐藏O(n)扫描。为了避免这种情况:

def模式(自):
值\计数=defaultdict(int)
对于self.arrData中的i:
值_计数[i]+=1
#等效:值\计数=计数器(self.arrData)
模式=无
模式计数=0
对于i,i_count in value_counts.items():
如果i_计数>模式_计数:
模式=i
模式计数=i计数
返回模式#对于空数组将不返回任何值

或者,使用
scipy.stats.mode
(请参阅)。请注意,如果您的数据是连续的(通常情况下是浮点数),您可能需要某种kde而不是模式(否则,您隐含地将数据的精度作为量化单元大小,而不同的单元大小/带宽可能更适合您的数据).

您将最常用的值保存在
m
中,而不是它的计数。 您可以通过以下代码进行修复:

def mode(self):
    unq = []
    m = 0
    c = 0
    for i in self.arrData:
        if i not in unq:
            unq.append(i)
    for i in unq:
        count = self.arrData.count(i)
        if count > c:
            m = i
            c = count
    return m

使用标准库例程绝不是欺骗。然而,通过重写标准例程的“挑战”来理解Python技术是合法的!我懂了。实际上,这是一个相当愚蠢的错误。谢谢你的帮助。