Source code for pyrfume.cabinets
import numpy as np
import pyrfume
[docs]def get_mainland(raw=False, vendors=None):
"""Return a dataframe containing odorants in Joel Mainland's cabinet"""
df = pyrfume.load_data("cabinets/mainland.csv").set_index("CID")
if not raw:
if vendors: # e.g. ['sigma']
# Keep only odorants obtained from certain vendors
df = df[df["SourcedFrom"].str.lower().isin(vendors)]
# For odorants with no relative cost information
# (probably discontinued), fill with a large number so they
# don't get used. Also use log10 $/mol
df.loc[:, "$/mol"] = np.log10(df.loc[:, "$/mol"].fillna(1e15))
# Fix price information
df["Price"] = df["Price"].astype("str").apply(lambda x: x.replace("$", "")).astype("float")
# Remove odorants with no price
df = df.dropna(subset=["Price"])
# Sort by price and then take only the cheapest instance of each CID
df = df.sort_values("Price").groupby("CID").first()
# Drop values with no CID
df = df.loc[df.index > 0]
# Sort CIDs from low to high
df = df.sort_index()
return df