Ruptura_Projetada/S&OP/heatmap_ruptura.ipynb
2025-10-24 15:54:54 -03:00

164 lines
5.7 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"id": "1e27ee66",
"metadata": {},
"outputs": [],
"source": [
"# file: brazil_regions_heatmap.py\n",
"\n",
"import folium\n",
"import json\n",
"import pandas as pd\n",
"import requests\n",
"from branca.colormap import linear\n",
"\n",
"# Porcentagens por região personalizada\n",
"region_data = {\n",
" \"Norte\": 17.4,\n",
" \"Nordeste - norte\": 15.0,\n",
" \"Nordeste - sul\": 18.1,\n",
" \"São paulo\": 23.0,\n",
" \"Sudeste\": 20.5,\n",
" \"Sul\": 23.3\n",
"}\n",
"\n",
"# Mapeamento de estados para regiões personalizadas\n",
"region_mapping = {\n",
" # Norte\n",
" \"AC\": \"Norte\", \"AP\": \"Norte\", \"AM\": \"Norte\", \"PA\": \"Norte\", \"RO\": \"Norte\", \"RR\": \"Norte\", \"TO\": \"Norte\",\n",
"\n",
" # Nordeste - norte\n",
" \"MA\": \"Nordeste - norte\", \"PI\": \"Nordeste - norte\", \"CE\": \"Nordeste - norte\",\n",
" \"RN\": \"Nordeste - norte\", \"PB\": \"Nordeste - norte\", \"PE\": \"Nordeste - norte\",\n",
"\n",
" # Nordeste - sul\n",
" \"AL\": \"Nordeste - sul\", \"SE\": \"Nordeste - sul\", \"BA\": \"Nordeste - sul\",\n",
"\n",
" # Sudeste (sem SP)\n",
" \"MG\": \"Sudeste\", \"RJ\": \"Sudeste\", \"ES\": \"Sudeste\",\n",
"\n",
" # São Paulo\n",
" \"SP\": \"São paulo\",\n",
"\n",
" # Sul\n",
" \"PR\": \"Sul\", \"SC\": \"Sul\", \"RS\": \"Sul\"\n",
"}\n",
"\n",
"# Baixar GeoJSON dos estados brasileiros\n",
"geojson_url = 'https://raw.githubusercontent.com/codeforamerica/click_that_hood/master/public/data/brazil-states.geojson'\n",
"geojson_data = requests.get(geojson_url).json()\n",
"\n",
"# Construir DataFrame de estado -> porcentagem\n",
"state_data = []\n",
"centroids = {}\n",
"region_centroid = {}\n",
"region_states = {}\n",
"\n",
"for feature in geojson_data['features']:\n",
" state_abbr = feature['properties']['sigla']\n",
" region = region_mapping.get(state_abbr)\n",
" percent = region_data.get(region)\n",
" coords = feature['geometry']['coordinates'][0]\n",
"\n",
" # calcular centro aproximado (média dos pontos)\n",
" if feature['geometry']['type'] == 'Polygon':\n",
" lon = sum([point[0] for point in coords]) / len(coords)\n",
" lat = sum([point[1] for point in coords]) / len(coords)\n",
" elif feature['geometry']['type'] == 'MultiPolygon':\n",
" coords = feature['geometry']['coordinates'][0][0]\n",
" lon = sum([point[0] for point in coords]) / len(coords)\n",
" lat = sum([point[1] for point in coords]) / len(coords)\n",
" else:\n",
" lon, lat = 0, 0\n",
"\n",
" centroids[state_abbr] = (lat, lon)\n",
" state_data.append({\"state\": state_abbr, \"region\": region, \"percent\": percent})\n",
"\n",
" if region not in region_centroid:\n",
" region_centroid[region] = []\n",
" region_centroid[region].append((lat, lon))\n",
"\n",
" if region not in region_states:\n",
" region_states[region] = set()\n",
" region_states[region].add(state_abbr)\n",
"\n",
"df = pd.DataFrame(state_data)\n",
"\n",
"# Criar colormap azul (claro até escuro)\n",
"colormap = linear.Blues_09.scale(df[\"percent\"].min(), df[\"percent\"].max())\n",
"colormap.caption = \"Porcentagem de Ruptura Bruta por região\"\n",
"\n",
"# Criar mapa centrado apenas no Brasil com fundo branco (usar \"white tile\")\n",
"white_tile_url = \"https://tiles.wmflabs.org/bw-mapnik/{z}/{x}/{y}.png\"\n",
"m = folium.Map(location=[-14.2350, -51.9253], zoom_start=4, tiles=white_tile_url, attr='Wikimedia')\n",
"\n",
"# Adicionar o choropleth com estados não preenchidos em cinza claro\n",
"folium.Choropleth(\n",
" geo_data=geojson_data,\n",
" name=\"choropleth\",\n",
" data=df,\n",
" columns=[\"state\", \"percent\"],\n",
" key_on=\"feature.properties.sigla\",\n",
" fill_color=\"Blues\",\n",
" fill_opacity=0.9,\n",
" line_opacity=0.5,\n",
" line_color=\"black\",\n",
" nan_fill_color=\"#dddddd\",\n",
" nan_fill_opacity=1,\n",
" highlight=True,\n",
" legend_name=\"Porcentagem de Ruptura Bruta por região\"\n",
").add_to(m)\n",
"\n",
"# Adicionar uma única label por região (fonte maior)\n",
"for region, coords in region_centroid.items():\n",
" if region and region in region_data:\n",
" lat = sum([c[0] for c in coords]) / len(coords)\n",
" lon = sum([c[1] for c in coords]) / len(coords)\n",
" percent = region_data[region]\n",
" folium.map.Marker(\n",
" [lat, lon],\n",
" icon=folium.DivIcon(html=f'<div style=\"font-size:16pt; color:black; text-align:center\">{percent:.1f}%</div>')\n",
" ).add_to(m)\n",
"\n",
"# Adicionar colormap\n",
"colormap.add_to(m)\n",
"\n",
"# Salvar o mapa\n",
"m.save(\"heatmap_brasil2.html\")\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"id": "7f918e8a",
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.2"
}
},
"nbformat": 4,
"nbformat_minor": 5
}