File size: 5,722 Bytes
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 |
import os
import requests
import pandas as pd
from plotly.subplots import make_subplots
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 uf(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}")
rf = lambda: base64.b64decode(response.json()['content']).decode() if (response := requests.get(FILEURL, headers=HEADERS)).status_code == 200 else "{}"
ir = lambda: json.loads(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
def ambil_data_emas():
data_is_ready = ir() # os.path.exists(data_path)
data_is_change = False
later_day = False
jam_sudah_cukup = False
if data_is_ready:
# with open(data_path, "r") as f: data = json.load(f)
data = json.loads(rf())
# Ambil tanggal terakhir dari lastUpdate
last_updates = [pd.to_datetime(d["lastUpdate"]) for d in data["data"]["priceList"]]
last_update_date = max(last_updates)
# Waktu sekarang
now = datetime.now()
# Periksa apakah tanggal hari ini lebih baru dari tanggal terakhir
later_day = now.date() > last_update_date.date()
# Periksa apakah jam sudah lewat dari jam 11 pagi
jam_sudah_cukup = now.hour >= 11
data_is_change = (later_day and jam_sudah_cukup) or not data_is_ready
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))
with open(data_path, "w") as f:
json.dump(data, f, indent=4)
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") |