Skip to content

Commit

Permalink
calculate derived stats clientside
Browse files Browse the repository at this point in the history
  • Loading branch information
sipec committed Jul 12, 2024
1 parent 39c8cb3 commit da9d0f7
Show file tree
Hide file tree
Showing 3 changed files with 47 additions and 81 deletions.
62 changes: 1 addition & 61 deletions backend/scheduler/src/jobs/update-stats.ts
Original file line number Diff line number Diff line change
Expand Up @@ -261,16 +261,6 @@ export const updateStatsCore = async () => {
const dailySales = dailyManaSales.map((sales) =>
sum(sales.map((s) => s.amount))
)
const salesWeeklyAvg = dailySales.map((_, i) => {
const start = Math.max(0, i - 6)
const end = i + 1
return average(dailySales.slice(start, end))
})
const monthlySales = dailySales.map((_, i) => {
const start = Math.max(0, i - 29)
const end = i + 1
return sum(dailySales.slice(start, end))
})

const dailyUserIds = zip(dailyContracts, dailyBets, dailyComments).map(
([contracts, bets, comments]) => {
Expand Down Expand Up @@ -304,11 +294,6 @@ export const updateStatsCore = async () => {
)

const dailyActiveUsers = dailyUserIds.map((userIds) => userIds.length)
const dailyActiveUsersWeeklyAvg = dailyUserIds.map((_, i) => {
const start = Math.max(0, i - 6)
const end = i + 1
return average(dailyActiveUsers.slice(start, end))
})

const weeklyActiveUsers = dailyUserIds.map((_, i) => {
const start = Math.max(0, i - 6)
Expand Down Expand Up @@ -361,12 +346,6 @@ export const updateStatsCore = async () => {
return yesterday.length === 0 ? 0 : retainedCount / yesterday.length
})

const d1WeeklyAvg = d1.map((_, i) => {
const start = Math.max(0, i - 6)
const end = i + 1
return average(d1.slice(start, end))
})

const nd1 = dailyNewRealUserIds.map((today, i) => {
if (i === dailyNewRealUserIds.length - 1) return 0
if (today.length === 0) return 0
Expand All @@ -378,11 +357,6 @@ export const updateStatsCore = async () => {
return retainedCount / today.length
})

const nd1WeeklyAvg = nd1.map((_, i) => {
const start = Math.max(0, i - 6)
const end = i + 1
return average(nd1.slice(start, end))
})
const fracDaysActiveD1ToD3 = dailyNewRealUserIds.map((today, i) => {
if (today.length === 0) return 0
if (i > dailyNewRealUserIds.length - 4) return 0
Expand All @@ -394,12 +368,7 @@ export const updateStatsCore = async () => {
const totalActive = sumBy(today, (userId) => thisWeekCounts[userId] ?? 0)
return totalActive / today.length / 3
})
const fracDaysActiveD1ToD3Avg7d = fracDaysActiveD1ToD3.map((_, i) => {
if (i > dailyNewRealUserIds.length - 4) return 0
const start = Math.max(0, i - 6)
const end = i + 1
return average(fracDaysActiveD1ToD3.slice(start, end))
})

const nw1 = dailyNewRealUserIds.map((_userIds, i) => {
if (i < 13) return 0

Expand Down Expand Up @@ -487,11 +456,6 @@ export const updateStatsCore = async () => {
})
return activedCount / newUsers.length
})
const dailyActivationRateWeeklyAvg = dailyActivationRate.map((_, i) => {
const start = Math.max(0, i - 6)
const end = i + 1
return average(dailyActivationRate.slice(start, end))
})

const d1BetAverage = dailyNewRealUsers.map((newUsers) => {
if (newUsers.length === 0) return 0
Expand All @@ -517,51 +481,27 @@ export const updateStatsCore = async () => {
const manaBetDaily = dailyBets.map((bets) => {
return Math.round(sumBy(bets, (bet) => Math.abs(bet.amount)) / 100)
})
const manaBetWeekly = manaBetDaily.map((_, i) => {
const start = Math.max(0, i - 6)
const end = i + 1
const total = sum(manaBetDaily.slice(start, end))
if (end - start < 7) return (total * 7) / (end - start)
return total
})
const manaBetMonthly = manaBetDaily.map((_, i) => {
const start = Math.max(0, i - 29)
const end = i + 1
const total = sum(manaBetDaily.slice(start, end))
const range = end - start
if (range < 30) return (total * 30) / range
return total
})

const statsData: Stats = {
startDate: [start.valueOf()],
dailyActiveUsers,
dailyActiveUsersWeeklyAvg,
avgDailyUserActions,
dailySales,
salesWeeklyAvg,
monthlySales,
weeklyActiveUsers,
monthlyActiveUsers,
engagedUsers,
d1,
d1WeeklyAvg,
nd1,
nd1WeeklyAvg,
fracDaysActiveD1ToD3,
fracDaysActiveD1ToD3Avg7d,
nw1,
dailyBetCounts,
dailyContractCounts,
dailyCommentCounts,
dailySignups,
weekOnWeekRetention,
dailyActivationRate,
dailyActivationRateWeeklyAvg,
monthlyRetention,
manaBetDaily,
manaBetWeekly,
manaBetMonthly,
d1BetAverage,
d1Bet3DayAverage,
dailyNewRealUserSignups,
Expand Down
22 changes: 13 additions & 9 deletions common/src/stats.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
export type Stats = {
startDate: [number]
dailyActiveUsers: number[]
dailyActiveUsersWeeklyAvg: number[]
avgDailyUserActions: number[]
weeklyActiveUsers: number[]
monthlyActiveUsers: number[]
engagedUsers: number[]
dailySales: number[]
salesWeeklyAvg: number[]
monthlySales: number[]
d1: number[]
d1WeeklyAvg: number[]
nd1: number[]
nd1WeeklyAvg: number[]
fracDaysActiveD1ToD3: number[]
fracDaysActiveD1ToD3Avg7d: number[]
nw1: number[]
dailyBetCounts: number[]
dailyContractCounts: number[]
Expand All @@ -23,16 +17,26 @@ export type Stats = {
weekOnWeekRetention: number[]
monthlyRetention: number[]
dailyActivationRate: number[]
dailyActivationRateWeeklyAvg: number[]
manaBetDaily: number[]
manaBetWeekly: number[]
manaBetMonthly: number[]
d1BetAverage: number[]
d1Bet3DayAverage: number[]
dailyNewRealUserSignups: number[]
feedConversionScores: number[]
}

// stats fully calculated from the above stats
export type DerivedStats = {
dailyActiveUsersWeeklyAvg: number[]
salesWeeklyAvg: number[]
monthlySales: number[]
d1WeeklyAvg: number[]
nd1WeeklyAvg: number[]
fracDaysActiveD1ToD3Avg7d: number[]
dailyActivationRateWeeklyAvg: number[]
manaBetWeekly: number[]
manaBetMonthly: number[]
}

export type ManaSupply = {
balance: number
spiceBalance: number
Expand Down
44 changes: 33 additions & 11 deletions web/pages/stats.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { Title } from 'web/components/widgets/title'
import { getStats } from 'web/lib/supabase/stats'
import { Stats } from 'common/stats'
import { PLURAL_BETS } from 'common/user'
import { capitalize, orderBy, sumBy } from 'lodash'
import { capitalize, orderBy, sum, sumBy } from 'lodash'
import { formatLargeNumber, formatMoney } from 'common/util/format'
import { formatWithCommas } from 'common/util/format'
import { SEO } from 'web/components/SEO'
Expand All @@ -20,6 +20,7 @@ import { BonusSummary } from 'web/components/stats/bonus-summary'
import { ManaSupplySummary } from 'web/components/stats/mana-summary'
import { Row } from 'web/components/layout/row'
import { VIEW_RECORDINGS_START } from 'common/feed'
import { average } from 'common/util/math'

export const getStaticProps = async () => {
try {
Expand Down Expand Up @@ -82,30 +83,21 @@ export function CustomAnalytics(props: {
}) {
const {
dailyActiveUsers,
dailyActiveUsersWeeklyAvg,
dailySales,
salesWeeklyAvg,
monthlySales,
weeklyActiveUsers,
monthlyActiveUsers,
dailySales,
engagedUsers,
d1,
d1WeeklyAvg,
nd1,
nd1WeeklyAvg,
fracDaysActiveD1ToD3,
fracDaysActiveD1ToD3Avg7d,
nw1,
dailyBetCounts,
dailyContractCounts,
dailyCommentCounts,
weekOnWeekRetention,
monthlyRetention,
dailyActivationRate,
dailyActivationRateWeeklyAvg,
manaBetDaily,
manaBetWeekly,
manaBetMonthly,
dailyNewRealUserSignups,
d1BetAverage,
d1Bet3DayAverage,
Expand All @@ -114,6 +106,19 @@ export function CustomAnalytics(props: {

const { manaSupplyOverTime, fromBankSummary, toBankSummary } = props

const dailyActiveUsersWeeklyAvg = rollingAvg(dailyActiveUsers, 7)
const salesWeeklyAvg = rollingAvg(dailySales, 7)
const monthlySales = rollingSum(dailySales, 30)
const d1WeeklyAvg = rollingAvg(d1, 7)
const nd1WeeklyAvg = rollingAvg(nd1, 7)
const dailyActivationRateWeeklyAvg = rollingAvg(dailyActivationRate, 7)
const manaBetWeekly = rollingSum(manaBetDaily, 7)
const manaBetMonthly = rollingSum(manaBetDaily, 30)

const fracDaysActiveD1ToD3Avg7d = rollingAvg(fracDaysActiveD1ToD3, 7)
// replace last 4 days with 0s
fracDaysActiveD1ToD3.splice(-4, 4, 0, 0, 0, 0)

const currentSupply = manaSupplyOverTime[manaSupplyOverTime.length - 1]
const yesterdaySupply = manaSupplyOverTime[manaSupplyOverTime.length - 2]
const differenceInSupplySinceYesterday =
Expand Down Expand Up @@ -663,3 +668,20 @@ export function CustomAnalytics(props: {
</Col>
)
}

const rollingAvg = (arr: number[], period: number) =>
arr.map((_, i) => {
const start = Math.max(0, i - period + 1)
const end = i + 1
return average(arr.slice(start, end))
})

const rollingSum = (arr: number[], period: number) =>
arr.map((_, i) => {
const start = Math.max(0, i - period + 1)
const end = i + 1
const total = sum(arr.slice(start, end))
// adjust start to make up for missing data
if (end - start < period) return (total * period) / (end - start)
return total
})

0 comments on commit da9d0f7

Please sign in to comment.