我正在尝试创建一个简单的类,该类将数据存储为数据框并给出一定的结果。我试图写一个如下:
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
编辑:我已经编辑了允许创建数据框的代码,但它不会更新发生率和置信度。
答案 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()]