I tested a minimal example based on your dependencies and just by using a few functions out of the imports i already got a package with 65 MB size. So i think it is pretty common that your package is that large. As far as i know, pyinstaller checks all your imports and used functions/classes from that modules and only includes those, so i am not sure if you can reduce the size any further without changing your code.
However, based on this post you should create the pyinstaller package from within a virtual environment which contains only the absolutely necessary packages. Furthermore, maybe you can try to eliminate unnecessary functions and try to re-use others.
Other than that, try packaging it without --onefile and pack it as a zip file afterwards, or even use Inno Setup to shrink your package size - there are tutorials out there how to use it. I achieved to get a package from i think ~600-700mb down to an installer of 150mb. However this requires some additional work and might not be what you want. This is the test-code i used for my 65mb pyinstaller package:
from bs4 import BeautifulSoup
import pandas as pd
import time
import smtplib
soup = BeautifulSoup("<p>Some<b>bad<i>HTML")
print(soup.prettify())
def some_function():
print("Starting function")
time.sleep(1)
print("Ending function")
some_function()
try:
with smtplib.SMTP("domain.org") as smtp:
smtp.noop()
print("Did something with smtplib.SMTP")
except:
print("Couldnt connect via smtplib")
mydataset = {
'cars': ["BMW", "Volvo", "Ford"],
'passings': [3, 7, 2]
}
myvar = pd.DataFrame(mydataset)
print(myvar)