Spaces:
Sleeping
Sleeping
Download load_data.py from akisov/order-forecast: direct link, hf CLI and curl.
- Browser
- Download file 2.95 kB
-
https://huggingface.co/spaces/akisov/order-forecast/resolve/main/load_data.py
- Command line
-
hf download hf://spaces/akisov/order-forecast/load_data.py
-
curl -L -o load_data.py https://huggingface.co/spaces/akisov/order-forecast/resolve/main/load_data.py
2.95 kB
| """Скрипт для загрузки xlsx-файлов из data/new_data в DuckDB напрямую (без Streamlit).""" | |
| import os | |
| import duckdb | |
| import pandas as pd | |
| DB_PATH = "data/orders.duckdb" | |
| DATA_DIR = "data/new_data" | |
| SCHEMA = """ | |
| CREATE TABLE IF NOT EXISTS orders ( | |
| date DATE NOT NULL, | |
| hour SMALLINT NOT NULL, | |
| tt_id VARCHAR NOT NULL, | |
| region VARCHAR, | |
| service_id INTEGER NOT NULL DEFAULT -1, | |
| cnt_parcel INTEGER NOT NULL DEFAULT 0, | |
| cnt_courier INTEGER NOT NULL DEFAULT 0 | |
| ); | |
| CREATE UNIQUE INDEX IF NOT EXISTS idx_order ON orders (date, hour, tt_id, service_id); | |
| """ | |
| def load_xlsx(path: str) -> pd.DataFrame: | |
| df = pd.read_excel(path) | |
| df = df.rename(columns={ | |
| "shopNo": "tt_id", | |
| "id_service": "service_id", | |
| "region_tt": "region", | |
| }) | |
| df["tt_id"] = df["tt_id"].astype(str) | |
| df["date"] = pd.to_datetime(df["date"]).dt.date | |
| df["hour"] = df["hour"].astype(int) | |
| df["service_id"] = pd.to_numeric(df["service_id"], errors="coerce").fillna(-1).astype(int) | |
| df["cnt_parcel"] = pd.to_numeric(df["cnt_parcel"], errors="coerce").fillna(0).astype(int) | |
| df["cnt_courier"] = pd.to_numeric(df["cnt_courier"], errors="coerce").fillna(0).astype(int) | |
| df["region"] = df["region"].astype(str).str.strip() | |
| return df[["date", "hour", "tt_id", "region", "service_id", "cnt_parcel", "cnt_courier"]] | |
| os.makedirs("data", exist_ok=True) | |
| con = duckdb.connect(DB_PATH) | |
| for stmt in SCHEMA.strip().split(";"): | |
| s = stmt.strip() | |
| if s: | |
| con.execute(s) | |
| files = sorted([f for f in os.listdir(DATA_DIR) if f.endswith(".xlsx")]) | |
| print(f"Найдено файлов: {len(files)}") | |
| total_inserted = 0 | |
| for fname in files: | |
| path = os.path.join(DATA_DIR, fname) | |
| print(f"\nЗагружаю: {fname}...", flush=True) | |
| df = load_xlsx(path) | |
| before = con.execute("SELECT COUNT(*) FROM orders").fetchone()[0] | |
| con.register("_tmp", df) | |
| con.execute(""" | |
| INSERT OR IGNORE INTO orders | |
| (date, hour, tt_id, region, service_id, cnt_parcel, cnt_courier) | |
| SELECT date, hour, tt_id, region, service_id, cnt_parcel, cnt_courier | |
| FROM _tmp | |
| """) | |
| con.unregister("_tmp") | |
| after = con.execute("SELECT COUNT(*) FROM orders").fetchone()[0] | |
| inserted = after - before | |
| total_inserted += inserted | |
| print(f" Строк в файле: {len(df):,} | Вставлено: {inserted:,}") | |
| print(f"\n{'='*40}") | |
| print(f"Итого вставлено: {total_inserted:,}") | |
| print(f"Всего в БД: {con.execute('SELECT COUNT(*) FROM orders').fetchone()[0]:,}") | |
| print("\nСтатистика по ТТ:") | |
| stats = con.execute(""" | |
| SELECT region, COUNT(DISTINCT tt_id) as tts, SUM(cnt_parcel) as orders, MIN(date), MAX(date) | |
| FROM orders GROUP BY region ORDER BY region | |
| """).df() | |
| print(stats.to_string()) | |
| con.close() | |
| print("\nГотово!") | |