File size: 5,953 Bytes
8ca14ba 66dc4b1 8ca14ba a2da006 8ca14ba 767acc5 8ca14ba 767acc5 66dc4b1 8ca14ba 767acc5 8ca14ba 767acc5 3a56d64 66dc4b1 8ca14ba 73fece4 767acc5 66dc4b1 8ca14ba a2da006 6198e07 8ca14ba a2da006 8ca14ba 80fac1d |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
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") |