Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -141,14 +141,19 @@ const AggregationsTab: FC<Props> = ({
);
case QuestionType.Numeric:
case QuestionType.Discrete:
case QuestionType.Date:
case QuestionType.Date: {
const aggregation = questionData.aggregations?.[tabData.id];
if (!aggregation) {
return null;
}
return (
<ContinuousAggregationChart
activeAggregation={activeAggregation}
activeAggregation={aggregation}
selectedTimestamp={aggregationTimestamp}
questionData={questionData}
/>
);
}
default:
return <div>{t("unsupportedQuestionType")}</div>;
}
Expand Down
Comment thread
lsabor marked this conversation as resolved.
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import {
ContinuousAreaHoverState,
} from "@/types/charts";
import {
AggregateForecastHistory,
NumericAggregateForecastHistory,
GraphingQuestionProps,
} from "@/types/question";
import {
Expand All @@ -21,11 +21,11 @@ import {
import { cdfToPmf } from "@/utils/math";
import { formatValueUnit } from "@/utils/questions/units";

import { AggregationExtraQuestion } from "../types";
import { NumericAggregationExtraQuestion } from "../types";

type Props = {
questionData: AggregationExtraQuestion;
activeAggregation: AggregateForecastHistory;
questionData: NumericAggregationExtraQuestion;
activeAggregation: NumericAggregateForecastHistory;
selectedTimestamp: number | null;
};

Expand Down
34 changes: 27 additions & 7 deletions front_end/src/app/(main)/aggregation-explorer/types.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,39 @@
import {
AggregationQuestion,
Aggregations,
AggregateForecastHistory,
NumericAggregationQuestion,
MultipleChoiceAggregationQuestion,
NumericAggregations,
MultipleChoiceAggregations,
NumericAggregateForecastHistory,
MultipleChoiceAggregateForecastHistory,
} from "@/types/question";
import { ThemeColor } from "@/types/theme";

// flexible version of Aggregations type which can include
// arbitrarily named aggregations
export type AggregationsExtra = Aggregations &
Partial<Record<string, AggregateForecastHistory>>;

export type AggregationExtraQuestion = AggregationQuestion & {
aggregations: AggregationsExtra;
export type NumericAggregationsExtra = NumericAggregations &
Partial<Record<string, NumericAggregateForecastHistory>>;

export type NumericAggregationExtraQuestion = NumericAggregationQuestion & {
aggregations: NumericAggregationsExtra;
};

export type MultipleChoiceAggregationsExtra = MultipleChoiceAggregations &
Partial<Record<string, MultipleChoiceAggregateForecastHistory>>;

export type MultipleChoiceAggregationExtraQuestion =
MultipleChoiceAggregationQuestion & {
aggregations: MultipleChoiceAggregationsExtra;
};

export type AggregationsExtra =
| NumericAggregationsExtra
| MultipleChoiceAggregationsExtra;

export type AggregationExtraQuestion =
| NumericAggregationExtraQuestion
| MultipleChoiceAggregationExtraQuestion;

export enum AggregationExtraMethod {
recency_weighted = "recency_weighted",
recency_weighted_bot = "recency_weighted_bot",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import { getContinuousAreaChartData } from "@/components/charts/continuous_area_
import MinifiedContinuousAreaChart from "@/components/charts/minified_continuous_area_chart";
import ConsumerContinuousTile from "@/components/consumer_post_card/consumer_question_tile/consumer_continuous_tile";
import { QuestionStatus } from "@/types/post";
import { QuestionWithForecasts } from "@/types/question";
import { QuestionWithNumericForecasts } from "@/types/question";
import { getQuestionForecastAvailability } from "@/utils/questions/forecastAvailability";

type Props = {
question: QuestionWithForecasts;
question: QuestionWithNumericForecasts;
};

const ContinuousQuestionPrediction: React.FC<Props> = ({ question }) => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import { FC } from "react";
import { getContinuousAreaChartData } from "@/components/charts/continuous_area_chart";
import MinifiedContinuousAreaChart from "@/components/charts/minified_continuous_area_chart";
import { QuestionStatus } from "@/types/post";
import { QuestionWithForecasts } from "@/types/question";
import { QuestionWithNumericForecasts } from "@/types/question";
import cn from "@/utils/core/cn";

type Props = {
formatedResolution: string;
successfullyResolved: boolean;
size?: "md" | "lg";
question: QuestionWithForecasts;
question: QuestionWithNumericForecasts;
};

const QuestionHeaderContinuousResolutionChip: FC<Props> = ({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,7 @@ import QuestionCPMovement from "@/components/cp_movement";
import ContinuousCPBar from "@/components/post_card/question_tile/continuous_cp_bar";
import { useHideCP } from "@/contexts/cp_context";
import { QuestionStatus } from "@/types/post";
import {
QuestionType,
QuestionWithForecasts,
QuestionWithNumericForecasts,
} from "@/types/question";
import { QuestionType, QuestionWithForecasts } from "@/types/question";
import cn from "@/utils/core/cn";
import { formatResolution } from "@/utils/formatters/resolution";
import { getQuestionForecastAvailability } from "@/utils/questions/forecastAvailability";
Expand All @@ -40,11 +36,10 @@ const QuestionHeaderCPStatus: FC<Props> = ({
question,
isClosed: question.status === QuestionStatus.CLOSED,
});
const isContinuous = [
QuestionType.Numeric,
QuestionType.Discrete,
QuestionType.Date,
].includes(question.type);
const isContinuous =
question.type === QuestionType.Numeric ||
question.type === QuestionType.Discrete ||
question.type === QuestionType.Date;

if (question.status === QuestionStatus.RESOLVED && question.resolution) {
// Resolved/Annulled/Ambiguous
Expand Down Expand Up @@ -107,7 +102,7 @@ const QuestionHeaderCPStatus: FC<Props> = ({
)}
{!hideCP && (
<ContinuousCPBar
question={question as QuestionWithNumericForecasts}
question={question as QuestionWithForecasts}
size={size}
variant="question"
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -126,22 +126,6 @@ const NumericQuestionInput: React.FC<{
question_weight: 1.0,
default_score_type: "peer",
default_aggregation_method: AggregationMethod.recency_weighted,
forecasts: {
timestamps: [],
nr_forecasters: [],
my_forecasts: {
timestamps: [],
medians: [],
distribution_input: null,
},
medians: [],
q3s: [],
q1s: [],
means: [],
latest_pmf: [],
latest_cdf: [],
histogram: [],
},
type: questionType,
scaling: {
range_max: max as number,
Expand Down
8 changes: 8 additions & 0 deletions front_end/src/components/charts/continuous_area_chart.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -1118,6 +1118,14 @@ export function getContinuousAreaChartData({
};
isClosed?: boolean;
}): ContinuousAreaGraphInput {
if (
question.type !== QuestionType.Numeric &&
question.type !== QuestionType.Discrete &&
question.type !== QuestionType.Date
) {
return [];
}

const chartData: ContinuousAreaGraphInput = [];

const latest =
Expand Down
4 changes: 2 additions & 2 deletions front_end/src/components/charts/histogram.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ import ChartContainer from "./primitives/chart_container";

type HistogramProps = {
histogramData: { x: number; y: number }[];
median: number | undefined;
mean: number | undefined;
median: number | null | undefined;
mean: number | null | undefined;
color: "blue" | "gray";
width?: number;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import {
GraphingQuestionProps,
Question,
QuestionType,
QuestionWithForecasts,
QuestionWithNumericForecasts,
} from "@/types/question";
import { generateScale } from "@/utils/charts/axis";
import { getClosestYValue, interpolateYValue } from "@/utils/charts/helpers";
Expand Down Expand Up @@ -596,7 +596,7 @@ export function getContinuousAreaChartData({
question,
isClosed,
}: {
question: QuestionWithForecasts;
question: QuestionWithNumericForecasts;
isClosed?: boolean;
}): ContinuousAreaGraphInput {
const chartData: ContinuousAreaGraphInput = [];
Expand Down
10 changes: 5 additions & 5 deletions front_end/src/components/comment_feed/included_forecast.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ export function userForecastToForecastType(
probability_yes: userForecast.forecast_values[1] ?? 0,
probability_yes_per_category: userForecast.forecast_values,
options: question.options ?? [],
continuous_cdf: userForecast.forecast_values,
continuous_cdf: userForecast.forecast_values.map((value) => value ?? 0),
quartiles,
scaling,
question_type: questionType,
Expand All @@ -71,10 +71,10 @@ export function formatForecastValueText(forecast: ForecastType): string {
probability,
name: forecast.options[index],
}))
.sort((a, b) => b.probability - a.probability);
.sort((a, b) => (b.probability || 0.0) - (a.probability || 0.0));
const top = choices[0];
if (top) {
return `${top.name}: ${Math.round(top.probability * 1000) / 10}%`;
return `${top.name}: ${Math.round((top.probability || 0.0) * 1000) / 10}%`;
}
return "";
}
Expand Down Expand Up @@ -233,7 +233,7 @@ const ForecastValue: FC<ForecastValueProps> = ({ forecast }) => {
name: forecast.options[index],
color: MULTIPLE_CHOICE_COLOR_SCALE[index],
}))
.sort((a, b) => b.probability - a.probability);
.sort((a, b) => (b.probability || 0.0) - (a.probability || 0.0));
return (
<ol className="order-1 grow-0 text-xl font-bold text-gray-900 dark:text-gray-900-dark">
{choices.map((choice, index) => (
Expand All @@ -245,7 +245,7 @@ const ForecastValue: FC<ForecastValueProps> = ({ forecast }) => {
>
{/* TODO: why does this generate a slightly different color than in ForecastChoiceOption ? */}
<ChoiceIcon color={choice.color} />
{`${choice.name}: ${Math.round(choice.probability * 1000) / 10}%`}
{`${choice.name}: ${Math.round((choice.probability || 0.0) * 1000) / 10}%`}
</li>
))}
<Button
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import PredictionChip from "@/components/prediction_chip";
import ProgressBar from "@/components/ui/progress_bar";
import { ContinuousAreaType } from "@/types/charts";
import { PostStatus } from "@/types/post";
import { QuestionType, QuestionWithForecasts } from "@/types/question";
import { QuestionType, QuestionWithNumericForecasts } from "@/types/question";
import {
getQuantileNumericForecastDataset,
getSliderNumericForecastDataset,
Expand All @@ -27,7 +27,7 @@ import { getQuestionForecastAvailability } from "@/utils/questions/forecastAvail
import CPRevealTime from "../cp_reveal_time";

type Props = {
question: QuestionWithForecasts;
question: QuestionWithNumericForecasts;
disabled: boolean;
chartHeight?: number;
chartTheme?: VictoryThemeDefinition;
Expand Down
4 changes: 2 additions & 2 deletions front_end/src/components/conditional_tile/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import ForecastersCounter from "@/app/(main)/questions/components/forecaster_cou
import PredictionChip from "@/components/prediction_chip";
import { useHideCP } from "@/contexts/cp_context";
import { ConditionalPost, PostStatus } from "@/types/post";
import { QuestionWithForecasts } from "@/types/question";
import { QuestionWithNumericForecasts } from "@/types/question";
import { sendAnalyticsEvent } from "@/utils/analytics";
import cn from "@/utils/core/cn";
import { isUnsuccessfullyResolved } from "@/utils/questions/resolution";
Expand All @@ -21,7 +21,7 @@ import Arrow from "./icons/Arrow";
import DisabledArrow from "./icons/DisabledArrow";

type Props = {
post: ConditionalPost<QuestionWithForecasts>;
post: ConditionalPost<QuestionWithNumericForecasts>;
withNavigation?: boolean;
chartTheme?: VictoryThemeDefinition;
withCPRevealBtn?: boolean;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import {
ContinuousAreaGraphType,
ContinuousForecastInputType,
} from "@/types/charts";
import { QuestionType, UserForecast } from "@/types/question";
import { QuestionType, NumericUserForecast } from "@/types/question";
import cn from "@/utils/core/cn";
import { isForecastActive } from "@/utils/forecasts/helpers";

Expand All @@ -21,7 +21,7 @@ export type ContinuousInputContainerProps = {
onInputModeChange: (mode: ContinuousForecastInputType) => void;
overlayPreviousForecast: boolean;
onOverlayPreviousForecastChange: (value: boolean) => void;
previousForecast?: UserForecast;
previousForecast?: NumericUserForecast;
menu?: ReactNode;
copyMenu?: ReactNode;
children?: (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ import {
DistributionQuantile,
DistributionSlider,
QuestionWithNumericForecasts,
UserForecast,
NumericUserForecast,
} from "@/types/question";
import {
getQuantileNumericForecastDataset,
Expand Down Expand Up @@ -592,7 +592,7 @@ const ForecastMakerGroupContinuous: FC<Props> = ({
const response = await createForecasts(
postId,
predictedQuestions.map(({ my_forecasts, id, forecastExpiration }) => {
const latest = my_forecasts?.latest as UserForecast;
const latest = my_forecasts?.latest as NumericUserForecast;
return {
questionId: id,
forecastEndTime: forecastExpirationToDate(forecastExpiration),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ import { useServerAction } from "@/hooks/use_server_action";
import { ErrorResponse } from "@/types/fetch";
import { PostWithForecasts } from "@/types/post";
import {
AggregateForecastHistory,
MultipleChoiceAggregateForecastHistory,
QuestionWithMultipleChoiceForecasts,
UserForecast,
MultipleChoiceUserForecast,
} from "@/types/question";
import { ThemeColor } from "@/types/theme";
import { sendPredictEvent } from "@/utils/analytics";
Expand Down Expand Up @@ -481,8 +481,8 @@ const ForecastMakerMultipleChoice: FC<Props> = ({

function generateChoiceOptions(
question: QuestionWithMultipleChoiceForecasts,
aggregate: AggregateForecastHistory,
userLastForecast: UserForecast | undefined
aggregate: MultipleChoiceAggregateForecastHistory,
userLastForecast: MultipleChoiceUserForecast | undefined
): ChoiceOption[] {
const latest = aggregate.latest;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@ import { isNil } from "lodash";
import React, { FC } from "react";

import { QuestionStatus } from "@/types/post";
import { QuestionWithNumericForecasts } from "@/types/question";
import { QuestionWithForecasts } from "@/types/question";
import cn from "@/utils/core/cn";
import {
getDiscreteValueOptions,
getPredictionDisplayValue,
} from "@/utils/formatters/prediction";

type Props = {
question: QuestionWithNumericForecasts;
question: QuestionWithForecasts;
size?: "md" | "lg";
variant?: "feed" | "question";
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,9 @@ const QuestionContinuousTile: FC<Props> = ({
{
questionId: question.id,
forecastData: {
continuousCdf: activeForecast.forecast_values,
continuousCdf: activeForecast.forecast_values.map(
(value) => value ?? 0
),
probabilityYes: null,
probabilityYesPerCategory: null,
},
Expand Down
Loading