Skip to content

Instantly share code, notes, and snippets.

@douglasstarnes
Last active October 19, 2021 13:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save douglasstarnes/d078ada39fe7d0eff21553c9ab2731ba to your computer and use it in GitHub Desktop.
Save douglasstarnes/d078ada39fe7d0eff21553c9ab2731ba to your computer and use it in GitHub Desktop.
FARM Stack Demo Code

The Python project requires

  • fastapi
  • yfinance
  • uvicorn
  • mongita

The React project requires

  • axios
  • recharts

Run the backend project with the command: $ uvicorn main:app --host '0.0.0.0' --port 8000 --reload

Run the frontend project with the command: npm start

import logo from './logo.svg';
import './App.css';
import {useState, useEffect} from 'react';
import axios from 'axios';
import {BarChart, Bar, YAxis} from 'recharts';
function App() {
const [history, setHistory] = useState([])
const [symbol, setSymbol] = useState('MSFT')
const getData = async () => {
const {data} = await axios
.get(`http://localhost:8000/history/${symbol}`)
setHistory(data)
console.log(data)
}
useEffect(() => {
getData();
}, []);
return (
<div className="App">
<>
<input type="text" onChange={event => setSymbol(event.target.value)} />
<button onClick={event => getData()}>Get History</button>
<BarChart width={800} height={600} data={history}>
<YAxis />
<Bar dataKey="close" fill="#ff0000" />
</BarChart>
</>
</div>
);
}
export default App;
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware
from pydantic import BaseModel
from mongita import MongitaClientDisk
import yfinance as yf
class PortfolioItem(BaseModel):
name: str
symbol: str
no_shares: int
app = FastAPI()
client = MongitaClientDisk()
db = client.db
portfolio = db.portfolio
app.add_middleware(
CORSMiddleware,
allow_origins=["*"], # DON'T DO THIS IN PRODUCTION!
allow_credentials=True,
allow_headers=["*"],
allow_methods=["*"]
)
def get_current(symbol, shares):
stock_info = yf.Ticker(symbol).info
return {'current_price': stock_info['currentPrice'] * shares}
@app.get('/')
async def home():
return {'home': 'sweet home'}
@app.get('/current/{symbol}')
async def current(symbol: str, shares: int = 1):
return get_current(symbol, shares)
@app.get('/history/{symbol}')
async def history(symbol: str):
stock_history = yf.Ticker(symbol).history('1mo')
stock_close = stock_history['Close']
return [
{"name": ts, "close": closing} for ts, closing in zip(
[tsp.strftime('%Y-%m-%d') for tsp in stock_close.index],
[float(c) for c in stock_close.values]
)
]
@app.get('/portfolio')
async def get_portfolio():
trades = portfolio.find({})
return [
{
"name": trade["name"],
"symbol": trade["symbol"],
"no_shares": trade["no_shares"],
"value": get_current(trade["symbol"], trade["no_shares"])
} for trade in trades
]
@app.post('/portfolio')
async def post_portfolio(item: PortfolioItem):
portfolio.insert_one(item.dict())
return item
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment