我有2个模型,分别是综合浏览量和交易量,我的目标是使用此公式=(总交易量/总综合浏览量)* 100%计算转化率。
这是我的模型结构。
for h in range(len(dpath)):
path = lidar_save + dpath[h]
#Combine seperate files to one file over the periode.
data_month = pd.DataFrame()
data_month_std = pd.DataFrame()
wind_rec_gz = glob.glob(path+'/*.csv')
print('Read: ', wind_rec_gz[0])
df = pd.read_csv(wind_rec_gz, header=0, sep=';',encoding = 'unicode_escape')
class Transaction(models.Model):
user = models.ForeignKey("User", on_delete=models.CASCADE)
organization = models.ForeignKey(
"Organization", on_delete=models.CASCADE, null=True
)
transaction_id = models.CharField(max_length=64, null=True, blank=True)
datetime = models.DateTimeField(null=True)
products = models.ManyToManyField("Product")
. . .
我尝试使用其中一些方法:
class PageView(models.Model):
user = models.ForeignKey("User", on_delete=models.CASCADE)
organization = models.ForeignKey(
"Organization", on_delete=models.CASCADE, null=True
)
datetime = models.DateTimeField(null=True)
url = models.CharField(max_length=2048, blank=True)
page_name = models.ForeignKey(
"PageName", on_delete=models.SET_NULL, null=True, blank=True
)
products = models.ManyToManyField("Product", blank=True)
. . .
结果是
User.objects.filter(pageview__datetime__range=(startdate,enddate)).annotate(
y=ExtractYear('pageview__datetime'),
m=ExtractMonth('pageview__datetime'),
d=ExtractDay('pageview__datetime')).values(
'y', 'm', 'd').order_by(
'y', 'm', 'd').annotate(
total=(Cast(Count('conversion__id'), FloatField()) /
Cast(Count('pageview__id'), FloatField())) * 100,
pv=Count('pageview__id', distinct=True),
cv=Count('conversion__id', distinct=True))
问题是,当我使用此查询进行检查时,交易总数不同
. . .
{
"y": 2019,
"m": 4,
"d": 3,
"total": 87.9093198992443,
"pv": 397,
"cv": 349
}
. . .
结果:
Transaction.objects.filter(
pageview__datetime__range=(startdate,enddate)).annotate(
y=ExtractYear('pageview__datetime'),
m=ExtractMonth('pageview__datetime'),
d=ExtractDay('pageview__datetime')).values(
'y', 'm', 'd').order_by(
'y', 'm', 'd').annotate(cv=Count('id'))
综合浏览量正确,但交易不正确,我的转化率计算错误。当时的总交易额应该是99,但是我得到349。有什么想法吗?非常感谢。
更新
这是我目前的解决方案, 首先,我同时对综合浏览量和交易进行注释,以获取字典列表。
. . .
{
"y": 2019,
"m": 4,
"d": 3,
"cv": 99
}
. . .
total_pageview = PageView.objects.filter(organization=org, datetime__range=(start, end)).annotate(y=ExtractYear(
'datetime'),m=ExtractMonth('datetime'), d=ExtractDay('datetime')).values('y', 'm', 'd').order_by('y', 'm', 'd').annotate(p=Count('id'))
然后使用for循环生成json
total_transaction = Transaction.objects.filter(organization=org, datetime__range=(start, end)).annotate(y=ExtractYear(
'datetime'),m=ExtractMonth('datetime'), d=ExtractDay('datetime')).values('y', 'm', 'd').order_by('y', 'm', 'd').annotate(c=Count('id'))
我知道这是一个非常丑陋的解决方案,在此期间,我仍将尝试完全使用Django ORM来完成此操作,任何想法将不胜感激,谢谢!!