asteroid_spinprops 0.2.20__py3-none-any.whl → 0.2.22__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ # Automatically created by ruff.
2
+ *
@@ -0,0 +1 @@
1
+ Signature: 8a477f597d28d172789f06886806bc55
@@ -86,6 +86,109 @@ def get_period_estimate(residuals_dataframe, p_min=0.03, p_max=2):
86
86
  )
87
87
 
88
88
 
89
+ def get_multiband_period_estimate(
90
+ residuals_dataframe, p_min=0.03, p_max=2, k_free=True, k_val=None
91
+ ):
92
+ period_min, period_max = p_min, p_max
93
+ period_range = (period_min, period_max)
94
+ results = []
95
+ residuals = np.zeros(len(residuals_dataframe["filters"].values))
96
+ bands = np.unique(residuals_dataframe["filters"].values)
97
+ if k_free:
98
+ for k in range(1, 11):
99
+ model = LombScargleMultiband(
100
+ residuals_dataframe["jd"].values,
101
+ residuals_dataframe["residuals"].values,
102
+ residuals_dataframe["filters"].values,
103
+ residuals_dataframe["sigma"].values,
104
+ normalization="standard",
105
+ fit_mean=True,
106
+ nterms_base=k,
107
+ nterms_band=1,
108
+ )
109
+ frequency, power = model.autopower(
110
+ method="fast",
111
+ sb_method="fastnifty_chi2",
112
+ minimum_frequency=1 / period_range[1],
113
+ maximum_frequency=1 / period_range[0],
114
+ samples_per_peak=5,
115
+ )
116
+
117
+ f_best = frequency[np.argmax(power)]
118
+ y_model = model.model(
119
+ residuals_dataframe["jd"].values, f_best, bands_fit=bands
120
+ )
121
+
122
+ # y_model.shape is (n_bands, len(time))
123
+
124
+ for n, f in enumerate(bands):
125
+ bindex = np.where(residuals_dataframe["filters"].values == f)
126
+ residuals[bindex] = (
127
+ residuals_dataframe["residuals"].values[bindex] - y_model[n][bindex]
128
+ )
129
+
130
+ rms = np.sqrt(np.mean(residuals**2))
131
+ n_params = 2 * k + 1 + 3 * len(bands)
132
+ dof = len(residuals) - n_params
133
+
134
+ results.append((k, f_best, rms, dof, n_params))
135
+
136
+ model_comparison = pd.DataFrame()
137
+
138
+ for i in range(len(results) - 1):
139
+ k, f_best, rss, dof, n_params = results[i]
140
+ k_next, f_best_next, rss_next, dof_next, n_params_next = results[i + 1]
141
+ F = ((rss - rss_next) / (dof - dof_next)) / (rss_next / dof_next)
142
+
143
+ # Here crit = Fstat value for which model_2 (more complex) is in fact better than model_1 (less complex)
144
+ crit = f.ppf(
145
+ q=0.99,
146
+ dfn=n_params_next - n_params,
147
+ dfd=len(residuals) - n_params_next,
148
+ )
149
+
150
+ model_comparison.loc[i, "k"] = k
151
+ model_comparison.loc[i, "k_next"] = k_next
152
+ model_comparison.loc[i, "f_best"] = f_best
153
+ model_comparison.loc[i, "Fstat"] = F
154
+ model_comparison.loc[i, "alpha_crit"] = crit
155
+
156
+ cond = model_comparison["Fstat"] > model_comparison["alpha_crit"]
157
+ model_comparison = model_comparison[
158
+ ~cond
159
+ ] # don't go for the more complex model
160
+ f_chosen = model_comparison[
161
+ model_comparison.k == model_comparison.k.min()
162
+ ].f_best[0] # Simplest model
163
+ k_val = model_comparison[model_comparison.k == model_comparison.k.min()].k[
164
+ 0
165
+ ] # Simplest model
166
+ if not k_free:
167
+ model = LombScargleMultiband(
168
+ residuals_dataframe["jd"].values,
169
+ residuals_dataframe["residuals"].values,
170
+ residuals_dataframe["filters"].values,
171
+ residuals_dataframe["sigma"].values,
172
+ normalization="standard",
173
+ fit_mean=True,
174
+ nterms_base=k_val,
175
+ nterms_band=1,
176
+ )
177
+ frequency, power = model.autopower(
178
+ method="fast",
179
+ sb_method="fastnifty_chi2",
180
+ minimum_frequency=1 / period_range[1],
181
+ maximum_frequency=1 / period_range[0],
182
+ samples_per_peak=5,
183
+ )
184
+
185
+ f_best = frequency[np.argmax(power)]
186
+ f_chosen = f_best
187
+ period_in = 2 * (1 / f_chosen)
188
+
189
+ return period_in, k_val
190
+
191
+
89
192
  def plot_periodograms(signal, window, name=None, axis="frequency"):
90
193
  if name is not None:
91
194
  r = rocks.Rock(name, datacloud="spins")
@@ -231,18 +334,30 @@ def plot_periodograms(signal, window, name=None, axis="frequency"):
231
334
  plt.tight_layout()
232
335
 
233
336
 
234
- def perform_residual_resampling(resid_df):
235
- sg, w, _ = get_period_estimate(resid_df)
236
- Pog = 48 / sg[2][0] # in hours
337
+ def perform_residual_resampling(resid_df, p_min, p_max, k=1):
338
+ if k == 1:
339
+ sg, w, _ = get_period_estimate(resid_df)
340
+ Pog = 48 / sg[2][0] # in hours
237
341
 
