As stated in the description of geopandas.overlay:
Perform spatial overlay between two polygons.
And in your problem there is one polygon (buffer) and many linestrings (streets)
1) A first solution is to iterate over the streets geometries and compute the intersections with the buffer polygon or directly use unary_union ((Shapely unary_union) to intersect one shapely geometry with other, but the result is a shapely geometry (not a GeoDataFrame)
lines = streets.geometry.unary_union
intersection = lines.intersection(buffer.geometry[0])
type(intersection)
<class 'shapely.geometry.multilinestring.MultiLineString'>
# create a GeoDataFrame
result = geopandas.GeoDataFrame({'geometry':intersection})
It is possible to do it directly:
result = geopandas.GeoDataFrame(geometry=list(streets.unary_union.intersection(buffer.unary_union)))
print(result.head(2))
geometry
0 LINESTRING (191.0345140167503 -88.977418522730...
1 LINESTRING (141.9720460135291 -210.61516114749...
2) A second solution is to use the function clip_shp()
of earthpy.clip and the result is directly a GeoDataFrame (with the original attributes)
from earthpy import clip as cl
result = cl.clip_shp(streets, buffer)
type(result)
<class 'geopandas.geodataframe.GeoDataFrame'>
print(result.head(2))
id geometry
1 2 LINESTRING (141.9720460135291 -210.61516114749...
0 1 LINESTRING (191.0345140167503 -88.977418522730...
PS
sjoin (geopanda.sjoin(streets, buffer, how='left', op='intersects'
) gives only the left geometry (or the right geometry) and not the geometry of the intersections.