AICR-LAGI / data /data.py
Adityadn's picture
Update data/data.py
a2da006 verified
import os
import requests
import pandas as pd
from plotly.subplots import make_subplots
import threading
import plotly
import plotly.graph_objects as go
from tqdm import tqdm
from datetime import datetime
import pytz
import json
import base64
plotly.io.defaults.default_height = 720
plotly.io.defaults.default_width = 1440
GITHUB_TOKEN = os.getenv("GITHUB_TOKEN")
OWNER = os.getenv("OWNER")
REPO = os.getenv("REPO")
HEADERS = {
"Authorization": f"token {GITHUB_TOKEN}",
}
FILEPATH = "data/data.json"
FILEURL = f"https://api.github.com/repos/{OWNER}/{REPO}/contents/{FILEPATH}"
def puf(filepath, content):
fileurl = f"https://api.github.com/repos/{OWNER}/{REPO}/contents/{filepath}"
response = requests.get(fileurl, headers=HEADERS)
is_update = response.status_code == 200
res = response.json()
sha = res["sha"] if is_update else None
if is_update and content == res: return
data = {
"message": "Update" if is_update else "Upload",
"content": base64.b64encode(
content.encode() if isinstance(content, str) else content
).decode()
}
if is_update: data["sha"] = sha
resp = requests.put(fileurl, headers=HEADERS, json=data)
print("βœ… Upload success" if resp.ok else f"❌ Error: {resp.text}")
uf = lambda filepath, content: threading.Thread(target=puf, args=(filepath, content)).start()
rf = lambda: json.loads(base64.b64decode(response.json()['content']).decode() if (response := requests.get(FILEURL, headers=HEADERS)).status_code == 200 else "{}")
ir = lambda d=None: (d or rf() != {})
lhs = [7, 15, 30, 60, 90, 120, 240, 365, 1000, 1440]
header_fill_color = [
"#d9d9d9", # No - abu netral
"#add8e6", # Tgl Beli - biru muda (tanggal = waktu)
"#9be7a3", # Harga Beli/g - hijau terang (uang masuk)
"#fdd9a0", # Berat - oranye terang (fisik)
"#f4b6c2", # Modal - merah muda (biaya awal)
"#87cefa", # Tgl Jual - biru langit (tanggal = waktu)
"#b2fab4", # Harga Jual/g - hijau pastel (uang keluar / potensi untung)
"#fff5ba", # Nilai Jual - kuning pastel (nilai total)
"#ffadc1", # Profit/Loss - merah muda (untung/rugi)
]
cells_fill_color = [
"#eeeeee", # No - abu netral lebih lembut
"#e6f2ff", # Tgl Beli
"#d5fbe3", # Harga Beli/g
"#ffecd9", # Berat
"#ffe0e8", # Modal
"#e0f2ff", # Tgl Jual
"#dcfce7", # Harga Jual/g
"#fff9db", # Nilai Jual
"#ffe6ef", # Profit/Loss
]
data = None
data_dir = "data"
data_path = os.path.join(data_dir, "data.json")
os.makedirs(data_dir, exist_ok=True)
makeslcy = lambda x: -0.575 - (7 - x) * (0.575 / 7) * 5
data = None
def ambil_data_emas():
global data
later_day = False
jam_sudah_cukup = False
days_diff = 0
data = data or rf()
data_is_ready = ir(data) # os.path.exists(data_path)
print("data_is_ready", data_is_ready)
if data_is_ready:
# with open(data_path, "r") as f: data = json.load(f)
# Ambil tanggal terakhir dari lastUpdate
last_update_date = max([pd.to_datetime(d["lastUpdate"]) for d in data["data"]["priceList"]]).date()
# Waktu sekarang
now = datetime.now()
# Periksa apakah tanggal hari ini lebih baru dari tanggal terakhir
later_day = now.date() > last_update_date
print(later_day, now.date(), last_update_date)
days_diff = int((now.date() - last_update_date).days)
print(days_diff)
# Periksa apakah jam sudah lewat dari jam 11 pagi
jam_sudah_cukup = now.hour >= 11
print(jam_sudah_cukup)
data_is_change = (later_day and jam_sudah_cukup) or not data_is_ready or days_diff >= 2
print("data_is_change", data_is_change)
# Jika belum ada data, atau sudah lewat tanggal dan cukup jam
if data_is_change:
url = f"https://sahabat.pegadaian.co.id/gold/prices/chart?interval={max(lhs)}&isRequest=true"
response = requests.get(url)
if response.status_code != 200:
raise Exception("Gagal mengambil data harga dari Pegadaian.")
data = response.json()
uf(FILEPATH, json.dumps(data, indent=4))
try:
with open(data_path, "w") as f:
json.dump(data, f, indent=4)
except: pass
print(len(data["data"]["priceList"]))
return data
fred = {
60: "D",
90: "2D",
180: "3D",
360: "4D",
480: "5D",
1000: "3W",
2500: "6W",
"Default": "9W"
}
frek = list(fred.keys())
frev = list(fred.values())
default_hari = 90
def get_freq(lama_hari):
if len(frek) !=len(frev):
raise Exception("Len Frek !=Len Frev")
freq = frev[-1]
for i in range(len(frek)):
if frek[i] !=frek[-1] and lama_hari <=int(frek[i]) and lama_hari >=int(frek[i-1] if frek[i-1] !=frek[-1] else 0):
freq = frev[i]
break
return freq
# Data pembelian
tanggal_beli = [
pd.Timestamp(d) for d in [
# "2025-04-10",
"2025-04-14",
"2025-06-04",
"2025-06-08",
"2025-06-10"
]
]
berat_gram = [
# 1,
0.0101,
1.0817,
0.2182,
0.0816,
]
uang_awal = [
# 1_671_000,
18_648,
2_000_000,
400_000,
150_000,
]
harga_beli_dan_jual_pada_saat_membeli = [
[1_863_000, 1_797_000], [1_834_000, 1_769_000], [1_840_000, 1_775_000]
]
harga_beli_dan_jual_saat_ini = [1_840_000, 1_775_000]
tglf = lambda tgl: pd.to_datetime(tgl, format='%Y-%m-%d %H:%M:%S')
cwta = [2.5, 6.6, 11.75, 7, 10, 6.6, 12.5, 16.6, 11]
misy = "-"
data = ambil_data_emas()
# Ambil timestamp string dari data
timestamp_utc = data["timestamp"]
# Parsing ISO format ke datetime object (timezone-aware UTC)
dt_utc = datetime.fromisoformat(timestamp_utc.replace("Z", "+00:00"))
# Konversi ke zona waktu WIB (UTC+7)
wib = pytz.timezone("Asia/Jakarta")
dt_wib = dt_utc.astimezone(wib)
# Format menjadi string lokal
timestamp_lokal = dt_wib.strftime("%d %B %Y, %H:%M WIB")