238
- # Bootstrap residuals:
239
- Pbs = np.zeros(25)
240
- for n in range(25):
241
- BS_df = resid_df.sample(n=len(resid_df), replace=True)
242
- sg, w, _ = get_period_estimate(BS_df)
243
- Pbs[n] = 48 / sg[2][0]
244
-
245
- cond = np.abs(Pog - Pbs) / Pog < 1e-2
246
- Nbs = np.sum(np.ones(25)[cond])
342
+ # Bootstrap residuals:
343
+ Pbs = np.zeros(25)
344
+ for n in range(25):
345
+ BS_df = resid_df.sample(n=len(resid_df), replace=True)
346
+ sg, w, _ = get_period_estimate(BS_df)
347
+ Pbs[n] = 48 / sg[2][0]
247
348
 
349
+ cond = np.abs(Pog - Pbs) / Pog < 1e-2
350
+ Nbs = np.sum(np.ones(25)[cond])
351
+ if k > 1:
352
+ Pog = 24 / get_multiband_period_estimate(
353
+ resid_df, p_min=p_min, p_max=p_max, k_free=False, k_val=k
354
+ )
355
+ Pbs = np.zeros(25)
356
+ for n in range(25):
357
+ BS_df = resid_df.sample(n=len(resid_df), replace=True)
358
+ Pbs[n] = 24 / get_multiband_period_estimate(
359
+ BS_df, p_min=p_min, p_max=p_max, k_free=False, k_val=k
360
+ )
361
+ cond = np.abs(Pog - Pbs) / Pog < 1e-2
362
+ Nbs = np.sum(np.ones(25)[cond])
248
363
  return BS_df, Nbs
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: asteroid_spinprops
3
- Version: 0.2.20
3
+ Version: 0.2.22
4
4
  Summary: Collection of tools used for fitting sHG1G2 and ssHG1G2 photometric models to sparse asteroid photometry
5
5
  License: MIT
6
6
  Author: Odysseas
@@ -1,8 +1,11 @@
1
1
  asteroid_spinprops/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ asteroid_spinprops/ssolib/.ruff_cache/.gitignore,sha256=njpg8ebsSuYCFcEdVLFxOSdF7CXp3e1DPVvZITY68xY,35
3
+ asteroid_spinprops/ssolib/.ruff_cache/0.13.2/1980339045096230685,sha256=sdFMPj-MpFBvqh6kNKbA3DLSABPaYn625V6O9z99A5U,99
4
+ asteroid_spinprops/ssolib/.ruff_cache/CACHEDIR.TAG,sha256=WVMVbX4MVkpCclExbq8m-IcOZIOuIZf5FrYw5Pk-Ma4,43
2
5
  asteroid_spinprops/ssolib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
6
  asteroid_spinprops/ssolib/dataprep.py,sha256=s4bXDCU15IsdIg9uLwFuO2VEGCxewrXkFIQolG8mKao,18716
4
7
  asteroid_spinprops/ssolib/modelfit.py,sha256=uPtWthzuiYVbabxIy_osQkKZQ6v6G8KYhY0nrMpJpy8,18826
5
- asteroid_spinprops/ssolib/periodest.py,sha256=pdGmaQoQi6ihgmwkC5q-S5xyy5Wxa99ueUjDFsL7u-Q,6612
8
+ asteroid_spinprops/ssolib/periodest.py,sha256=9OhjMwiawdjA_p3XaaTU9EFbWQvLtEv5v4cYjmWq6vk,11026
6
9
  asteroid_spinprops/ssolib/pipetools.py,sha256=DNu4mg8M69c2SHc2KHR5lsshNdsskeB7vNsZad_H0mo,5338
7
10
  asteroid_spinprops/ssolib/ssptools.py,sha256=DlSgYtXenztRAtEV9d4itzp5OZMjkbXkW2yZ_Qumu4U,4490
8
11
  asteroid_spinprops/ssolib/testing/atlas_x_ztf_testing/test_pqfile_1.parquet,sha256=qVTCAlpBZLNxCwuKAMwKdjh9yeHFvfrQcr-ebFMQOVI,56455
@@ -23,6 +26,6 @@ asteroid_spinprops/ssolib/testing/ephemeris_testing/Poullain,sha256=_KgyYqgy01zK
23
26
  asteroid_spinprops/ssolib/testing/ephemeris_testing/Sonneberga,sha256=ER9ysLNa0kpGP78jM4SpHLLIbHpiDlIAXJ88eqw3gRU,700347
24
27
  asteroid_spinprops/ssolib/testing/testing_ssoname_keys.pkl,sha256=-gnpow_I4uTpPXlF9sLcVJ2YixWp5YXJHkVHIMjtOzo,241
25
28
  asteroid_spinprops/ssolib/utils.py,sha256=Re8VQMikHFxGX9PPnIGTPBuwJvuX6pMyujaNnfSCwVE,12390
26
- asteroid_spinprops-0.2.20.dist-info/METADATA,sha256=dSdyMHkMr7RQaJh6WMrLrBQlxm8cHeQLAAyxRZY_U9Y,2831
27
- asteroid_spinprops-0.2.20.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
28
- asteroid_spinprops-0.2.20.dist-info/RECORD,,
29
+ asteroid_spinprops-0.2.22.dist-info/METADATA,sha256=Z9SNXT7wrb9SqBs1G1iUpUXy4aldyVDSvkkotYXo1yE,2831
30
+ asteroid_spinprops-0.2.22.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
31
+ asteroid_spinprops-0.2.22.dist-info/RECORD,,