Skip to content

Commit 673adee

Browse files
committed
add converter funcs for data stores
1 parent a10cb48 commit 673adee

File tree

1 file changed

+106
-0
lines changed

1 file changed

+106
-0
lines changed

fooof/data/conversions.py

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
"""Conversion functions for organizing model results into alternate representations."""
2+
3+
import numpy as np
4+
5+
from fooof import Bands
6+
from fooof.core.funcs import infer_ap_func
7+
from fooof.core.info import get_ap_indices, get_peak_indices
8+
from fooof.core.modutils import safe_import, check_dependency
9+
from fooof.analysis.periodic import get_band_peak
10+
11+
pd = safe_import('pandas')
12+
13+
###################################################################################################
14+
###################################################################################################
15+
16+
def model_to_dict(fit_results, peak_org):
17+
"""Convert model fit results to a dictionary.
18+
19+
Parameters
20+
----------
21+
fit_results : FOOOFResults
22+
Results of a model fit.
23+
peak_org : int or Bands
24+
How to organize peaks.
25+
If int, extracts the first n peaks.
26+
If Bands, extracts peaks based on band definitions.
27+
28+
Returns
29+
-------
30+
dict
31+
Model results organized into a dictionary.
32+
"""
33+
34+
fr_dict = {}
35+
36+
# aperiodic parameters
37+
for label, param in zip(get_ap_indices(infer_ap_func(fit_results.aperiodic_params)),
38+
fit_results.aperiodic_params):
39+
fr_dict[label] = param
40+
41+
# periodic parameters
42+
peaks = fit_results.peak_params
43+
44+
if isinstance(peak_org, int):
45+
46+
if len(peaks) < peak_org:
47+
nans = [np.array([np.nan] * 3) for ind in range(peak_org-len(peaks))]
48+
peaks = np.vstack((peaks, nans))
49+
50+
for ind, peak in enumerate(peaks[:peak_org, :]):
51+
for pe_label, pe_param in zip(get_peak_indices(), peak):
52+
fr_dict[pe_label.lower() + '_' + str(ind)] = pe_param
53+
54+
elif isinstance(peak_org, Bands):
55+
for band, f_range in peak_org:
56+
for label, param in zip(get_peak_indices(), get_band_peak(peaks, f_range)):
57+
fr_dict[band + '_' + label.lower()] = param
58+
59+
# goodness-of-fit metrics
60+
fr_dict['error'] = fit_results.error
61+
fr_dict['r_squared'] = fit_results.r_squared
62+
63+
return fr_dict
64+
65+
@check_dependency(pd, 'pandas')
66+
def model_to_dataframe(fit_results, peak_org):
67+
"""Convert model fit results to a dataframe.
68+
69+
Parameters
70+
----------
71+
fit_results : FOOOFResults
72+
Results of a model fit.
73+
peak_org : int or Bands
74+
How to organize peaks.
75+
If int, extracts the first n peaks.
76+
If Bands, extracts peaks based on band definitions.
77+
78+
Returns
79+
-------
80+
pd.Series
81+
Model results organized into a dataframe.
82+
"""
83+
84+
return pd.Series(model_to_dict(fit_results, peak_org))
85+
86+
87+
@check_dependency(pd, 'pandas')
88+
def group_to_dataframe(fit_results, peak_org):
89+
"""Convert a group of model fit results into a dataframe.
90+
91+
Parameters
92+
----------
93+
fit_results : list of FOOOFResults
94+
List of FOOOFResults objects.
95+
peak_org : int or Bands
96+
How to organize peaks.
97+
If int, extracts the first n peaks.
98+
If Bands, extracts peaks based on band definitions.
99+
100+
Returns
101+
-------
102+
pd.DataFrame
103+
Model results organized into a dataframe.
104+
"""
105+
106+
return pd.DataFrame([model_to_dataframe(f_res, peak_org) for f_res in fit_results])

0 commit comments

Comments
 (0)