get 9849 days of apple price (open, high, low, close, adjclose)
#django/view
from yahoo_fin import stock_info as si
@csrf_exempt
def history(request):
ticker = json.loads(request.body)['ticker']
if not ticker:
return HttpResponse('ticker not received')
else:
info = si.get_data(ticker)
price = info['adjclose'].values
#replace nan with last number for price
if np.isnan(price[0]): price[0] = 0
lastnum = 0
for i in range(0, len(price)):
if np.isnan(price[i]):
price[i] = lastnum
else:
lastnum = price[i]
open = info['open'].values
#replace nan with adjclose for open
for i in range(0, len(open)):
if np.isnan(open[i]):
open[i] = adjclose[i]
high = info['high'].values
# replace nan with adjclose for high
for i in range(0, len(high)):
if np.isnan(high[i]):
high[i] = adjclose[i]
low = info['low'].values
# replace nan with adjclose for low
for i in range(0, len(low)):
if np.isnan(low[i]):
low[i] = adjclose[i]
close = info['close'].values
# replace nan with adjclose for close
for i in range(0, len(close)):
if np.isnan(close[i]):
close[i] = adjclose[i]
volume = info['volume'].values
#replace nan with 0 for volume
volume[np.isnan(volume)] = 0
#convert datetime to string
date = info.index
date = [x.strftime("%m/%d/%Y") for x in date]
output = json.dumps({'price': price.tolist(),
'volume': volume.tolist(),
'date': date})
return HttpResponse(output)
--------------------------------------
//react/app.js
import React, { useState, useEffect } from 'react';
import './App.css';
import { Button, Tabs, Progress, Menu, Radio, Input } from 'antd';
import ReactHtmlParser from 'react-html-parser';
import StickyHeader from 'react-sticky-header';
import HistoryGraph from './HistoricGraph';
const axios = require('axios');
const { TabPane } = Tabs;
const { SubMenu } = Menu;
function App() {
const [tickers, settickers] = useState(null)
const [ticker_loaded, setticker_loaded] = useState(0)
const [ticker_radio, setticker_radio] = useState('AAPL')
const [about_api, setabout_api] = useState(null)
const [active_menu, setactive_menu] = useState('dow')
const [analyst_info, setanalyst_info] = useState(null)
const [balance_sheet, setbalance_sheet] = useState(null)
const [cash_flow, setcash_flow] = useState(null)
const [holder, setholder] = useState(null)
const [income, setincome] = useState(null)
const [quote, setquote] = useState(null)
const [stats, setstats] = useState(null)
const [historic_price, sethistoric_price] = useState(null)
useEffect(() => {
document.title = "yahoo_fin"
//load all tickers
axios({
method: 'get',
url: 'http://127.0.0.1:8000/stocks/tickers/',
onDownloadProgress: progressEvent => {
setticker_loaded(parseInt(progressEvent.loaded / progressEvent.total * 100))
},
})
.then((response) => {
settickers(response.data)
console.log(response.data)
})
.catch((error) => {
console.log(error)
})
}, [])
const about_yahoo_fin = () => {
//yahoo_fin api page
axios({
method: 'get',
url: 'http://127.0.0.1:8000/stocks/about_yahoo_fin/',
})
.then((response) => {
setabout_api(response.data)
})
.catch((error) => {
console.log(error)
})
}
const get_analysts_info = () => {
//get_analysts_info
axios({
method: 'post',
url: 'http://127.0.0.1:8000/stocks/analysts/',
data: {
'ticker': ticker_radio,
}
})
.then((response) => {
setanalyst_info(response.data)
})
.catch((error) => {
console.log(error)
})
}
const get_balance_sheet = () => {
//get_balance_sheet
axios({
method: 'post',
url: 'http://127.0.0.1:8000/stocks/balance/',
data: {
'ticker': ticker_radio,
}
})
.then((response) => {
setbalance_sheet(response.data)
})
.catch((error) => {
console.log(error)
})
}
const get_cash_flow = () => {
//get_cash_flow
axios({
method: 'post',
url: 'http://127.0.0.1:8000/stocks/cash/',
data: {
'ticker': ticker_radio,
}
})
.then((response) => {
setcash_flow(response.data)
})
.catch((error) => {
console.log(error)
})
}
const get_holders = () => {
//get_holders
axios({
method: 'post',
url: 'http://127.0.0.1:8000/stocks/holder/',
data: {
'ticker': ticker_radio,
}
})
.then((response) => {
setholder(response.data)
})
.catch((error) => {
console.log(error)
})
}
const get_income_statement = () => {
//get_income_statement
axios({
method: 'post',
url: 'http://127.0.0.1:8000/stocks/income/',
data: {
'ticker': ticker_radio,
}
})
.then((response) => {
setincome(response.data)
})
.catch((error) => {
console.log(error)
})
}
const get_quote_table = () => {
//get_quote_table
axios({
method: 'post',
url: 'http://127.0.0.1:8000/stocks/quote/',
data: {
'ticker': ticker_radio,
}
})
.then((response) => {
setquote(response.data)
})
.catch((error) => {
console.log(error)
})
}
const get_stats = () => {
//get_stats
axios({
method: 'post',
url: 'http://127.0.0.1:8000/stocks/stats/',
data: {
'ticker': ticker_radio,
}
})
.then((response) => {
setstats(response.data)
})
.catch((error) => {
console.log(error)
})
}
const get_history = () => {
//get_data
axios({
method: 'post',
url: 'http://127.0.0.1:8000/stocks/history/',
data: {
'ticker': ticker_radio,
}
})
.then((response) => {
sethistoric_price(response.data)
console.log(response.data)
})
.catch((error) => {
console.log(error)
})
}
//left tab click event
const tabChange = (key) => {
switch (key) {
case '2':
get_analysts_info()
break
case '3':
about_yahoo_fin()
break
case '4':
get_balance_sheet()
break
case '5':
get_cash_flow()
break
case '6':
get_holders()
break
case '7':
get_income_statement()
break
case '8':
get_quote_table()
break
case '9':
get_stats()
break
case '10':
get_history()
break
default:
break
}
}
//Tickers tab menu click event
const menuClick = (e) => {
setactive_menu(e.key)
}
//Tickers radio select event
const radioSelect = (e) => {
setticker_radio(e.target.value)
}
return (
<div style={{ padding: '10px' }}>
<Tabs tabPosition='left' defaultActiveKey="1" onChange={(key) => tabChange(key)}>
<TabPane tab="Tickers" key="1">
Loading tickers
<StickyHeader
header={<span style={{ float: 'right', backgroundColor: 'white', padding: '10px' }}>
Selected ticker: {ticker_radio}</span>}>
</StickyHeader>
<Progress percent={ticker_loaded} size='small' />
<Menu onClick={(e) => menuClick(e)} selectedKeys={[active_menu]} mode='horizontal'>
<Menu.Item key='dow'>Dow</Menu.Item>
<Menu.Item key='nasdaq'>Nasdaq</Menu.Item>
<Menu.Item key='sp500'>SP500</Menu.Item>
<Menu.Item key='other'>Other</Menu.Item>
</Menu><br />
{tickers ?
<Radio.Group onChange={(e) => radioSelect(e)}>
{
tickers[active_menu].map((item, index) => {
return <Radio value={item} key={index}>{item}</Radio>
})
}
</Radio.Group>
: null}
</TabPane>
<TabPane tab="History" key="10">
Ticker: {ticker_radio}<br />
<HistoryGraph open={historic_price ? historic_price['open'] : null}
close={historic_price ? historic_price['close'] : null}
high={historic_price ? historic_price['high'] : null}
low={historic_price ? historic_price['low'] : null}
adjclose={historic_price ? historic_price['adjclose'] : null}
volume={historic_price ? historic_price['volume'] : null}
date={historic_price ? historic_price['date'] : null}>
</HistoryGraph>
</TabPane>
<TabPane tab="Analyst" key="2">
Ticker: {ticker_radio}<br />
<pre>{analyst_info}</pre>
</TabPane>
<TabPane tab="Balance" key="4">
Ticker: {ticker_radio}<br />
<pre>{balance_sheet}</pre>
</TabPane>
<TabPane tab="Cash" key="5">
Ticker: {ticker_radio}<br />
<pre>{cash_flow}</pre>
</TabPane>
<TabPane tab="Holder" key="6">
Ticker: {ticker_radio}<br />
<pre>{holder}</pre>
</TabPane>
<TabPane tab="Income" key="7">
Ticker: {ticker_radio}<br />
<pre>{income}</pre>
</TabPane>
<TabPane tab="Quote" key="8">
Ticker: {ticker_radio}<br />
<pre>{quote}</pre>
</TabPane>
<TabPane tab="Stats" key="9">
Ticker: {ticker_radio}<br />
<pre>{stats}</pre>
</TabPane>
<TabPane tab="Yahoo_fin" key="3">
{ReactHtmlParser(about_api)}
</TabPane>
</Tabs>
</div>
);
}
export default App;
reference:
http://chuanshuoge2.blogspot.com/2020/01/react-canvasjs-django-yahoofin.html
No comments:
Post a Comment