swaschke / pypnf

GNU General Public License v2.0
18 stars 15 forks source link

Using with pyodide #2

Closed fivethreeo closed 7 months ago

fivethreeo commented 1 year ago
<!doctype html>
<html>

<head>
  <script src="https://cdn.jsdelivr.net/pyodide/v0.23.2/full/pyodide.js"></script>
</head>

<body>
  Pyodide test page <br>
  Open your browser console to see Pyodide output
  <script type="text/javascript">

    // Define box size and reversal amount
    const boxSize = 0.5;
    const reversalAmount = 3;

    // Fetch minute data from the Alpha Vantage API
    const apiKey = '';
    const symbol = 'TSLA';
    const apiUrl = `https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&outputsize=full&symbol=${symbol}&interval=1min&apikey=${apiKey}`;

    async function main() {
      let pyodide = await loadPyodide();
      await pyodide.loadPackage("micropip");
      const micropip = pyodide.pyimport("micropip");
      await micropip.install('setuptools');
      await micropip.install('pypnf');

      fetch(apiUrl)
        .then(response => response.json())
        .then(data => {
          const timeSeries = data['Time Series (1min)'];
          const minuteData = Object.entries(timeSeries).map(([date, values]) => ({
            date: date,
            open: parseFloat(values['1. open']),
            high: parseFloat(values['2. high']),
            low: parseFloat(values['3. low']),
            close: parseFloat(values['4. close']),
            volume: parseFloat(values['5. volume'])
          }));
          console.log(pyodide.runPython(`
            from pypnf import PointFigureChart

            ts={k: [dic[k] for dic in minuteData] for k in minuteData[0]}
            pnf = PointFigureChart(
              ts=ts,
              method='cl',
              reversal=reversalAmount,
              boxsize=boxSize,
              scaling='abs',
              title=symbol
            )
            pnf.get_trendlines(length=4, mode='strong')
            print(pnf.next_simple_signal())
            print(pnf)
            `, {
            globals: pyodide.toPy({
              minuteData: minuteData,
              boxSize: boxSize,
              reversalAmount: reversalAmount,
              symbol: symbol
            })
          }));
        }).catch(error => console.log(error));
    }

    main();
  </script>
</body>

</html>