how to make yaxis ticks as hyperlink in flot graphs - flot

I am creating a line graph with flot library and in y-axis all my ticks are abbreviation and i want to make all my ticks as hyperlink so on open of a page they get more details about abb.
Here is my code to make y-axis:
var ranks = Context.CreateDataContext().Ranks.OrderBy(c => c.RankID);
var yaxis = new StringBuilder(" { yaxis : {ticks:[");
foreach (var item in ranks)
{
if (item.RankID == 0)
yaxis.AppendFormat(#"[{0},'{1}'],", item.RankID, "None");
if (item.RankID == 1)
yaxis.AppendFormat(#"[{0},'{1}'],", item.RankID, "AMB");
if (item.RankID == 2)
yaxis.AppendFormat(#"[{0},'{1}'],", item.RankID, "BA");
if (item.RankID == 3)
yaxis.AppendFormat(#"[{0},'{1}'],", item.RankID, "SA");
if (item.RankID == 4)
yaxis.AppendFormat(#"[{0},'{1}'],", item.RankID, "GA");
if (item.RankID == 5)
yaxis.AppendFormat(#"[{0},'{1}'],", item.RankID, "PA");
if (item.RankID == 6)
yaxis.AppendFormat(#"[{0},'{1}'],", item.RankID, "RA");
if (item.RankID == 7)
yaxis.AppendFormat(#"[{0},'{1}'],", item.RankID, "EA");
if (item.RankID == 8)
yaxis.AppendFormat(#"[{0},'{1}'],", item.RankID, "DA");
if (item.RankID == 9)
yaxis.AppendFormat(#"[{0},'{1}'],", item.RankID, "DDA");
if (item.RankID == 10)
yaxis.AppendFormat(#"[{0},'{1}'],", item.RankID, "TDA");
if (item.RankID == 11)
yaxis.AppendFormat(#"[{0},'{1}'],", item.RankID, "PDA");
if (item.RankID == 12)
yaxis.AppendFormat(#"[{0},'{1}'],", item.RankID, "CDA");
}
yaxis.Append("]}}");
and i want to make "AMB","BA","SA","GA"....all as links or tooltip..
Thanks!!

You can try the tickFormatter option to customize the tick labels (see the documentation for more details). A starting point:
function formatter(val, axis) {
return '<span title="' + getFullNameForAbbreviation(val) + '">' + val + '</span>';
}
You will have to add the function to get the full names from the abbreviations.

Related

Onvalue of Checkbutton always = 0 python I also use get()

I had two codes, since I combined them, chechbox always = 0
(When I run the code separately, it works fine)
from tkinter import *
from tkinter import messagebox
from tkinter import ttk
from convert_number2text import convert_ordinary
from pyperclip import copy, paste
import csv
from jdatetime import datetime, date
from show_factor import show_factors
from os import listdir
class Program:
def __init__(self):
self.root = Tk()
self.root.title("Accounting")
self.root.minsize(800, 600)
Button(self.root, text="فاکتور نوشتن", font=("",20),bg="red", command=self.factor_new).pack()
Button(self.root, text="فاکتور های ثبت شده", font=("",20),bg="red", command=show_factors).pack()
Button(self.root, text="افزودن کارت", font=("",20),bg="red").pack()
self.root.mainloop()
def show_factors():
win_show_factor = Tk()
win_show_factor.title("show factors")
win_show_factor.minsize(940, 600)
Label(win_show_factor, text="کد فاکتور", font=("",16)).place(x=760 ,y=10)
entry_code_factor = Entry(win_show_factor, font=("", 16), width=7)
entry_code_factor.place(x=755, y=40)
Label(win_show_factor, text="نام مشتری", font=("",16)).place(x=760, y=80)
entry_name_factor = Entry(win_show_factor, font=("", 16))
entry_name_factor.place(x=670, y=110)
Label(win_show_factor, text="اطلاعات فاکتور", font=("",16)).place(x=240, y=10)
entry_info_factor = Text(win_show_factor, font=("", 13), width=30, height=7)
entry_info_factor.place(x=160, y=40)
Label(win_show_factor, text="سال", font=("", 16)).place(x=540,y=5)
combo_y= ttk.Combobox(win_show_factor, values=["1400"])
for i in range(1401, 1420):
combo_y['values'] += (i,)
combo_y.set("1400")
combo_y.place(x=480,y=35)
Label(win_show_factor, text="ماه", font=("", 16)).place(x=540, y=60)
combo_m= ttk.Combobox(win_show_factor, values=["1"])
for i in range(2, 13):
combo_m['values'] += (i,)
combo_m.set("1")
combo_m.place(x=480, y=90)
Label(win_show_factor, text="روز", font=("", 16)).place(x=530, y=115)
combo_d= ttk.Combobox(win_show_factor, values=["1"])
for i in range(2, 32):
combo_d['values'] += (i,)
combo_d.set("1")
combo_d.place(x=480, y=150)
list_box_find = ttk.Treeview(win_show_factor, column=("c1", "c2", "c3", "c4", "c5"), show='headings')
list_box_find.column("# 1", anchor=CENTER,width=220)
list_box_find.heading("# 1", text="نام مشتری")
list_box_find.column("# 2", anchor=CENTER, width=60)
list_box_find.heading("# 2", text="کد فاکتور")
list_box_find.column("# 3", anchor=CENTER, width=150)
list_box_find.heading("# 3", text="تاریخ")
list_box_find.column("# 4", anchor=CENTER, width=100)
list_box_find.heading("# 4", text="مبلغ فاکتور")
list_box_find.column("# 5", anchor=CENTER, width=400)
list_box_find.heading("# 5", text="اطلاعات بیشتر")
list_box_find.place(x=3, y=200)
by_name = IntVar()
r1 = Checkbutton(win_show_factor, text="جستجو با نام مشتری", variable=by_name)
by_code = IntVar()
r1.place(x=10,y=10)
r2 = Checkbutton(win_show_factor, text="جستجو با کد فاکتور", variable=by_code)
by_date = IntVar()
r2.place(x=10, y=40)
r3 = Checkbutton(win_show_factor, text="جستجو با تاریخ", variable=by_date)
r3.place(x=10, y=70)
by_info = IntVar()
r4 = Checkbutton(win_show_factor, text="جستجو با اطلاعات", variable=by_info)
r4.place(x=10, y=100)
def search():
for item in list_box_find.get_children():
list_box_find.delete(item)
list_items = []
list_file = listdir(r"G:\check file\python\Accounting\factors")
for j in list_file:
file_csv = "G:/check file/python/Accounting/factors/{}".format(j)
with open(file_csv, encoding="utf-8") as Rfile_csv:
read_csv = csv.reader(Rfile_csv)
x = 0
for i in read_csv:
if x == 0:
name_moshtari = i[0]
Purchase_code = i[1]
tarikhe_buy = i[2]
price_all = i[3]
elif x == 1:
more_info = i[0]
poole_naghd = i[1]
poole_kart = i[2]
poole_nasiye = i[3]
else:
list_items.insert(len(list_items), i)
x +=1
name_check = name_moshtari.strip().find(entry_name_factor.get().strip())
info_check = -1
for i in more_info.split():
if i.find(entry_info_factor.get("1.0", END).strip()) != -1:
info_check = 0
code_check = Purchase_code.strip().find(entry_code_factor.get().strip())
date_check = -1
date_factor = tarikhe_buy[:tarikhe_buy.find(" ")]
date_find = date(int(combo_y.get()), int(combo_m.get()), int(combo_d.get()))
if str(date_find) == date_factor :
date_check = 0
d=1
c=1
n=1
f=1
print(by_code.get(),by_date.get(),by_info.get(),by_name.get())
if by_date.get():
d = 2
if by_code.get():
c = 3
if by_name.get():
n = 4
if by_info.get():
f = 5
j = d * c * n * f
if (j == 5) and (info_check != -1):
list_box_find.insert("",END, values=([name_moshtari, Purchase_code, tarikhe_buy, price_all, more_info]))
if (j == 4) and (name_check != -1):
list_box_find.insert("",END, values=([name_moshtari, Purchase_code, tarikhe_buy, price_all, more_info]))
if (j == 3) and (code_check != -1):
list_box_find.insert("",END, values=([name_moshtari, Purchase_code, tarikhe_buy, price_all, more_info]))
if (j == 2) and (date_check != -1):
list_box_find.insert("",END, values=([name_moshtari, Purchase_code, tarikhe_buy, price_all, more_info]))
if (j == 6) and (date_check != -1) and (code_check != -1):
list_box_find.insert("",END, values=([name_moshtari, Purchase_code, tarikhe_buy, price_all, more_info]))
if (j == 8) and (date_check != -1) and (name_check != -1):
list_box_find.insert("",END, values=([name_moshtari, Purchase_code, tarikhe_buy, price_all, more_info]))
if (j == 10) and (info_check != -1) and (date_check != -1):
list_box_find.insert("",END, values=([name_moshtari, Purchase_code, tarikhe_buy, price_all, more_info]))
if (j == 12) and (name_check != -1) and (code_check != -1):
list_box_find.insert("",END, values=([name_moshtari, Purchase_code, tarikhe_buy, price_all, more_info]))
if (j == 15) and (info_check != -1) and (code_check != -1):
list_box_find.insert("",END, values=([name_moshtari, Purchase_code, tarikhe_buy, price_all, more_info]))
if (j == 20) and (info_check != -1) and (name_check != -1):
list_box_find.insert("",END, values=([name_moshtari, Purchase_code, tarikhe_buy, price_all, more_info]))
if (j == 24) and (date_check != -1) and (code_check != -1) and (name_check != -1):
list_box_find.insert("",END, values=([name_moshtari, Purchase_code, tarikhe_buy, price_all, more_info]))
if (j == 30) and (date_check != -1) and (code_check != -1) and (info_check != -1):
list_box_find.insert("",END, values=([name_moshtari, Purchase_code, tarikhe_buy, price_all, more_info]))
if (j == 40) and (date_check != -1) and (name_check != -1) and (info_check != -1):
list_box_find.insert("",END, values=([name_moshtari, Purchase_code, tarikhe_buy, price_all, more_info]))
if (j == 60) and (code_check != -1) and (name_check != -1) and (info_check != -1):
list_box_find.insert("",END, values=([name_moshtari, Purchase_code, tarikhe_buy, price_all, more_info]))
if (j == 120) and (date_check != -1) and (name_check != -1) and (info_check != -1) and (code_check != -1):
list_box_find.insert("",END, values=([name_moshtari, Purchase_code, tarikhe_buy, price_all, more_info]))
Button(win_show_factor, text="search", font=("",16), command=search).place(x=30,y=130)
win_show_factor.mainloop()
def setting_app(self, x):
with open("setting.csv", encoding="utf-8") as setting_file:
read_setting = csv.reader(setting_file)
for i in read_setting:
print(i)
if x == 0:
return i[1]
elif x == 1:
if i[0] == "code_buy_end":
return i[1]
def code_buy(self):
now_code = self.setting_app(1)
code = int(now_code) + 1
with open("setting.csv", "w", encoding="utf-8", newline='') as setting_file:
write_setting = csv.writer(setting_file)
write_setting.writerows([["version", "1.0"],["code_buy_end", code]])
return code
def factor_new(self):
self.win_factor = Tk()
self.win_factor.title("factor")
self.win_factor.minsize(1000, 600)
Label(self.win_factor, text="نام مشتری", font=("",16)).place(x=820, y=8)
self.text_name_moshtari_input = Entry(self.win_factor, font=("",13), width=30)
self.text_name_moshtari_input.place(x=540, y=10)
Label(self.win_factor, font=("",14), text="نام محصول").place(x=230, y=30)
self.text_name_item_input = Entry(self.win_factor, font=("",13), width=23)
self.text_name_item_input.place(x=160, y=60)
Label(self.win_factor, font=("",14), text="تعداد/متر").place(x=380, y=30)
self.text_count_item_input = Entry(self.win_factor, font=("",13), width=5)
self.text_count_item_input.place(x=390, y=60)
Label(self.win_factor, font=("",14), text="قیمت واحد").place(x=465, y=30)
self.text_price_item_input = Entry(self.win_factor, font=("",13), width=10)
self.text_price_item_input.place(x=458, y=60)
self.text_price_item_input.insert(0, "0")
self.text_price_item = Label(self.win_factor, text= "", font=("",10))
self.text_price_item.place(x=428, y=85)
Label(self.win_factor, text="اطلاعات بیشتر فاکتور", font=("",16)).place(x=790,y=130)
self.text_info_more = Text(self.win_factor, width=25, height=18, font=("", 13))
self.text_info_more.place(x=750, y=175)
tree = ttk.Treeview(self.win_factor, column=("c1", "c2", "c3","c4"), show='headings', height=19)
tree.column("# 1", anchor=CENTER,width=220)
tree.heading("# 1", text="نام محصول")
tree.column("# 2", anchor=CENTER, width=70)
tree.heading("# 2", text="تعداد/متر")
tree.column("# 3", anchor=CENTER, width=110)
tree.heading("# 3", text="قیمت واحد")
tree.column("# 4", anchor=CENTER, width=150)
tree.heading("# 4", text="مجموع قیمت محصول")
tree.place(x=160, y=120)
self.my_list = Listbox(self.win_factor, height=23)
self.my_list.place(x=20, y=50)
self.text_name_item_total = Label(self.win_factor, text= "مجموع :", font=("",20))
self.text_name_item_total.place(x=150, y=535)
Label(self.win_factor, text=":", font=("",20)).place(x=380, y=527)
self.text_count_item_total = Label(self.win_factor, text= "0", font=("",16))
self.text_count_item_total.place(x=390, y=535)
self.text_price_item_total = Label(self.win_factor, text= "0", font=("",16))
self.text_price_item_total.place(x=615, y=535)
Label(self.win_factor, text=":", font=("",20)).place(x=565, y=527)
self.text_price_item_total_text = Label(self.win_factor, text= "", font=("",13))
self.text_price_item_total_text.place(x=460, y=560)
self.price_total = 0
self.count_total = 0
self.list_item =[]
def update(dete):
try:
self.text_price_item.configure(text=convert_ordinary(int(self.text_price_item_input.get())))
except:
self.text_price_item.configure(text="")
self.my_list.delete(0,END)
for item in dete:
self.my_list.insert(0, item)
def fillout(e):
self.text_name_item_input.delete(0, END)
self.text_name_item_input.insert(0, self.my_list.get(ACTIVE))
def check(e):
typed= self.text_name_item_input.get()
if typed == "":
dete = toppings
else:
dete= []
for item in toppings:
if typed.lower() in item.lower():
dete.append(item)
update(dete)
toppings = ["زانو سفید", "زانو سفید 2.5", "زانو سفید 3", "سراه سفید", "سراه سفید 2.5", "سراه سفید 3"]
update(toppings)
self.my_list.bind("<<ListboxSelect>>", fillout)
self.text_name_item_input.bind("<KeyRelease>", check)
self.text_price_item_input.bind("<KeyRelease>", check)
def delete_item():
tree.delete(tree.selection()[0])
self.list_item = []
for child in tree.get_children():
self.list_item.insert(0, tree.item(child)["values"])
print(self.list_item)
self.price_total = 0
self.count_total = 0
for i in range(0, len(self.list_item)):
self.count_total =self.count_total+ float(self.list_item[i][1])
self.price_total = self.price_total+ int(float(self.list_item[i][3]))
self.text_count_item_total.configure(text=self.count_total)
self.text_price_item_total.configure(text=self.price_total)
self.text_price_item_total_text.configure(text=convert_ordinary(self.price_total))
def edit_item():
xitem = tree.selection()[0]
h_info = tree.item(xitem,["values"].pop())
win_edit = Toplevel()
win_edit.title("تغییر {} به تعداد {} و مبلغ {}".format(h_info[0], h_info[1], h_info[2]))
win_edit.minsize(400, 250)
def ok_edit():
tree.item(xitem, values=(entry_name_item.get(), entry_count_item.get(), entry_price_item.get(), float(entry_count_item.get())* int(entry_price_item.get())))
self.list_item = []
for child in tree.get_children():
self.list_item.insert(0, tree.item(child)["values"])
self.price_total = 0
self.count_total = 0
for i in range(0, len(self.list_item)):
self.count_total =self.count_total+ float(self.list_item[i][1])
self.price_total = self.price_total+ int(float(self.list_item[i][3]))
self.text_count_item_total.configure(text=self.count_total)
self.text_price_item_total.configure(text=self.price_total)
self.text_price_item_total_text.configure(text=convert_ordinary(self.price_total))
win_edit.destroy()
Label(win_edit, text="نام محصول", font=("", 16)).place(x=80, y=10)
entry_name_item = Entry(win_edit, font=("", 16))
entry_name_item.place(x=20, y=40)
Label(win_edit, text="تعداد/متر", font=("", 16)).place(x=80, y=90)
entry_count_item = Entry(win_edit, font=("", 16))
entry_count_item.place(x=20, y=120)
Label(win_edit, text="قیمت واحد", font=("", 16)).place(x=80, y=160)
entry_price_item = Entry(win_edit, font=("", 16))
Button(win_edit, text="تایید", font=("",20), command=ok_edit, width=5).place(x=290, y=100)
entry_price_item.place(x=20, y=190)
win_edit.mainloop()
def add_item2list(event=None):
self.price_total = 0
self.count_total = 0
try:
price_all = int(self.text_price_item_input.get())*float(self.text_count_item_input.get())
tree.insert("", len(self.list_item), values=(self.text_name_item_input.get(), self.text_count_item_input.get(), self.text_price_item_input.get(),int(price_all)))
self.list_item.insert(len(self.list_item), (self.text_name_item_input.get(), self.text_count_item_input.get(), self.text_price_item_input.get(), int(price_all)))
self.text_price_item.configure(text=convert_ordinary(int(self.text_price_item_input.get())))
print(self.list_item)
for i in range(0, len(self.list_item)):
self.count_total =self.count_total+ float(self.list_item[i][1])
self.price_total = self.price_total+ int(float(self.list_item[i][3]))
self.text_count_item_total.configure(text=self.count_total)
self.text_price_item_total.configure(text=self.price_total)
self.text_price_item_total_text.configure(text=convert_ordinary(self.price_total))
self.text_name_item_input.delete(0,END)
self.text_name_item_input.focus()
if self.price_total != 0:
self.btn_accept_item_end.configure(state="active")
except:
messagebox.showerror("Error", "لطفا ورودی ها را صحیح وارد کنید")
self.price_naghd_end= 0
self.price_nasiye_end= 0
self.price_kart_end = 0
def accept_end():
win_factor_end = Toplevel(self.win_factor)
win_factor_end.title("Pay")
win_factor_end.minsize(600, 300)
win_factor_end.maxsize(600, 300)
self.amount_paid = self.price_total
def chortke(event=None):
if input_naghd.get() == "":
input_naghd.insert(0,"0")
elif input_naghd.cget("state")== "normal":
print("01",input_naghd.cget("state"))
self.price_naghd_end = int(input_naghd.get()) + self.price_naghd_end
input_naghd.configure(state="disabled")
self.amount_paid = self.amount_paid - self.price_naghd_end
if input_kart.get() == "":
input_kart.insert(0,"0")
elif input_kart.cget("state")== "normal":
print("02",input_kart.cget("state"))
self.price_kart_end = int(input_kart.get())+ self.price_kart_end
input_kart.configure(state="disabled")
self.amount_paid = self.amount_paid - self.price_kart_end
if input_nasiye.get() == "":
input_nasiye.insert(0,"0")
elif input_nasiye.cget("state")== "normal":
print("03",input_nasiye.cget("state"))
self.price_nasiye_end = int(input_nasiye.get()) + self.price_nasiye_end
input_nasiye.configure(state="disabled")
self.amount_paid = self.amount_paid - self.price_nasiye_end
text_price_end.configure(text=self.amount_paid)
text_price_end_tx.configure(text=convert_ordinary(int(self.amount_paid)))
if text_naghd.cget("text") == "":
text_naghd.configure(text=convert_ordinary(int(input_naghd.get())))
if text_kart.cget("text") == "":
text_kart.configure(text=convert_ordinary(int(input_kart.get())))
if text_nasiye.cget("text") == "":
text_nasiye.configure(text=convert_ordinary(int(input_nasiye.get())))
input_nasiye.delete(0,END)
input_kart.delete(0,END)
input_naghd.delete(0,END)
if self.amount_paid == 0:
btn_taeed.configure(state="active")
def space(event= None):
copy(self.amount_paid)
input_naghd.focus_get().insert(0, paste())
def save_factor():
try:
self.tarikh = datetime.now()
print(self.tarikh)
code = self.code_buy()
with open("factors/factor_{}.csv".format(code), "w", encoding="utf-8",newline='') as csv_save:
csv_write = csv.writer(csv_save)
csv_write.writerow([self.text_name_moshtari_input.get(), code, self.tarikh, self.price_total])
csv_write.writerow([ self.text_info_more.get("1.0", END), self.price_naghd_end, self.price_kart_end, self.price_nasiye_end])
for child in tree.get_children():
print(tree.item(child)["values"])
csv_write.writerow(tree.item(child)["values"])
messagebox.showinfo("save_compelect", "فاکتور با کد {} ذخیره شد".format(code))
win_factor_end.destroy()
self.win_factor.destroy()
except:
messagebox.showerror("Error", "!!مشکلی رخ داد فاکتور ذخیره نشد")
win_factor_end.bind("<Return>",chortke)
win_factor_end.bind("<space>",space)
btn_taeed = Button(win_factor_end, text="اوکی", font=("",13), state="disabled", command=save_factor)
btn_taeed.place(x=380, y=60)
text_price_end = Label(win_factor_end, text=self.price_total, font=("", 16))
text_price_end.place(x=110, y=220)
text_price_end_tx = Label(win_factor_end, text=convert_ordinary(int(self.price_total)), font=("", 16))
text_price_end_tx.place(x=110, y=260)
Label(win_factor_end, text="دریافت شود:", font=("", 16)).place(x=10, y=220)
btn_naghd = Button(win_factor_end, text="نقدی", font=("",16), command=chortke)
btn_naghd.place(x=40, y=20)
input_naghd = Entry(win_factor_end, font=("",16), width=10)
input_naghd.place(x=110,y=25)
text_naghd = Label(win_factor_end, text="", font=("",13))
text_naghd.place(x=240, y=26)
btn_kart = Button(win_factor_end, text="کارتخوان", font=("",16), command=chortke)
btn_kart.place(x=10, y=80)
input_kart = Entry(win_factor_end, font=("",16), width=10)
input_kart.place(x=110,y=85)
text_kart = Label(win_factor_end, text="", font=("",13))
text_kart.place(x=240, y=86)
btn_nasiye = Button(win_factor_end, text="نسیه", font=("",16), command=chortke)
btn_nasiye.place(x=45, y=140)
input_nasiye = Entry(win_factor_end, font=("",16), width=10)
input_nasiye.place(x=110,y=145)
text_nasiye = Label(win_factor_end, text="", font=("",13))
text_nasiye.place(x=240, y=146)
win_factor_end.mainloop()
self.btn_accept_item = Button(self.win_factor, text="تایید", font=("",16), command=add_item2list, width=10)
self.btn_accept_item.place(x=760, y=50)
self.win_factor.bind("<Return>", add_item2list)
self.btn_delete_item = Button(self.win_factor, text="delete", font=("",16), command=delete_item, width=10)
self.btn_delete_item.place(x=15, y=430)
self.btn_delete_item = Button(self.win_factor, text="edit", font=("",16), command=edit_item, width=10)
self.btn_delete_item.place(x=15, y=480)
self.btn_accept_item_end = Button(self.win_factor, text="تایید نهایی", font=("",16), state="disabled", command=accept_end, width=10)
self.btn_accept_item_end.place(x=810, y=540)
self.win_factor.mainloop()
run=Program()

I am using Pandas for a sentiment analysis problem, I want to change my categories to ['Agree', 'Disagree', 'Neutral'] to a scale from 1 to 5

recsys_file = pd.read_csv('full_chat_questions.csv')
for elem in recsys_file["item3G_new"]:
if recsys_file["elem"] == 'Strongly disagree':
recsys_file['elem'].replace(to_replace = elem, value = 1)
if recsys_file["elem"] == 'Disagree':
recsys_file['elem'].replace(to_replace = elem, value = 2)
if recsys_file["elem"] == 'Neutral':
recsys_file['elem'].replace(to_replace = elem, value = 3)
if recsys_file["elem"] == 'Agree':
recsys_file['elem'].replace(to_replace = elem, value = 4)
if recsys_file["elem"] == 'Strongly agree':
recsys_file['elem'].replace(to_replace = elem, value = 5)
trying to change the categories to values from 1 to 5 but I am getting errors
Try this, it uses np.select() to make your code more concise and gives a default value if there is nothing matching (which might be part of the problem)
import pandas as pd
import numpy as np
recsys_file = pd.read_csv('full_chat_questions.csv')
condition_list = [recsys_file["elem"] == 'Strongly disagree', recsys_file["elem"] == 'Disagree', recsys_file["elem"] == 'Neutral', recsys_file["elem"] == 'Agree', recsys_file["elem"] == 'Strongly agree']
choice_list = [1, 2, 3, 4, 5]
recsys_file["elem"] = np.select(condition_list, choice_list, 0)

draw empty arrow head and round bottom in d3

I'm a little new to SVG and d3 in general.
I'm trying to create a line with an "open arrow" on one end and a round circle on its other end.
By "open arrow" I mean a triangle like arrow without a base.
Here's an image for clarification:
https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.kindpng.com%2Fimgv%2FJJxmi_triangle-arrow-down-vector-arrow-down-white-png%2F&psig=AOvVaw0YWPto8OMDQIcx3DbPZlCI&ust=1642618347169000&source=images&cd=vfe&ved=0CAsQjRxqFwoTCMDt3q38u_UCFQAAAAAdAAAAABAE
I tried crating it but circle is not on the bottom edge and the arrow is not an open triangle.
This is what I managed to achieve.
let svg = d3.select("#graphContainer")
.append("svg");
let container = svg.append("svg").append("g");
svg.append("defs")
.append("svg:marker")
.attr("id", "arrowEnd")
.attr("refX", 6)
.attr("refY", 6)
.attr("markerWidth", 12)
.attr("markerHeight", 12)
.attr("orient", "auto")
.append("path")
.attr("d", "M2,2 L10,6 L2,10");
svg.select("defs")
.append("svg:marker")
.attr("id", "arrowStart")
.attr("refX", 0)
.attr("refY", 0)
.attr("markerWidth", 12)
.attr("markerHeight", 12)
.attr("orient", "auto")
.append("circle")
.attr("cx", "5")
.attr("cy", "2")
.attr("r", "5")
.attr("orient", "auto")
.style("stroke", "blue")
.style("fill", "none");
container.append("line")
.attr("x1", 150)
.attr("y1", 120)
.attr("x2", 150)
.attr("y2", 140)
.attr("stroke", "red")
.attr("stroke-width", 1)
.attr("marker-end", "url(#arrowEnd)")
.attr("marker-start", "url(#arrowStart)");
https://jsfiddle.net/eqawpkvt/
I'm not sure if marker is the right tag
Eventually I managed to create it.
Here's the fiddle:
https://jsfiddle.net/0v5gz1ft/
Here are the defs for the arrow start and end
svg.append("defs")
.append("svg:marker")
.attr("id", "arrowEnd")
.attr("refX", 6)
.attr("refY", 6)
.attr("markerWidth", 12)
.attr("markerHeight", 12)
.attr("orient", "auto")
.append("path")
.attr("d", "M-5,-3 L7,6 L-8,20")
.style("stroke", "#3278E0")
.style("fill", "none");
svg.select("defs")
.append("svg:marker")
.attr("id", "arrowStart")
.attr("refX", 6)
.attr("refY", 9)
.attr("markerWidth", 22)
.attr("markerHeight", 22)
.attr("orient", "auto")
.append("circle")
.attr("cx", "4")
.attr("cy", "9")
.attr("r", "3")
.attr("orient", "auto")
.style("stroke", "#3278E0")
.style("fill", "none");

How to improve write to synapse in Spark?

I have a script to do write a dataframe to synapse, the flow of my script is Read from Synapse > Transform data on Databricks (GROUP BY CUBE) > Write to Synapse, the data that I read from synapse has 150 million row (Fact Table), I do GROUP BY CUBE to transform the fact table. Now, I have a problem here, the process from write so slowly, I still didn't know what's the problem here.
I have tried some solution:
- Auto optimize
%sql set spark.databricks.delta.properties.defaults.autoOptimize.optimizeWrite = true;
set spark.databricks.delta.properties.defaults.autoOptimize.autoCompact = true;
- Repartition
df.repartition(10000)
- Adaptive Query Execution (AQE)
spark.conf.set("spark.sql.adaptive.optimizeSkewedJoin.enabled", "true")
spark.conf.set("spark.sql.adaptive.enabled", "true")
- Write Semantics
spark.conf.set("spark.databricks.sqldw.writeSemantics", "copy")
Nothing from them solved my problem, and it still write slowly.
This is my time process. , as you can see, some of the job skipped, why does it happen?
This is my specification:
This is my read from synapse script:
df = (spark.read
.format("com.databricks.spark.sqldw")
.option("url", url)
.option("tempDir", tempDir)
.option("forwardSparkAzureStorageCredentials", "true")
.option("query", sql)
.load()
)
This is my write to synapse script:
df.write
.format("com.databricks.spark.sqldw")
.option("tableOptions", "CLUSTERED COLUMNSTORE INDEX, DISTRIBUTION = ROUND_ROBIN") # Added at 20200121
.option("url", url)
.option("dbtable", table)
.option("forward_spark_azure_storage_credentials","True")
.option("tempdir", tempDir)
.mode(write_mode)
.save()
This is my transform script:
cube_department_read = cube_department_df.cube(cube_department_df["YEAR"], cube_department_df["WeekOfYear"], cube_department_df["Month"],
cube_department_df["department_groups"], cube_department_df["category_name"],
cube_department_df["subcategory_name"], cube_department_df["section_name"]) \
.agg(F.max('last_date_of_week').alias('last_date_of_week'),
F.countDistinct('internal_tranx_key').alias('sales_basket'),
F.sum('SalesAmt').alias('sales_amt'),
F.sum('SalesQty').alias('sales_qty'),
F.sum('SalesQtyPro').alias('SalesQtyPro'),
F.sum('SalesAmtPro').alias('SalesAmtPro'),
F.countDistinct('membership_id').alias('member_count'),
F.sum(F.when(cube_department_df["membership_id"].isNotNull(),
cube_department_df["SalesQty"]).otherwise(0)).alias("SalesQty_Member"),
F.sum(F.when(cube_department_df["membership_id"].isNotNull(),
cube_department_df["SalesAmt"]).otherwise(0)).alias("SalesAmt_Member"),
F.sum(F.when(cube_department_df["membership_id"].isNotNull(),
1).otherwise(0)).alias("Basket_Count_Member"),
F.sum(F.when(cube_department_df["membership_id"].isNotNull(),
0).otherwise(cube_department_df["SalesQty"])).alias("SalesQty_NonMember"),
F.sum(F.when(cube_department_df["membership_id"].isNotNull(),
0).otherwise(cube_department_df["SalesAmt"])).alias("SalesAmt_NonMember"),
F.sum(F.when(cube_department_df["membership_id"].isNotNull(),
0).otherwise(1)).alias("Basket_Count_NonMember"),
F.sum(F.when(cube_department_df["promotion_flag"] == 'Y',
cube_department_df["SalesAmt"]).otherwise(0)).alias("SalesAmt_MMDS_Promotion"),
F.sum(F.when(cube_department_df["promotion_flag"] == 'Y',
cube_department_df["SalesQty"]).otherwise(0)).alias("SalesQty_MMDS_Promotion"),
F.sum(F.when(cube_department_df["promotion_flag"] == 'Y',
1).otherwise(0)).alias("Basket_Count_MMDS_Promotion"),
F.sum(F.when(cube_department_df["promotion_flag"] == 'Y',
0).otherwise(cube_department_df["SalesAmt"])).alias("SalesAmt_Non_MMDS_Promotion"),
F.sum(F.when(cube_department_df["promotion_flag"] == 'Y',
0).otherwise(cube_department_df["SalesQty"])).alias("SalesQty_Non_MMDS_Promotion"),
F.sum(F.when(cube_department_df["promotion_flag"] == 'Y',
0).otherwise(1)).alias("Basket_Count_Non_MMDS_Promotion"),
F.sum(F.when((cube_department_df["promotion_flag"] == 'Y') & (cube_department_df["membership_id"].isNotNull()),
cube_department_df["SalesAmt"]).otherwise(0)).alias("SalesAmt_Member_MMDS_Promotion"),
F.sum(F.when((cube_department_df["promotion_flag"] == 'Y') & (cube_department_df["membership_id"].isNotNull()),
cube_department_df["SalesQty"]).otherwise(0)).alias("SalesQty_Member_MMDS_Promotion"),
F.sum(F.when((cube_department_df["promotion_flag"] == 'Y') & (cube_department_df["membership_id"].isNotNull()),
1).otherwise(0)).alias("Basket_Count_Member_MMDS_Promotion"),
F.sum(F.when((cube_department_df["promotion_flag"] == 'Y') & (cube_department_df["membership_id"].isNull()),
cube_department_df["SalesAmt"]).otherwise(0)).alias("SalesAmt_Non_Member_MMDS_Promotion"),
F.sum(F.when((cube_department_df["promotion_flag"] == 'Y') & (cube_department_df["membership_id"].isNull()),
cube_department_df["SalesQty"]).otherwise(0)).alias("SalesQty_Non_Member_MMDS_Promotion"),
F.sum(F.when((cube_department_df["promotion_flag"] == 'Y') & (cube_department_df["membership_id"].isNull()),
1).otherwise(0)).alias("Basket_Count_Non_Member_MMDS_Promotion"),
F.sum(F.when((cube_department_df["promotion_flag"] == 'N') & (cube_department_df["membership_id"].isNotNull()),
cube_department_df["SalesAmt"]).otherwise(0)).alias("SalesAmt_Member_Non_MMDS_Promotion"),
F.sum(F.when((cube_department_df["promotion_flag"] == 'N') & (cube_department_df["membership_id"].isNotNull()),
cube_department_df["SalesQty"]).otherwise(0)).alias("SalesQty_Member_Non_MMDS_Promotion"),
F.sum(F.when((cube_department_df["promotion_flag"] == 'N') & (cube_department_df["membership_id"].isNotNull()),
1).otherwise(0)).alias("Basket_Count_Member_Non_MMDS_Promotion"),
F.sum(F.when((cube_department_df["promotion_flag"] == 'N') & (cube_department_df["membership_id"].isNull()),
cube_department_df["SalesAmt"]).otherwise(0)).alias("SalesAmt_Non_Member_Non_MMDS_Promotion"),
F.sum(F.when((cube_department_df["promotion_flag"] == 'N') & (cube_department_df["membership_id"].isNull()),
cube_department_df["SalesQty"]).otherwise(0)).alias("SalesQty_Non_Member_Non_MMDS_Promotion"),
F.sum(F.when((cube_department_df["promotion_flag"] == 'N') & (cube_department_df["membership_id"].isNull()),
1).otherwise(0)).alias("Basket_Count_Non_Member_Non_MMDS_Promotion"),
F.when((F.sum(cube_department_df["SalesQty"]) < 0) & (F.sum(cube_department_df["SalesAmt"]) < 0),
(F.sum(cube_department_df["SalesAmt"]) / F.sum(cube_department_df["SalesQty"])) * -1) \
.when((F.sum(cube_department_df["SalesQty"]) == 0) | (F.sum(cube_department_df["SalesAmt"]) == 0),
0).otherwise(F.sum(cube_department_df["SalesAmt"]) / F.sum(cube_department_df["SalesQty"])).alias("sales_per_unit"),
F.when((F.sum(cube_department_df["SalesQty"]) < 0) & (F.sum(cube_department_df["SalesAmt"]) < 0),
(F.sum(cube_department_df["SalesAmt"]) / F.countDistinct(cube_department_df["internal_tranx_key"])) * -1) \
.when((F.sum(cube_department_df["SalesQty"]) == 0) | (F.sum(cube_department_df["SalesAmt"]) == 0),
0).otherwise(F.sum(cube_department_df["SalesAmt"]) / F.countDistinct(cube_department_df["internal_tranx_key"])).alias("sales_per_basket"),
F.when((F.sum(cube_department_df["SalesQty"]) < 0) & (F.sum(cube_department_df["SalesAmt"]) < 0),
(F.sum(cube_department_df["SalesQty"]) / F.countDistinct(cube_department_df["internal_tranx_key"])) * -1) \
.when((F.sum(cube_department_df["SalesQty"]) == 0) | (F.sum(cube_department_df["SalesAmt"]) == 0),
0).otherwise(F.sum(cube_department_df["SalesQty"]) / F.countDistinct(cube_department_df["internal_tranx_key"])).alias("unit_per_basket"),
F.when((F.countDistinct(cube_department_df["membership_id"]) < 0) & (F.sum(cube_department_df["SalesAmt"]) < 0),
(F.sum(cube_department_df["SalesAmt"]) / F.countDistinct(cube_department_df["membership_id"])) * -1) \
.when((F.countDistinct(cube_department_df["membership_id"]) == 0) | (F.sum(cube_department_df["SalesAmt"]) == 0),
0).otherwise(F.sum(cube_department_df["SalesAmt"]) / F.countDistinct(cube_department_df["membership_id"])).alias("spend_per_customer")) \
.select("YEAR","WeekOfYear","Month","department_groups","category_name","subcategory_name","section_name",
"last_date_of_week","sales_basket","sales_amt","sales_qty","SalesQtyPro","SalesAmtPro",
"member_count","SalesQty_Member","SalesAmt_Member", "Basket_Count_Member",
"SalesQty_NonMember","SalesAmt_NonMember", "Basket_Count_NonMember",
"SalesAmt_MMDS_Promotion", "SalesQty_MMDS_Promotion", "Basket_Count_MMDS_Promotion",
"SalesAmt_Non_MMDS_Promotion","SalesQty_Non_MMDS_Promotion", "Basket_Count_Non_MMDS_Promotion",
"SalesAmt_Member_MMDS_Promotion","SalesQty_Member_MMDS_Promotion","Basket_Count_Member_MMDS_Promotion",
"SalesAmt_Non_Member_MMDS_Promotion","SalesQty_Non_Member_MMDS_Promotion","Basket_Count_Non_Member_MMDS_Promotion",
"SalesAmt_Member_Non_MMDS_Promotion","SalesQty_Member_Non_MMDS_Promotion","Basket_Count_Member_Non_MMDS_Promotion",
"SalesAmt_Non_Member_Non_MMDS_Promotion","SalesQty_Non_Member_Non_MMDS_Promotion","Basket_Count_Non_Member_Non_MMDS_Promotion",
"sales_per_unit","sales_per_basket","unit_per_basket", "spend_per_customer") \
.orderBy(F.col("YEAR").asc(),
F.col("WeekOfYear").asc(),
F.col("Month").asc(),
F.col("department_groups").asc(),
F.col("category_name").asc(),
F.col("subcategory_name").asc(),
F.col("section_name").asc())

Need help writing an int to roman numeral converter using only if, if else, and switch statements

Here is the code:
public String ToRoman(int number)
{
if ((number < 1 || (number > 3999)))
if (number >= 1000) return "M" + ToRoman(number - 1000);
if (number >= 900) return "CM" + ToRoman(number - 900);
if (number >= 500) return "D" + ToRoman(number - 500);
if (number >= 400) return "CD" + ToRoman(number - 400);
if (number >= 100) return "C" + ToRoman(number - 100);
if (number >= 90) return "XC" + ToRoman(number - 90);
if (number >= 50) return "L" + ToRoman(number - 50);
if (number >= 40) return "XL" + ToRoman(number - 40);
if (number >= 10) return "X" + ToRoman(number - 10);
if (number >= 9) return "IX" + ToRoman(number - 9);
if (number >= 5) return "V" + ToRoman(number - 5);
if (number >= 4) return "IV" + ToRoman(number - 4);
if (number >= 1) return "I" + ToRoman(number - 1);
Scanner myKeyboard = new Scanner (System.in);
System.out.println("Enter the integer: ");
number = myKeyboard.nextInt();
myKeyboard.close();
}
}
The problem im having is that i get an error saying "The method must return a result type string".
You need a helper function:
public String ToRomanWrapper()
{
Scanner myKeyboard = new Scanner (System.in);
System.out.println("Enter the integer: ");
number = myKeyboard.nextInt();
myKeyboard.close();
return ToRoman(number);
}
public String ToRoman(int number){
if ((number < 1 || (number > 3999)))
return "INVALID"
if (number >= 1000) return "M" + ToRoman(number - 1000);
if (number >= 900) return "CM" + ToRoman(number - 900);
if (number >= 500) return "D" + ToRoman(number - 500);
if (number >= 400) return "CD" + ToRoman(number - 400);
if (number >= 100) return "C" + ToRoman(number - 100);
if (number >= 90) return "XC" + ToRoman(number - 90);
if (number >= 50) return "L" + ToRoman(number - 50);
if (number >= 40) return "XL" + ToRoman(number - 40);
if (number >= 10) return "X" + ToRoman(number - 10);
if (number >= 9) return "IX" + ToRoman(number - 9);
if (number >= 5) return "V" + ToRoman(number - 5);
if (number >= 4) return "IV" + ToRoman(number - 4);
if (number >= 1) return "I" + ToRoman(number - 1);
return "INVALID"
}
Alternatively, if you cannot define new functions, you can do this in the same function:
public String ToRoman(int number)
{
if ((number < 1 || (number > 3999)))
{
Scanner myKeyboard = new Scanner (System.in);
System.out.println("Enter the integer: ");
number = myKeyboard.nextInt();
myKeyboard.close();
return ToRoman(number);
}
else if (number >= 1000) return "M" + ToRoman(number - 1000);
else if (number >= 900) return "CM" + ToRoman(number - 900);
else if (number >= 500) return "D" + ToRoman(number - 500);
else if (number >= 400) return "CD" + ToRoman(number - 400);
else if (number >= 100) return "C" + ToRoman(number - 100);
else if (number >= 90) return "XC" + ToRoman(number - 90);
else if (number >= 50) return "L" + ToRoman(number - 50);
else if (number >= 40) return "XL" + ToRoman(number - 40);
else if (number >= 10) return "X" + ToRoman(number - 10);
else if (number >= 9) return "IX" + ToRoman(number - 9);
else if (number >= 5) return "V" + ToRoman(number - 5);
else if (number >= 4) return "IV" + ToRoman(number - 4);
else if (number >= 1) return "I" + ToRoman(number - 1);
}
I'm not sure why you'd want to do this though. Reading the input in the same function that handles the input would be really nasty.

Resources