我正在尝试制作一个简单的类,它将数据存储为数据框并给出特定的结果。我试过写一个如下:
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/