使用熊猫数据框进行分类(更新)

时间:2018-07-17 04:50:43

标签: python database mongodb pandas data-structures

我正在尝试创建一个简单的类,该类将数据存储为数据框并给出一定的结果。我试图写一个如下:

import numpy as np
import pandas as pd

class logdata():
    def __init__(self,size):
        self.size = size
        self.x = None
        self.timestamp = None
        self.confidence = 100
        self.occurance = 1


    def createdf(self):
        self.df = pd.DataFrame(data = None, columns = ['Timestamp','Label','Occurance', 'Confidence'])
        return self.df


    def insertdf(self, x, timestamp):
        self.occurance = self.get_occurance()
        self.confidence = self.get_confidence()
        self.df.loc[-1] = pd.Series({'Timestamp':timestamp, 'Label': x, 'Occurance':self.occurance, 'Confidence':self.confidence})
        self.df.index = self.df.index + 1
        self.df = self.df.sort_index()
        self.df = self.del_row()
        return self.df

    def get_occurance(self):
        return self.df.loc[self.df.Label == self.x, 'Label'].count()

    def get_confidence(self):
        y = self.df.shape[0]
        if y:
            conf = (self.occurance/self.df.shape[0])*100
        else:
            conf = 100
        return conf

    def del_row(self):
        if self.df.shape[0] > int(self.size):
            self.df = self.df.iloc[self.size:]
        return self.df

    def get_result(self):
        return self.df.loc[self.createdf['Confidence'].idxmax()]

这是什么,当我传递数据(例如整数)时,如果不存在则创建一个新的空数据帧,并通过说ld = logdata() {将其存储在第一行中。我也可以将最大大小设置为ld.size = 10}后跟ld.createdf(),然后我将通过调用ld.insertdf(x,timestamp)将第一个数据插入数据帧,该ld.getresult()会计算出现率(默认= 1)和置信度(均值,百分比,默认= 100)通过以下功能。最后,我想通过调用ld.size = 3来提取具有最高置信度的数据,我想使用pymongo将其发送到服务器(我知道这部分)。

我不是一个数据结构专家,只是python的菜鸟。我搜索了很多教程,但最终还是获得了数据帧的子类。这似乎不起作用,如果可能,请帮助我解决错误。您可以自由地对此进行建设性的批评。它将对我有很大帮助,谢谢。

这是一个例子: 假设我有一个大小为3的二进制标签1和0,所以我将首先设置ld.insertdf(0,1500) 然后我的输入将是Timestamp | Label | Occurance | Confidence | 1500 | 0 | 1| 100 将会创建:

ld.insertdf(0,1530)

然后我添加Timestamp | Label | Occurance | Confidence | 1530 | 0 | 2| 100 | 1500 | 0 | 2| 100 哪个更新:

ld.insertdf(1,1600)

最后,当我添加Timestamp | Label | Occurance | Confidence | 1600 | 1 | 1| 33 | 1530 | 0 | 2| 66 | 1500 | 0 | 2| 66 时 它应该更新为:

ld.insertdf(0,1630)

当我添加另一个Timestamp | Label | Occurance | Confidence | 1630 | 0 | 2| 66 | 1600 | 1 | 1| 33 | 1530 | 0 | 2| 66 时 它将df更改为:

ld.get_result()

,因为大小限制为3。 PS-在评论中,我在解释时颠倒了索引,但该方法是不言自明的。

1630,0,2,66只会给我带有最高数据集的标签,它也是最新的输入,即:build.gradle

编辑:我已经编辑了允许创建数据框的代码,但它不会更新发生率和置信度。

1 个答案:

答案 0 :(得分:2)

请参阅下面的修订代码。这应该为您提供所需的输出。如果您需要对任何代码进行说明,请告诉我-但这很容易解释。

import pandas as pd

class logdata:
    def __init__(self, size):
        self.size = size
        self.df = pd.DataFrame(data = None, 
                               columns = ['Timestamp','Label','Occurance', 'Confidence'],
                              )

    def insertdf(self, x, timestamp):
        # default values
        occurance = 1
        confidence = 100

        self.df = self.df.append(pd.Series({
            'Timestamp': timestamp, 
            'Label': x, 
            'Occurance': occurance, 
            'Confidence': confidence
        }), ignore_index=True)

        self.df.sort_index(inplace=True, ascending=False)
        self.del_row()

        # Calculate the confidence and occurances of labels
        if self.df.shape[0] > 1:
            occurance = self.get_occurance()
            confidence = self.get_confidence(occurance)

            self.df['Occurance'] = self.df.Label.apply(lambda x: occurance[x])
            self.df['Confidence'] = self.df.Label.apply(lambda x: confidence[x])

        return self.df

    def get_occurance(self):
        # group by label and count
        occ = self.df.groupby('Label').Timestamp.count().rename('Occurance').astype(int)
        return occ

    def get_confidence(self, occurance):
        conf = ((occurance / sum(occurance)).rename('Confidence') * 100).astype(int)
        return conf

    def del_row(self):
        if self.df.shape[0] > int(self.size):
            self.df = self.df.head(self.size)

    def get_result(self):
        return self.df.loc[self.df['Confidence'].idxmax()]