<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 How to create Popups
Step1:  Simple popups
You can define your popup at the feature creation, but you can also overwrite them afterwards
Step2:  Vega Popup
You may know that it's possible to create awesome Vega charts with (or without) vincent. If you're willing to put one inside a popup, it's possible thanks to folium.Vega.
Step4:  Fancy HTML popup
Now, you can put any HTML code inside of a Popup, thaks to the IFrame object.
Step5:  Note that you can put another Figure into an IFrame ; this should let you do stange things...
<ASSISTANT_TASK:>
Python Code:
import sys
sys.path.insert(0,'..')
import folium
import branca
print (folium.__file__)
print (folium.__version__)
Explanation: How to create Popups
End of explanation
m = folium.Map([45,0], zoom_start=4)
folium.Marker([45,-30], popup="inline implicit popup").add_to(m)
folium.CircleMarker([45,-10], radius=1e5, popup=folium.Popup("inline explicit Popup")).add_to(m)
ls = folium.PolyLine([[43,7],[43,13],[47,13],[47,7],[43,7]], color='red')
ls.add_children(folium.Popup("outline Popup on Polyline"))
ls.add_to(m)
gj = folium.GeoJson({ "type": "Polygon", "coordinates": [[[27,43],[33,43],[33,47],[27,47]]]})
gj.add_children(folium.Popup("outline Popup on GeoJSON"))
gj.add_to(m)
m
Explanation: Simple popups
You can define your popup at the feature creation, but you can also overwrite them afterwards:
End of explanation
import vincent, json
import numpy as np
scatter_points = {
    'x' : np.random.uniform(size=(100,)),
    'y' : np.random.uniform(size=(100,)),
    }
# Let's create the vincent chart.
scatter_chart = vincent.Scatter(scatter_points,
                                iter_idx='x',
                                width=600,
                                height=300)
# Let's convert it to JSON.
scatter_json = scatter_chart.to_json()
# Let's convert it to dict.
scatter_dict = json.loads(scatter_json)
m = folium.Map([43,-100], zoom_start=4)
# Let's create a Vega popup based on scatter_chart.
popup = folium.Popup(max_width=800)
folium.Vega(scatter_chart, height=350, width=650).add_to(popup)
folium.Marker([30,-120], popup=popup).add_to(m)
# Let's create a Vega popup based on scatter_json.
popup = folium.Popup(max_width=800)
folium.Vega(scatter_json, height=350, width=650).add_to(popup)
folium.Marker([30,-100], popup=popup).add_to(m)
# Let's create a Vega popup based on scatter_dict.
popup = folium.Popup(max_width=800)
folium.Vega(scatter_dict, height=350, width=650).add_to(popup)    
folium.Marker([30,-80], popup=popup).add_to(m)
m
Explanation: Vega Popup
You may know that it's possible to create awesome Vega charts with (or without) vincent. If you're willing to put one inside a popup, it's possible thanks to folium.Vega.
End of explanation
m = folium.Map([43,-100], zoom_start=4)
html=
    <h1> This is a big popup</h1><br>
    With a few lines of code...
    <p>
    <code>
        from numpy import *<br>
        exp(-2*pi)
    </code>
    </p>
    
iframe = branca.element.IFrame(html=html, width=500, height=300)
popup = folium.Popup(iframe, max_width=2650)
folium.Marker([30,-100], popup=popup).add_to(m)
m
Explanation: Fancy HTML popup
Now, you can put any HTML code inside of a Popup, thaks to the IFrame object.
End of explanation
# Let's create a Figure, with a map inside.
f = branca.element.Figure()
folium.Map([-25,150], zoom_start=3).add_to(f)
# Let's put the figure into an IFrame.
iframe = branca.element.IFrame(width=500, height=300)
f.add_to(iframe)
# Let's put the IFrame in a Popup
popup = folium.Popup(iframe, max_width=2650)
# Let's create another map.
m = folium.Map([43,-100], zoom_start=4)
# Let's put the Popup on a marker, in the second map.
folium.Marker([30,-100], popup=popup).add_to(m)
# We get a map in a Popup. Not really useful, but powerful.
m
Explanation: Note that you can put another Figure into an IFrame ; this should let you do stange things...
End of explanation
<END_TASK>