python - 使用 Pandas 数据框创建一个类(更新)

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

这样做的目的是,当我传递整数等数据时,如果不存在数据帧,它将创建一个新的空数据帧,并通过调用 say ld = logdata(){ 将其存储在第一行我还可以将最大大小设置为 ld.size = 10},然后是 ld.createdf(),然后我会通过调用 将第一个数据插入到数据框中ld.insertdf(x,timestamp) 将通过以下函数计算发生率(默认值 = 1)和置信度(平均值为百分比,默认值 = 100)。最后,我想通过调用 ld.getresult() 提取置信度最高的数据,我想使用 pymongo 将其发送到服务器(我知道这部分)。

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

举个例子: 假设我有一个大小为 3 的二进制标签 1 和 0,那么我将首先设置 ld.size = 3 然后我的输入将是 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) 它将 df 更改为:

Timestamp | Label | Occurance | Confidence 
|   1630  |     0 |          2|         66
|   1600  |     1 |          1|         33
|   1530  |     0 |          2|         66

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

ld.get_result() 只会给我最高数据集的标签,这也是最新的输入,即:1630,0,2,66

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

最佳答案

请参阅下面的修订代码。这应该会给你你正在寻找的输出。如果您需要对任何代码进行说明,请告诉我 - 但它是不言自明的。

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

关于python - 使用 Pandas 数据框创建一个类(更新),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51373404/

相关文章:

python - 泛化正则表达式以搜索维基百科类别

sql - 如何选择上个月的所有条目?

PHP 动态查询构建以在 null 时支持正面和负面匹配查询

python - DB-Connections 类作为 Python 中的单例

python - 将整个目录下载到 MinIO 桶中

python - 清除 postgresql 和 alembic 并从头开始

php - 如何保存用户的过滤条件?

node.js - 通过 Node js中的 Mongoose 将一个集合的相同值更改为所需值

javascript - 是否可以创建自定义 Mongoose 查询功能?

mongodb - 在API端点中使用mongodb对象ID的base64编码是否安全?