File size: 3,714 Bytes
aa7a63c
 
 
4dfc1a8
 
596f960
4dfc1a8
0448c54
aa7a63c
4dfc1a8
aa7a63c
4dfc1a8
 
 
 
 
 
 
0448c54
 
 
 
aa7a63c
4dfc1a8
 
 
 
 
 
 
 
 
 
 
bd960a6
62129f1
79b3349
6f9365f
62129f1
6f9365f
dfadc0a
87fff89
5b84fb0
 
f382723
 
 
4dfc1a8
4500205
 
 
 
242ef4c
f382723
4500205
8d42c3d
 
 
4dfc1a8
 
 
 
aa7a63c
4dfc1a8
aa7a63c
 
 
 
 
 
 
 
4dfc1a8
 
 
be9688d
bd960a6
4dfc1a8
bd960a6
4dfc1a8
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
import gradio as gr
from pyvis.network import Network
import networkx as nx
import numpy as np
import pandas as pd
import os
from datasets import load_dataset
import matplotlib.pyplot as plt

Secret_token = os.getenv('token')

dataset = load_dataset('FDSRashid/hadith_info',data_files = 'Basic_Edge_Information.csv', token = Secret_token, split = 'train')
dataset2 = load_dataset('FDSRashid/hadith_info',data_files = 'Taraf_Info.csv', token = Secret_token, split = 'train')
edge_info = dataset.to_pandas()
taraf_info = dataset2.to_pandas()
cities = taraf_info['City'].unique().tolist()
min_year = int(taraf_info['Year'].min())
max_year = int(taraf_info['Year'].max())
cmap = plt.colormaps['cool']
def value_to_hex(value):
    rgba_color = cmap(value)
    return "#{:02X}{:02X}{:02X}".format(int(rgba_color[0] * 255), int(rgba_color[1] * 255), int(rgba_color[2] * 255))

def subsetEdges(city, year):
  info = taraf_info[(taraf_info['Year'] == year) & (taraf_info['City'] == city)]
  narrators = edge_info[edge_info['Edge_ID'].isin(info['ID'].unique())]
  return narrators
def splitIsnad(dataframe):
  teacher_student =dataframe['Edge_Name'].str.split(' TO ')
  dataframe['Teacher'] = teacher_student.apply(lambda x: x[0])
  dataframe['Student'] = teacher_student.apply(lambda x: x[1])
  return dataframe

    
def network_visualizer(city, year, num_nodes):
    edges = splitIsnad(subsetEdges(city, year))[['Teacher', 'Student', 'Hadiths']].groupby(['Teacher', 'Student']).sum().reset_index()
    if edges.shape[0] > num_nodes:
        edge_15 = edges.sample(num_nodes)
    else:
        edge_15 = edges.copy()
    teacher_hadiths = edge_15[['Teacher', 'Hadiths']].groupby('Teacher').sum().reset_index()
    net = Network()
    # Create dictionaries to store node roles and colors based on attribute values
    node_roles = {}
    node_colors = {}

    
    for _, row in edge_15.iterrows():
        source = row['Teacher']
        target = row['Student']
        attribute_value = row['Hadiths']
        edge_color = value_to_hex(attribute_value)
        hadith_count = teacher_hadiths[teacher_hadiths['Teacher'] == source]['Hadiths'].to_list()[0]
        edge_color = value_to_hex(attribute_value)
        net.add_edge(source, target, color=edge_color, value=attribute_value)
        net.add_node(source, color=value_to_hex(hadith_count), font = {'size':30, 'color': 'orange'}, label = f"Hadiths: {hadith_count}")
        net.add_node(target, color=value_to_hex(attribute_value) , font = {'size': 20, 'color': 'red'}, label = f"Hadith from Teacher: {attribute_value}")
        net.add_edge(source, target, color=edge_color, value=attribute_value)


    net.barnes_hut(gravity=-5000, central_gravity=0.3, spring_length=200)
    html = net.generate_html()
    html = html.replace("'", "\"")

    
    return f"""<iframe style="width: 100%; height: 600px;margin:0 auto" name="result" allow="midi; geolocation; microphone; camera; 
    display-capture; encrypted-media;" sandbox="allow-modals allow-forms 
    allow-scripts allow-same-origin allow-popups 
    allow-top-navigation-by-user-activation allow-downloads" allowfullscreen="" 
    allowpaymentrequest="" frameborder="0" srcdoc='{html}'></iframe>"""


with gr.Blocks() as demo:
  Places = gr.Dropdown(choices = cities, value = 'المدينه', label = 'Location')
  Last_Year = gr.Slider(min_year, max_year, value = 9, label = 'End', info = 'Choose the  year to display Narrators')
  num_narrators = gr.Slider(0, 700, value = 400, label = 'Narrators', info = 'Choose the  number of Narrators to display')  
    
  btn = gr.Button('Submit')
  btn.click(fn = network_visualizer, inputs = [Places, Last_Year, num_narrators], outputs = gr.HTML())
  demo.launch()