File size: 2,582 Bytes
6681f07
 
 
 
67688b4
 
 
 
 
 
 
 
bc4147c
6681f07
67688b4
6681f07
bc4147c
67688b4
 
 
 
 
 
 
 
 
 
 
 
af81e4c
67688b4
 
 
 
 
 
 
 
bc4147c
67688b4
 
 
 
 
 
 
 
bc4147c
67688b4
 
 
 
 
af81e4c
67688b4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
af81e4c
 
 
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
import pandas as pd
import numpy as np
import datetime

# Rough base coordinates for each site (example, can adjust for realism)
site_coords = {
    "Hyderabad": (17.385, 78.4867),
    "Gadwal": (16.2333, 77.8),
    "Kurnool": (15.8281, 78.0373),
    "Ballari": (15.1394, 76.9214)
}

def simulate_data(n=48, faults=True):
    today = datetime.date.today()
    sites = list(site_coords.keys())
    data = []

    poles_per_site = n // len(sites)
    for site in sites:
        base_lat, base_lon = site_coords[site]
        for i in range(poles_per_site):
            pole_num = len(data) + 1
            pole_id = f"Pole_{pole_num:03}"

            # Spread out poles in a grid (every 10 feet ≈ 0.00003 degrees)
            row = i // 4
            col = i % 4
            lat = base_lat + row * 0.00003
            lon = base_lon + col * 0.00003

            solar = round(np.random.uniform(3.0, 7.5), 2)
            wind = round(np.random.uniform(0.5, 2.0), 2)
            required = round(np.random.uniform(1.0, 1.5), 2)
            total = solar + wind
            cam = np.random.choice(['Online', 'Offline'], p=[0.85, 0.15]) if faults else "Online"
            tilt = round(np.random.uniform(0, 12), 1)
            vib = round(np.random.uniform(0.1, 2.5), 2)
            sufficient = "Yes" if total >= required else "No"

            anomaly = []
            if faults:
                if solar < 4.0: anomaly.append("Low Solar Output")
                if wind < 0.7: anomaly.append("Low Wind Output")
                if tilt > 10: anomaly.append("Pole Tilt Risk")
                if vib > 2.0: anomaly.append("Vibration Alert")
                if cam == "Offline": anomaly.append("Camera Offline")
                if sufficient == "No": anomaly.append("Power Insufficient")

            alert = "Green"
            if len(anomaly) == 1:
                alert = "Yellow"
            elif len(anomaly) > 1:
                alert = "Red"

            data.append({
                "Pole ID": pole_id,
                "Site": site,
                "Date": today,
                "Latitude": lat,
                "Longitude": lon,
                "Solar Gen (kWh)": solar,
                "Wind Gen (kWh)": wind,
                "Power Required (kWh)": required,
                "Power Sufficient": sufficient,
                "Camera Status": cam,
                "Tilt (°)": tilt,
                "Vibration (g)": vib,
                "Anomalies": "; ".join(anomaly) if anomaly else "None",
                "Alert Level": alert
            })

    return pd.DataFrame(data)