semvec/pypi-packages huggingface dataset:
crypto-monitor 0.2.3
Lightweight real-time cryptocurrency market monitor via WebSocket
License: MIT
Requires Python: >=3.8
Keywords: crypto, binance, websocket, realtime, market-data, monitor


## Intro

- Monitors the entire crypto market kline (candlestick) data, showing 20 symbols only below for illustration
- [Other tools](https://github.com/orgs/SerenaTradingResearch/repositories)

![](https://raw.githubusercontent.com/SerenaTradingResearch/crypto-monitor/main/test/data/CryptoMonitor.gif)

## Usage

```bash
pip install crypto-monitor
```

- You can either react to individual symbol updates by defining a callback `on_change` as shown below
- Or define a task like `plot_task` below that handles all symbols (`x.data`) repeatedly
    ```py
    x.data: Dict[str, np.ndarray]
    x.update_time: Dict[str, int]
    print(x.data["BTCUSDT"], x.update_time["BTCUSDT"])
    ```

```py
import asyncio
from typing import List

import numpy as np
from crypto_data_downloader.binance import ALL_COLUMNS
from crypto_data_downloader.utils import format_date, plot_crypto_data, timestamp
from PIL import Image

from crypto_monitor.binance import CryptoMonitor
from crypto_monitor.utils import safe_exit, save_gif


async def main():
    async def on_change(sym: str, arr: np.ndarray, e_time: int):
        if sym == "BTCUSDT":
            f = format_date
            print(
                f"BTC. my time: {f(timestamp())}, event time: {f(e_time)}, price: {arr[-1, 1]}"
            )

    x = CryptoMonitor()
    x.quote = "USDT"  # Quote asset
    x.interval = "5m"  # Kline time interval
    x.columns = ["open_time", "close"]  # Data columns to include
    print(f"All data columns: {ALL_COLUMNS}")
    x.kline_lim = 10  # Only show 10 time steps for clearer visualization
    x.market = ["SPOT", "MARGIN"][1]
    x.max_num = 20  # Only show 20 symbols for visualization
    x.on_change = on_change

    async def plot_task():
        frames: List[Image.Image] = []
        while True:
            await asyncio.sleep(2)
            safe_exit.check()
            if len(x.data):
                id = "data/CryptoMonitor"
                plot_crypto_data(x.data, id)
                frames.append(Image.open(f"{id}.png").copy())
                assert len(frames) < 150, save_gif(frames, id, fps=5)

    await asyncio.gather(x.watch(), plot_task())


asyncio.run(main())

```

- Output

```bash
All data columns: ['open_time', 'open', 'high', 'low', 'close', 'volume', 'close_time', 'quote_volume', 'n_trades', 'taker_buy_base_volume', 'taker_buy_quote_volume', 'unused']
weight lim: 5000/6000, USDT symbols: 599, spot: 559, margin: 403
BTC. my time: 2025-08-07 04:10:22, event time: 2025-08-07 04:10:22, price: 114639.92
BTC. my time: 2025-08-07 04:10:24, event time: 2025-08-07 04:10:24, price: 114639.91
BTC. my time: 2025-08-07 04:10:26, event time: 2025-08-07 04:10:26, price: 114639.92
...
```
qc-structure 0.1.1
入試問題構造情報ライブラリ - WordファイルとJSON構造データを統合処理
License: MIT
Requires Python: >=3.7
Keywords: word, docx, structure, exam, 質保証, QC

# qc-structure

**入試問題構造情報ライブラリ** - WordファイルとJSON構造データを統合処理するPythonライブラリ

[![PyPI version](https://badge.fury.io/py/qc-structure.svg)](https://badge.fury.io/py/qc-structure)
[![Python versions](https://img.shields.io/pypi/pyversions/qc-structure.svg)](https://pypi.org/project/qc-structure/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

## 概要

`qc-structure` は、試験問題などの構造化されたWord文書（`.docx`）を扱うためのPythonライブラリです。

外部の構造定義ファイル（`structure.json`）とWord文書を紐付け、各段落にPID（Paragraph ID）や役割（Role）などのメタデータを付与した「拡張段落オブジェクト」として操作可能にします。

### 主な機能

- Word文書の段落と、別管理の構造情報（JSON）の動的なマッピング
- PIDや階層レベル（`level`）、論理ID（`q1-1` 等）への容易なアクセス
- 表内の段落を含む、文書内の全段落の統一的な反復処理
- Word内部ID（`paraId`、`textId`）を活用した堅牢なアンカリング

## インストール

```bash
pip install qc-structure
```

## 必要要件

- Python 3.7 以上
- python-docx >= 0.8.11

## 基本的な使い方

```python
from qc_structure import load_exam_document

# パス指定
docx_path = "exam.docx"
structure_path = "structure.json"

# ドキュメントのロード
doc = load_exam_document(docx_path, structure_path)

# 段落の処理
for p in doc.paragraphs:
    # EnhancedParagraph のプロパティにアクセス
    pid_str = f"[{p.pid}]" if p.pid else "[----]"
    
    # role や id 情報があれば表示
    info = []
    if p.role: 
        info.append(f"Role={p.role}")
    if p.id:   
        info.append(f"ID={p.id}")
    
    # 元の段落のテキスト (p.text でアクセス可能)
    print(f"{pid_str} {p.text[:20]}... {' '.join(info)}")
    
    # docx.Paragraph の機能もそのまま利用可能
    # if p.style.name == 'Heading 1': ...
```

## データ構造

### structure.jsonの形式

```json
{
  "questions": [
    {
      "id": "q1",
      "role": "大問",
      "start_pid": "p0001",
      "end_pid": "p0037",
      "parent_id": null,
      "level": 0,
      "start_para_id": "1A2B3C4D",
      "start_text_id": "3DA2EBA2",
      "start_text_hash": "58110af8...",
      "header_pid": "p0001",
      "label_text": "1"
    }
  ]
}
```

マッピングは`start_para_id`（Wordの内部ID）をキーとして行われます。これにより、PIDが振り直された場合やテキストが微修正された場合でも、Wordの内部IDが維持されている限り構造とのリンクが保たれます。

## EnhancedParagraph の主なプロパティ

- `pid` (str | None): 段落ID（例: `p0001`）
- `role` (str | None): 役割（例: `大問`、`小問`）
- `id` (str | None): 論理ID（例: `q1`、`q1-1`）
- `level` (int | None): 階層レベル（0=大問、1=小問...）
- `text` (str): 段落のテキスト内容
- `structure` (dict | None): 構造データの生情報

その他多数のプロパティについては、[仕様書](仕様書_qc_core.md)を参照してください。

## ライセンス

MIT License

## 作者

kamarume

## リンク

- [PyPI](https://pypi.org/project/qc-structure/)
- [GitHub](https://github.com/kamarume/qc-structure)
- [ドキュメント](https://github.com/kamarume/qc-structure/blob/main/仕様書_qc_core.md)