!pip install pymatgen from pymatgen.core.periodic_table import Element from pandas import DataFrame elements_ = [] for elem in dir(Element): if not elem.startswith('_'): if Element(elem)is not None: elements_.append(elem) else: print('# of elements:', len(elements_)) list_atomic_orbitals = [Element(elem).atomic_orbitals for elem in elements_] list_atomic_orbitals = [{} if a_orbits is None else a_orbits for a_orbits in list_atomic_orbitals] df_orbits = DataFrame(list_atomic_orbitals, index=elements_).fillna(0.) df_orbits.sample(5) list_attrs = ["mendeleev_no", "electrical_resistivity", "velocity_of_sound", "reflectivity", "refractive_index", "poissons_ratio", "molar_volume", "electronic_structure", "thermal_conductivity", "boiling_point", "melting_point", "critical_temperature", "superconduction_temperature", "liquid_range", "bulk_modulus", "youngs_modulus", "brinell_hardness", "rigidity_modulus", "mineral_hardness", "vickers_hardness", "density_of_solid", "atomic_radius_calculated", "van_der_waals_radius", "coefficient_of_linear_thermal_expansion", "ground_state_term_symbol", "valence"] for elem in elements_: e = Element(elem) for attr in list_attrs: try: getattr(e, attr) except TypeError: print(elem, attr) except IndexError: print(elem, attr) except ValueError: print(elem, attr) from pymatgen.core.units import FloatWithUnit list_attrs_numel = [] isa_ = lambda v, dtype: type(v)is dtype for elem in elements_: e = Element(elem) for attr in list_attrs[:-2]: value = getattr(e, attr) if isa_(value,FloatWithUnit) or isa_(value,float) or isa_(value,int): list_attrs_numel.append(attr) else: print(len(set(list_attrs_numel)), set(list_attrs_numel)) def c_(value): """Safe cast from FloatWithUnit, float and int to float, float and int""" if isa_(value, FloatWithUnit): return float(value) else: return value list_attrs_numel = list(set(list_attrs_numel)) # uniquify data_array = [ [c_(getattr(Element(elem), attr))for attr in list_attrs_numel] for elem in elements_] df_attrs = DataFrame(data_array, index=elements_, columns=list_attrs_numel).fillna(0.) df_attrs.sample(10)