FutureSearch Logofuturesearch
  • Pricing
  • Research
  • Docs
  • Evals
  • Markets
  • Blog
  • Company
  • Try it for free
FutureSearch Logo

General inquiry? You can reach us at hello@futuresearch.ai.

Company

TeamCareersPressPrivacy PolicyTerms of Service

Developers

SDK DocsAPI ReferenceCase StudiesGitHubSupport

Integrations

Claude CodeCursorChatGPT CodexClaude.ai

Track Record

Trading ResultsAccuracy EvalsTournament Standings

Follow Us

X (Twitter)@dschwarz26LinkedIn
FutureSearchdocs
Frontier forecasting
Installation
  • All install methods
  • Claude.ai
  • Claude Code
  • Web App
  • Python SDK
  • Skill
Reference
  • API Key
  • forecast
  • decision
  • multi_agent
  • agent_map
  • World Modeling
  • Published Forecasts
  • MCP Server
  • Progress Monitoring
Guides
  • Turn Claude into an Accurate Forecaster
  • Forecast Outcomes for a List of Entities
  • Forecast Conditional Scenarios
  • Forecast Categorical and Threshold Questions
  • Find Profitable Prediction Market Trades
  • Research a Question with a Team of Agents
  • Add a Column via Web Research
  • Error Handling in FutureSearch: Failed Rows and Partial Results
Case Studies
  • Forecast a Decision: Grant Funding at Three Levels
  • Forecast a Decision: Which CEO Replacement Maximizes Share Price
  • Forecast a Binary Question End to End
  • Forecast a Date, Then Grade It
  • Forecast Categorical Outcomes for Two Stealth Labs
  • Forecast Conditional Scenarios for OpenAI's IPO
  • Forecast Anthropic and OpenAI IPOs: Dates and Valuations
  • Forecast a Sum-of-the-Parts SpaceX IPO Valuation
  • Forecast Founder Seed Valuations for AI Researchers
  • Find Startups Selling to Frontier AI Labs
  • Run 10,000 LLM Web Research Agents
FutureSearchby futuresearch
by futuresearch

Fuzzy Match Across Tables

Matching companies to stock tickers, or CEOs to their companies, requires a cascade of strategies from exact matching through LLM reasoning to web search. This case study runs 5 merge experiments on 438 S&P 500 companies, testing each strategy independently.

MetricValue
Total merges5
Rows per merge438
Total cost$3.67
Total time7.1 minutes

Add FutureSearch to Claude Code if you haven't already:

claude mcp add futuresearch --scope project --transport http https://mcp.futuresearch.ai/mcp

With the company CSVs in your working directory, tell Claude to run each experiment. For the company-to-ticker merge:

Merge company_info.csv with valuations.csv. The first table has company names,
the second has stock tickers. Match companies to their stock tickers.

Claude calls FutureSearch's merge MCP tool:

Tool: futuresearch_merge
├─ task: "Merge the tables based on company name and ticker"
├─ left_csv: "/Users/you/company_info.csv"
└─ right_csv: "/Users/you/valuations.csv"

→ Submitted: 438 rows for merging.

...

Tool: futuresearch_results
→ Saved 438 rows to /Users/you/merged.csv

Add the FutureSearch connector if you haven't already. Then upload company_info.csv and valuations.csv and ask Claude:

Merge company_info.csv with valuations.csv. The first table has company names, the second has stock tickers. Match companies to their stock tickers.

Go to futuresearch.ai/app, upload company_info.csv and valuations.csv, and enter:

Merge company_info.csv with valuations.csv. The first table has company names, the second has stock tickers. Match companies to their stock tickers.

pip install futuresearch
export FUTURESEARCH_API_KEY=your_key_here  # Get one at futuresearch.ai/app/api-key
import asyncio
import pandas as pd
from futuresearch import create_session
from futuresearch.ops import merge

companies = pd.read_csv("company_info.csv")
valuations = pd.read_csv("valuations.csv")

async def main():
    # Experiment 1: Clean data (exact matches)
    async with create_session(name="Exact Match") as session:
        result = await merge(
            session=session,
            task="Merge the tables on company name",
            left_table=companies,
            right_table=valuations,
            merge_on_left="company",
            merge_on_right="company",
        )

    # Experiment 2: Company name to ticker (LLM match)
    async with create_session(name="LLM Match") as session:
        result = await merge(
            session=session,
            task="Merge the tables based on company name and ticker",
            left_table=companies,
            right_table=valuations,
        )

asyncio.run(main())

Results

Results across all 5 experiments:

ExperimentAccuracyCostTime
0% noise (baseline)100%$0.006s
5% character corruption100%$0.1023s
10% character corruption100%$0.3443s
Company name to ticker (LLM)100%$1.01203s
CEO name to company (Web)96.3%$2.22151s

The cascade escalates automatically: exact matches are free, fuzzy matches handle typos for free, LLM reasoning handles semantic matches at ~$0.002/row, and web search is used only for stale or obscure data at ~$0.01/row. For the 10% noise experiment, 26.5% of rows matched exactly, 30.8% via fuzzy matching (both free), and only 42.7% required LLM reasoning.

Ready to try it yourself? Run it in the app →