使用pandas数据帧生成一个类(更新)

2024-05-01 22:01:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个简单的类,它将数据存储为一个数据帧并给出一定的结果。我试着写一篇如下:

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()]

它的作用是当我传递一个像integer这样的数据时,它将创建一个新的空数据帧(如果没有),并通过调用ld = logdata()}{我也可以将max size设置为ld.size = 10},然后再设置{},然后通过调用ld.insertdf(x,timestamp)将第一个数据插入到数据框中,这将计算发生率(默认值=1)和置信度(平均值为百分比,默认值为100)。最后,我想通过调用ld.getresult()来提取具有最高可信度的数据,我想使用pymongo将其发送到服务器(我知道这一部分)。在

我不是一个数据结构的人,只是一个python的傻瓜。我搜索了很多教程,但最终得到了数据帧子类的tut。这似乎行不通,如果可能的话,请帮我改正错误。你可以自由地建设性地批评这一点。这对我很有帮助,谢谢。在

下面是一个例子: 假设我有一个二进制标签1和大小为3的0,所以我首先设置ld.size = 3 那么我的输入将是ld.insertdf(0,1500) 这将产生:

^{pr2}$

然后我添加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

因为尺寸限制是3。 在注释中,我在解释时颠倒了索引,但方法是不言自明的。在

ld.get_result()将只给我一个标签,该标签具有最高的数据集,也是最新的输入,即:1630,0,2,66

编辑:我编辑了代码,它允许我创建一个数据帧,但它不更新发生和信任。在


Tags: 数据selfdfsizegetreturndeflabel
1条回答
网友
1楼 · 发布于 2024-05-01 22:01:25

参见下面的修订代码。这会给你你想要的输出。如果您需要对任何代码进行澄清,请让我知道-但这是不言自明的。在

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()]

相关问题 更多 >