Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
C
ClassifyStorms
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Operations
Operations
Incidents
Packages & Registries
Packages & Registries
Package Registry
Container Registry
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
pick
public
ClassifyStorms
Commits
eb9510fe
Commit
eb9510fe
authored
May 24, 2019
by
Leonie Pick
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Update prior to submission.
parent
c92b7cc3
Changes
5
Expand all
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
326 additions
and
267 deletions
+326
-267
ClassifyStorms.ipynb
ClassifyStorms.ipynb
+267
-211
Imports.py
Imports.py
+1
-0
Modules.py
Modules.py
+16
-16
Plots.py
Plots.py
+39
-37
Readme.md
Readme.md
+3
-3
No files found.
ClassifyStorms.ipynb
View file @
eb9510fe
This diff is collapsed.
Click to expand it.
Imports.py
View file @
eb9510fe
...
@@ -7,6 +7,7 @@ import pandas as pd
...
@@ -7,6 +7,7 @@ import pandas as pd
import
datetime
as
dt
import
datetime
as
dt
import
itertools
import
itertools
import
time
as
time
import
time
as
time
import
joblib
# IPython
# IPython
from
IPython.display
import
display
from
IPython.display
import
display
# Matplotlib
# Matplotlib
...
...
Modules.py
View file @
eb9510fe
...
@@ -132,12 +132,12 @@ def Search_TargetEvents(HMC, HMC11y, HMC5d, dHMC, HTime, DTime, grid, Save):
...
@@ -132,12 +132,12 @@ def Search_TargetEvents(HMC, HMC11y, HMC5d, dHMC, HTime, DTime, grid, Save):
return
IndexMin2
return
IndexMin2
###
###
###
###
def
Get_TargetEvents
(
HMC
,
HMC11y
,
HMC5d
,
dHMC
,
Kp_all
,
KpHours_all
,
Training
,
Time
,
Date
,
YearStart
,
Save
):
def
Get_TargetEvents
(
HMC
,
HMC11y
,
HMC5d
,
dHMC
,
Kp_all
,
KpHours_all
,
Reference
,
Time
,
Date
,
YearStart
,
Save
):
YearsIndex
=
np
.
where
(
Time
[:,
0
]
>=
YearStart
)[
0
]
YearsIndex
=
np
.
where
(
Time
[:,
0
]
>=
YearStart
)[
0
]
TrClass
=
Training
[:,
0
]
TrClass
=
Reference
[:,
0
]
TrTimeIndex
=
Training
[:,
1
]
TrTimeIndex
=
Reference
[:,
1
]
TrFound
=
Training
[:,
2
]
TrFound
=
Reference
[:,
2
]
CIRs
=
np
.
where
(
np
.
logical_or
(
TrClass
==
0
,
TrClass
==
2
))[
0
]
CIRs
=
np
.
where
(
np
.
logical_or
(
TrClass
==
0
,
TrClass
==
2
))[
0
]
CMEs
=
np
.
where
(
TrClass
==
1
)[
0
]
CMEs
=
np
.
where
(
TrClass
==
1
)[
0
]
...
@@ -179,19 +179,19 @@ def Get_TargetEvents(HMC, HMC11y, HMC5d, dHMC, Kp_all, KpHours_all, Training, Ti
...
@@ -179,19 +179,19 @@ def Get_TargetEvents(HMC, HMC11y, HMC5d, dHMC, Kp_all, KpHours_all, Training, Ti
TrFound
[
CIRIndices
]
=
1
TrFound
[
CIRIndices
]
=
1
TrFound
[
CMEIndices
]
=
1
TrFound
[
CMEIndices
]
=
1
Training
[:,
2
]
=
TrFound
Reference
[:,
2
]
=
TrFound
#print(grid[IndexWin,:])
#print(grid[IndexWin,:])
#if Save == True:
#if Save == True:
#np.save('./Dump/Events',StormsWin)
#np.save('./Dump/Events',StormsWin)
###
###
TargetResults
=
{
'No. targets'
:
len
(
StormsWin
),
'Fraction [%]'
:
len
(
StormsWin
)
*
100
/
len
(
HMC
[
YearsIndex
])}
TargetResults
=
{
'No. target
event
s'
:
len
(
StormsWin
),
'Fraction [%]'
:
len
(
StormsWin
)
*
100
/
len
(
HMC
[
YearsIndex
])}
TrainingResults
=
[[
len
(
CIRs
),
len
(
CMEs
),
len
(
CIRs
)
+
len
(
CMEs
)],[
len
(
Found_CIRs
),
len
(
Found_CMEs
),
len
(
Found_CIRs
)
+
len
(
Found_CMEs
)]]
TrainingResults
=
[[
len
(
CIRs
),
len
(
CMEs
),
len
(
CIRs
)
+
len
(
CMEs
)],[
len
(
Found_CIRs
),
len
(
Found_CMEs
),
len
(
Found_CIRs
)
+
len
(
Found_CMEs
)]]
SelectionParams
=
{
'HMC percentile'
:
grid
[
IndexWin
,
0
],
'Scaling power'
:
grid
[
IndexWin
,
1
],
'Separation [h]'
:
grid
[
IndexWin
,
2
],
'Min. HMC drop [nT]'
:
grid
[
IndexWin
,
3
]}
SelectionParams
=
{
r
'$P_n [nT]$'
:
grid
[:,
0
],
r
'$p_{sc}$'
:
grid
[:,
1
],
r
'$\Delta t$ [h]'
:
grid
[:,
2
],
r
' $Hs$ [nT]'
:
-
grid
[:
,
3
]}
display
(
pd
.
DataFrame
(
data
=
SelectionParams
,
index
=
[
'Selection parameters'
]))
display
(
pd
.
DataFrame
(
data
=
SelectionParams
,
index
=
[
'Selection parameters'
]))
display
(
pd
.
DataFrame
(
data
=
TargetResults
,
index
=
[
'Selection result'
]))
display
(
pd
.
DataFrame
(
data
=
TargetResults
,
index
=
[
'Selection result'
]))
display
(
pd
.
DataFrame
(
data
=
TrainingResults
,
columns
=
[
'No. CIRs'
,
'No. CMEs'
,
'Total'
],
index
=
[
'
Training set'
,
'in Target
set'
]))
display
(
pd
.
DataFrame
(
data
=
TrainingResults
,
columns
=
[
'No. CIRs'
,
'No. CMEs'
,
'Total'
],
index
=
[
'
Reference set'
,
'Training
set'
]))
###
###
pl
.
IndexDist
(
Time
,
YearsIndex
,
StormsWin
,
Kp_all
,
KpHours_all
,
HMC
,
Save
)
pl
.
IndexDist
(
Time
,
YearsIndex
,
StormsWin
,
Kp_all
,
KpHours_all
,
HMC
,
Save
)
...
@@ -324,7 +324,7 @@ def Get_F11(i,TrTimeIndex,TrClass):
...
@@ -324,7 +324,7 @@ def Get_F11(i,TrTimeIndex,TrClass):
return
F11
return
F11
###
###
###
###
def
Get_Features
(
Time
,
Storms
,
Training
,
HMC
,
HMC11y
,
HMC1y
,
dHMC
,
B_MLT
,
ASY
,
Save
):
def
Get_Features
(
Time
,
Storms
,
Reference
,
HMC
,
HMC11y
,
HMC1y
,
dHMC
,
B_MLT
,
ASY
,
Save
):
PeakTimes
=
Storms
;
PeakIndices
=
np
.
arange
(
0
,
len
(
Storms
),
1
)
PeakTimes
=
Storms
;
PeakIndices
=
np
.
arange
(
0
,
len
(
Storms
),
1
)
...
@@ -342,8 +342,8 @@ def Get_Features(Time, Storms, Training, HMC, HMC11y, HMC1y, dHMC, B_MLT, ASY, S
...
@@ -342,8 +342,8 @@ def Get_Features(Time, Storms, Training, HMC, HMC11y, HMC1y, dHMC, B_MLT, ASY, S
dAsyDD
=
np
.
gradient
(
ASY
[:,
0
],
1
,
edge_order
=
1
)
dAsyDD
=
np
.
gradient
(
ASY
[:,
0
],
1
,
edge_order
=
1
)
dHMC11y
=
np
.
gradient
(
HMC11y
,
1
,
edge_order
=
1
)
dHMC11y
=
np
.
gradient
(
HMC11y
,
1
,
edge_order
=
1
)
TrTimeIndex
=
Training
[:,
1
]
#Training
.sel(Properties='TimeIndex')
TrTimeIndex
=
Reference
[:,
1
]
#Reference
.sel(Properties='TimeIndex')
TrClass
=
Training
[:,
0
]
#Training
.sel(Properties='Class')
TrClass
=
Reference
[:,
0
]
#Reference
.sel(Properties='Class')
excludeEvents
=
[]
excludeEvents
=
[]
count1
=
0
;
count2
=
0
count1
=
0
;
count2
=
0
...
@@ -406,11 +406,11 @@ def Get_Features(Time, Storms, Training, HMC, HMC11y, HMC1y, dHMC, B_MLT, ASY, S
...
@@ -406,11 +406,11 @@ def Get_Features(Time, Storms, Training, HMC, HMC11y, HMC1y, dHMC, B_MLT, ASY, S
return
PeakIndices
,
FeatureMatrix
return
PeakIndices
,
FeatureMatrix
###
###
###
###
def
Get_Diagnostics
(
FeatureMatrix
,
Storms
,
Training
,
Save
):
def
Get_Diagnostics
(
FeatureMatrix
,
Storms
,
Reference
,
Save
):
TrClass
=
Training
[:,
0
]
TrClass
=
Reference
[:,
0
]
TrTimeIndex
=
Training
[:,
1
]
TrTimeIndex
=
Reference
[:,
1
]
TrKnown
=
Training
[:,
2
]
TrKnown
=
Reference
[:,
2
]
n_features
=
FeatureMatrix
.
shape
[
1
]
n_features
=
FeatureMatrix
.
shape
[
1
]
n_classes
=
len
(
np
.
unique
(
TrClass
))
n_classes
=
len
(
np
.
unique
(
TrClass
))
...
@@ -456,7 +456,7 @@ def Get_Diagnostics(FeatureMatrix,Storms,Training,Save):
...
@@ -456,7 +456,7 @@ def Get_Diagnostics(FeatureMatrix,Storms,Training,Save):
k
+=
1
k
+=
1
###
###
display
(
pd
.
DataFrame
(
data
=
FeatureResults
,
index
=
np
.
linspace
(
1
,
12
,
12
,
dtype
=
int
),
columns
=
[
'Q2 CIRs'
,
'Q2 CMEs'
,
'Q2 Difference'
,
'IQR Overlap'
,
'Q2 Difference- IQR Overlap'
]))
display
(
pd
.
DataFrame
(
data
=
FeatureResults
,
index
=
np
.
linspace
(
1
,
12
,
12
,
dtype
=
int
),
columns
=
[
'Q2 CIRs'
,
'Q2 CMEs'
,
'Q2 Difference'
,
'IQR Overlap'
,
'Q2 Difference
- IQR Overlap'
]))
###
###
pl
.
Diagnostics
(
n_features
,
n_classes
,
NData
,
Save
)
pl
.
Diagnostics
(
n_features
,
n_classes
,
NData
,
Save
)
...
...
Plots.py
View file @
eb9510fe
...
@@ -20,7 +20,7 @@ def Selection(Time,Date,HMC,Index_thres1,StormIndices,IndexMin,IndexMin1,IndexMi
...
@@ -20,7 +20,7 @@ def Selection(Time,Date,HMC,Index_thres1,StormIndices,IndexMin,IndexMin1,IndexMi
end
=
np
.
where
(
Time
[:,
4
]
==
ends
[
i
])[
0
][
0
]
end
=
np
.
where
(
Time
[:,
4
]
==
ends
[
i
])[
0
][
0
]
ax
[
i
].
plot
(
Time
[
start
:
end
,
4
],
HMC
[
start
:
end
],
color
=
'gray'
)
ax
[
i
].
plot
(
Time
[
start
:
end
,
4
],
HMC
[
start
:
end
],
color
=
'gray'
)
ax
[
i
].
plot
(
Time
[
start
:
end
,
4
],
Index_thres1
[
start
:
end
],
linestyle
=
'--'
,
color
=
'midnightblue'
,
label
=
r
'
HMC$_{\mathrm{thres}}\in$ ['
+
str
(
np
.
around
(
max
(
Index_thres1
[
start
:
end
]),
2
))
+
' nT ,
'
+
str
(
np
.
around
(
min
(
Index_thres1
[
start
:
end
]),
2
))
+
' nT]'
)
ax
[
i
].
plot
(
Time
[
start
:
end
,
4
],
Index_thres1
[
start
:
end
],
linestyle
=
'--'
,
color
=
'midnightblue'
,
label
=
r
'
$Hl_t\in$ ['
+
str
(
np
.
around
(
max
(
Index_thres1
[
start
:
end
]),
2
))
+
' nT,
'
+
str
(
np
.
around
(
min
(
Index_thres1
[
start
:
end
]),
2
))
+
' nT]'
)
ax
[
i
].
scatter
(
Time
[
StormIndices
,
4
],
HMC
[
StormIndices
],
color
=
'midnightblue'
,
s
=
5
,
zorder
=
3
)
ax
[
i
].
scatter
(
Time
[
StormIndices
,
4
],
HMC
[
StormIndices
],
color
=
'midnightblue'
,
s
=
5
,
zorder
=
3
)
ax
[
i
].
set_xlim
([
Time
[
start
,
4
],
Time
[
end
,
4
]])
ax
[
i
].
set_xlim
([
Time
[
start
,
4
],
Time
[
end
,
4
]])
...
@@ -86,8 +86,8 @@ def IndexDist(Time,YearsIndex,Storms,Kp_all,KpHours_all,HMC,Save):
...
@@ -86,8 +86,8 @@ def IndexDist(Time,YearsIndex,Storms,Kp_all,KpHours_all,HMC,Save):
HMC_step
=
7.78
HMC_step
=
7.78
HMC_range
=
np
.
arange
(
10
,
480
+
HMC_step
,
HMC_step
)
HMC_range
=
np
.
arange
(
10
,
480
+
HMC_step
,
HMC_step
)
Index_range
=
Kp_range
#HMC
_range
Index_range
=
HMC_range
#Kp
_range
step
=
Kp_step
#HMC
_step
step
=
HMC_step
#Kp
_step
years
=
np
.
arange
(
1932
,
2016
,
1
)
years
=
np
.
arange
(
1932
,
2016
,
1
)
Percentages
=
np
.
zeros
((
len
(
years
),
len
(
Index_range
)))
Percentages
=
np
.
zeros
((
len
(
years
),
len
(
Index_range
)))
...
@@ -121,11 +121,11 @@ def IndexDist(Time,YearsIndex,Storms,Kp_all,KpHours_all,HMC,Save):
...
@@ -121,11 +121,11 @@ def IndexDist(Time,YearsIndex,Storms,Kp_all,KpHours_all,HMC,Save):
HMCValues
=
-
HMC
[
Storms
[
StormsBlock
]]
HMCValues
=
-
HMC
[
Storms
[
StormsBlock
]]
KpValuesAll
.
extend
(
KpValues
.
tolist
())
#
KpValuesAll.extend(KpValues.tolist())
Hist
[
l
,:],
bin_edges
=
np
.
histogram
(
KpValues
,
bins
=
Index_range
)
#
Hist[l,:], bin_edges = np.histogram(KpValues, bins = Index_range)
#
KpValuesAll.extend(HMCValues.tolist())
KpValuesAll
.
extend
(
HMCValues
.
tolist
())
#
Hist[l,:], bin_edges = np.histogram(HMCValues, bins = Index_range)
Hist
[
l
,:],
bin_edges
=
np
.
histogram
(
HMCValues
,
bins
=
Index_range
)
Hist
[
l
,:]
*=
100
/
len
(
Storms1932
)
Hist
[
l
,:]
*=
100
/
len
(
Storms1932
)
...
@@ -171,17 +171,17 @@ def IndexDist(Time,YearsIndex,Storms,Kp_all,KpHours_all,HMC,Save):
...
@@ -171,17 +171,17 @@ def IndexDist(Time,YearsIndex,Storms,Kp_all,KpHours_all,HMC,Save):
ax2
.
legend
(
loc
=
4
,
ncol
=
1
,
frameon
=
False
,
fontsize
=
10
)
ax2
.
legend
(
loc
=
4
,
ncol
=
1
,
frameon
=
False
,
fontsize
=
10
)
ax2
.
set_ylabel
(
'Occurrence [%]'
)
ax2
.
set_ylabel
(
'Occurrence [%]'
)
ax2
.
set_xticklabels
(
np
.
arange
(
0
,
10
,
1
))
#
ax2.set_xticklabels(np.arange(0,10,1))
ax2
.
set_xlabel
(
'Kp'
)
#
ax2.set_xlabel('Kp')
ax2
.
set_ylim
([
0
,
10.5
])
#ax2.set_ylim([0,10
])
#
ax2.set_xticklabels(np.around(Index_range[::3]/100,1))
ax2
.
set_xticklabels
(
np
.
around
(
Index_range
[::
3
]
/
100
,
1
))
#
ax2.set_xlabel('-HMC/100 [nT]')
ax2
.
set_xlabel
(
'-HMC/100 [nT]'
)
#ax2.set_ylim([0,45
])
ax2
.
set_ylim
([
0
,
20
])
if
Save
==
True
:
if
Save
==
True
:
fig
.
savefig
(
'./Dump/Fig/
Kp
Dist.pdf'
,
format
=
'pdf'
,
dpi
=
200
,
transparent
=
True
)
fig
.
savefig
(
'./Dump/Fig/
HMC
Dist.pdf'
,
format
=
'pdf'
,
dpi
=
200
,
transparent
=
True
)
#fig.savefig('./Dump/Fig/
Kp
Dist.png',format='png',dpi=200,transparent=True)
#fig.savefig('./Dump/Fig/
HMC
Dist.png',format='png',dpi=200,transparent=True)
plt
.
show
()
plt
.
show
()
###
###
###
###
...
@@ -194,7 +194,7 @@ def Diagnostics(n_features,n_classes,NData, Save):
...
@@ -194,7 +194,7 @@ def Diagnostics(n_features,n_classes,NData, Save):
fig
.
subplots_adjust
(
bottom
=
0.08
,
top
=
0.95
,
left
=
0.05
,
right
=
0.98
,
wspace
=
0.2
,
hspace
=
0.2
)
fig
.
subplots_adjust
(
bottom
=
0.08
,
top
=
0.95
,
left
=
0.05
,
right
=
0.98
,
wspace
=
0.2
,
hspace
=
0.2
)
ax
=
ax
.
ravel
()
ax
=
ax
.
ravel
()
fNames
=
[
r
'$
\Delta$HMC'
,
r
'dHMC/dt,r'
,
r
'$\Delta$dHMC/dt'
,
r
'r$\left(\hat{Z}_6,\hat{Z}_{18}\right)$'
,
r
'Range r$\left(\hat{Z}_{6\mathrm{ lag}}\mathrm{, }\hat{Z}_{18}\right)$'
,
r
'MAD$\left(d\hat{Z}_6/dt\right)$'
,
r
'arg max $Z_{\mathrm{MLT}}$'
,
r
'max$\left(ASY_{max}\right)$'
,
'FWHM $ASY_{\mathrm{DD}}$'
,
'Solar cycle phase'
,
'Recurrence'
,
'Ideal (synthetic)
'
]
fNames
=
[
r
'$
k$=1'
,
r
'$k$=9'
,
r
'$k$=11'
,
r
'$k$=2'
,
r
'$k$=10'
,
r
'$k$=3'
,
r
'$k$=6'
,
r
'$k$=7'
,
r
'$k$=8'
,
r
'$k$=4'
,
r
'$k$=5'
,
r
'$k$=12
'
]
All
=
sum
(
len
(
NData
[
j
])
for
j
in
range
(
n_classes
))
All
=
sum
(
len
(
NData
[
j
])
for
j
in
range
(
n_classes
))
if
n_classes
==
2
:
if
n_classes
==
2
:
...
@@ -224,7 +224,7 @@ def Diagnostics(n_features,n_classes,NData, Save):
...
@@ -224,7 +224,7 @@ def Diagnostics(n_features,n_classes,NData, Save):
ax
[
k
].
set_xlabel
(
'Standardized feature value'
,
fontsize
=
18
)
ax
[
k
].
set_xlabel
(
'Standardized feature value'
,
fontsize
=
18
)
#if i == n_features-1: ax[i].text(0.26,1.02,'Synthetic',fontsize=8,transform=ax[i].transAxes)
#if i == n_features-1: ax[i].text(0.26,1.02,'Synthetic',fontsize=8,transform=ax[i].transAxes)
#else:
#else:
ax
[
k
].
text
(
0
,
1.02
,
str
(
k
+
1
)
+
': '
+
fNames
[
i
],
fontsize
=
18
,
transform
=
ax
[
k
].
transAxes
)
ax
[
k
].
text
(
0
,
1.02
,
fNames
[
i
],
fontsize
=
18
,
transform
=
ax
[
k
].
transAxes
)
ax
[
k
].
set_xlim
([
0
,
1
]);
ax
[
k
].
set_xticks
([
0
,
0.25
,
0.5
,
0.75
,
1.0
])
ax
[
k
].
set_xlim
([
0
,
1
]);
ax
[
k
].
set_xticks
([
0
,
0.25
,
0.5
,
0.75
,
1.0
])
ax
[
k
].
tick_params
(
axis
=
'y'
,
which
=
'both'
,
direction
=
'in'
,
labelsize
=
16
)
ax
[
k
].
tick_params
(
axis
=
'y'
,
which
=
'both'
,
direction
=
'in'
,
labelsize
=
16
)
...
@@ -269,7 +269,7 @@ def Ranking(Scores, Std, Data, Ranking, nfeaturesFinal, estimators, scoring_name
...
@@ -269,7 +269,7 @@ def Ranking(Scores, Std, Data, Ranking, nfeaturesFinal, estimators, scoring_name
axu
.
tick_params
(
axis
=
'x'
,
which
=
'both'
,
direction
=
'inout'
,
labelsize
=
16
)
axu
.
tick_params
(
axis
=
'x'
,
which
=
'both'
,
direction
=
'inout'
,
labelsize
=
16
)
if
est
==
0
:
if
est
==
0
:
ax
[
est
].
set_xlabel
(
'Number of features
'
,
fontsize
=
18
)
ax
[
est
].
set_xlabel
(
r
'Number of features ($N_f$)
'
,
fontsize
=
18
)
ax
[
est
].
legend
(
loc
=
4
,
ncol
=
1
,
frameon
=
False
,
fontsize
=
18
,
scatterpoints
=
1
)
ax
[
est
].
legend
(
loc
=
4
,
ncol
=
1
,
frameon
=
False
,
fontsize
=
18
,
scatterpoints
=
1
)
ax
[
est
].
set_ylabel
(
scoring_name
,
fontsize
=
18
)
ax
[
est
].
set_ylabel
(
scoring_name
,
fontsize
=
18
)
axu
.
set_xlabel
(
r
'Feature IDs ( $\rightarrow$ cumulative)'
,
fontsize
=
18
)
axu
.
set_xlabel
(
r
'Feature IDs ( $\rightarrow$ cumulative)'
,
fontsize
=
18
)
...
@@ -331,8 +331,8 @@ def ModelCounts(nModels,SumCounts,CV2_means,N1,K1,N2,K2,Param_Comb,BestID,scorin
...
@@ -331,8 +331,8 @@ def ModelCounts(nModels,SumCounts,CV2_means,N1,K1,N2,K2,Param_Comb,BestID,scorin
def
CM
(
CM
,
Condition
,
n_classes
,
Save
):
def
CM
(
CM
,
Condition
,
n_classes
,
Save
):
CM
=
np
.
reshape
(
CM
,(
n_classes
,
n_classes
))
CM
=
np
.
reshape
(
CM
,(
n_classes
,
n_classes
))
#
CM_names = ['TNR','FPR','FNR','TPR']
CM_names
=
[
'TNR'
,
'FPR'
,
'FNR'
,
'TPR'
]
CM_names
=
[
'NPV'
,
'FDR'
,
'FOR'
,
'PPV'
]
#
CM_names = ['NPV','FDR','FOR','PPV']
CM_names
=
np
.
asarray
(
CM_names
).
reshape
((
2
,
2
))
CM_names
=
np
.
asarray
(
CM_names
).
reshape
((
2
,
2
))
classes
=
range
(
n_classes
)
classes
=
range
(
n_classes
)
...
@@ -343,8 +343,8 @@ def CM(CM,Condition,n_classes,Save):
...
@@ -343,8 +343,8 @@ def CM(CM,Condition,n_classes,Save):
#Normalization
#Normalization
for
i
in
range
(
n_classes
):
for
i
in
range
(
n_classes
):
#CM[i,:] /= Condition[i,0]
CM
[
i
,:]
/=
Condition
[
i
,
0
]
#row-normalization
CM
[:,
i
]
/=
Condition
[
i
,
1
]
#CM[:,i] /= Condition[i,1] #column-normalization
class_names
.
append
(
np
.
str
(
i
))
class_names
.
append
(
np
.
str
(
i
))
fig
,
ax
=
plt
.
subplots
(
1
,
1
,
facecolor
=
'w'
,
edgecolor
=
'k'
,
sharey
=
True
)
fig
,
ax
=
plt
.
subplots
(
1
,
1
,
facecolor
=
'w'
,
edgecolor
=
'k'
,
sharey
=
True
)
...
@@ -371,8 +371,8 @@ def CM(CM,Condition,n_classes,Save):
...
@@ -371,8 +371,8 @@ def CM(CM,Condition,n_classes,Save):
ax
.
grid
(
False
)
ax
.
grid
(
False
)
if
Save
==
True
:
if
Save
==
True
:
fig
.
savefig
(
'./Dump/Fig/Confusion
Col
.pdf'
,
format
=
'pdf'
,
dpi
=
300
,
transparent
=
True
)
fig
.
savefig
(
'./Dump/Fig/Confusion
Row
.pdf'
,
format
=
'pdf'
,
dpi
=
300
,
transparent
=
True
)
#fig.savefig('./Dump/Fig/Confusion
Col
.png',format='png',dpi=300,transparent=True)
#fig.savefig('./Dump/Fig/Confusion
Row
.png',format='png',dpi=300,transparent=True)
plt
.
show
()
plt
.
show
()
###
###
...
@@ -411,8 +411,8 @@ def Curves(N2,K2,Curves,curve_i,Model_Mean,Model_Std,C,Save):
...
@@ -411,8 +411,8 @@ def Curves(N2,K2,Curves,curve_i,Model_Mean,Model_Std,C,Save):
ROC_inner
=
np
.
nanmean
(
tpr
,
axis
=
1
);
ROC_outer
=
np
.
nanmean
(
ROC_inner
,
axis
=
0
)
ROC_inner
=
np
.
nanmean
(
tpr
,
axis
=
1
);
ROC_outer
=
np
.
nanmean
(
ROC_inner
,
axis
=
0
)
PR_inner
=
np
.
nanmean
(
precision
,
axis
=
1
);
PR_outer
=
np
.
nanmean
(
PR_inner
,
axis
=
0
)
PR_inner
=
np
.
nanmean
(
precision
,
axis
=
1
);
PR_outer
=
np
.
nanmean
(
PR_inner
,
axis
=
0
)
axs
[
0
].
plot
(
curve_i
,
ROC_outer
,
color
=
'maroon'
,
label
=
r
'AUC = '
+
str
(
np
.
around
(
Model_Mean
[
1
],
3
))
+
'$\pm$'
+
str
(
np
.
around
(
Model_Std
[
1
],
5
))
,
zorder
=
2
)
axs
[
0
].
plot
(
curve_i
,
ROC_outer
,
color
=
'maroon'
,
label
=
'Total mean'
,
zorder
=
2
)
axs
[
1
].
plot
(
curve_i
,
PR_outer
,
color
=
'maroon'
,
label
=
r
'AUC = '
+
str
(
np
.
around
(
Model_Mean
[
0
],
3
))
+
'$\pm$'
+
str
(
np
.
around
(
Model_Std
[
0
],
5
))
,
zorder
=
2
)
axs
[
1
].
plot
(
curve_i
,
PR_outer
,
color
=
'maroon'
,
label
=
'Total mean'
,
zorder
=
2
)
P
=
C
[
1
,
0
];
PP
=
C
[
1
,
1
];
N
=
C
[
0
,
0
];
PN
=
C
[
0
,
1
];
POP
=
sum
(
C
[:,
0
])
P
=
C
[
1
,
0
];
PP
=
C
[
1
,
1
];
N
=
C
[
0
,
0
];
PN
=
C
[
0
,
1
];
POP
=
sum
(
C
[:,
0
])
#P,PP,N,PN = C
#P,PP,N,PN = C
...
@@ -423,12 +423,14 @@ def Curves(N2,K2,Curves,curve_i,Model_Mean,Model_Std,C,Save):
...
@@ -423,12 +423,14 @@ def Curves(N2,K2,Curves,curve_i,Model_Mean,Model_Std,C,Save):
axs
[
0
].
set_xlabel
(
r
'FPR = FP/N'
,
fontsize
=
18
);
axs
[
1
].
set_xlabel
(
r
'TPR = TP/P'
,
fontsize
=
18
)
axs
[
0
].
set_xlabel
(
r
'FPR = FP/N'
,
fontsize
=
18
);
axs
[
1
].
set_xlabel
(
r
'TPR = TP/P'
,
fontsize
=
18
)
axs
[
0
].
set_ylabel
(
r
'TPR = TP/P'
,
fontsize
=
18
);
axs
[
1
].
set_ylabel
(
r
'PPV = TP/PP'
,
fontsize
=
18
)
axs
[
0
].
set_ylabel
(
r
'TPR = TP/P'
,
fontsize
=
18
);
axs
[
1
].
set_ylabel
(
r
'PPV = TP/PP'
,
fontsize
=
18
)
axs
[
0
].
legend
(
loc
=
0
,
frameon
=
False
,
fontsize
=
16
);
axs
[
1
].
legend
(
loc
=
0
,
frameon
=
False
,
fontsize
=
16
)
axs
[
0
].
legend
(
loc
=
0
,
frameon
=
False
,
fontsize
=
16
);
axs
[
1
].
legend
(
loc
=
0
,
frameon
=
False
,
fontsize
=
16
)
axs
[
0
].
text
(
0.275
,
0.5
,
r
'AUC = '
+
str
(
np
.
around
(
Model_Mean
[
1
],
3
))
+
'$\pm$'
+
str
(
np
.
around
(
Model_Std
[
1
],
5
)),
bbox
=
dict
(
boxstyle
=
'square'
,
ec
=
(
0.
,
0.
,
0.
),
fc
=
(
1.
,
1.
,
1.
)),
fontsize
=
16
,
transform
=
axs
[
0
].
transAxes
)
axs
[
0
].
set_title
(
'ROC curve'
,
fontsize
=
18
)
axs
[
0
].
set_title
(
'ROC curve'
,
fontsize
=
18
)
axs
[
0
].
tick_params
(
axis
=
'x'
,
which
=
'both'
,
direction
=
'inout'
,
labelsize
=
16
)
axs
[
0
].
tick_params
(
axis
=
'x'
,
which
=
'both'
,
direction
=
'inout'
,
labelsize
=
16
)
axs
[
0
].
tick_params
(
axis
=
'y'
,
which
=
'both'
,
direction
=
'inout'
,
labelsize
=
16
)
axs
[
0
].
tick_params
(
axis
=
'y'
,
which
=
'both'
,
direction
=
'inout'
,
labelsize
=
16
)
axs
[
1
].
set_title
(
'Precision-Recall curve'
,
fontsize
=
18
)
axs
[
1
].
set_title
(
'Precision-Recall curve'
,
fontsize
=
18
)
axs
[
1
].
yaxis
.
set_label_position
(
'right'
);
axs
[
1
].
yaxis
.
set_ticks_position
(
'right'
)
axs
[
1
].
yaxis
.
set_label_position
(
'right'
);
axs
[
1
].
yaxis
.
set_ticks_position
(
'right'
)
axs
[
1
].
text
(
0.275
,
0.5
,
r
'AUC = '
+
str
(
np
.
around
(
Model_Mean
[
0
],
3
))
+
'$\pm$'
+
str
(
np
.
around
(
Model_Std
[
0
],
5
)),
bbox
=
dict
(
boxstyle
=
'square'
,
ec
=
(
0.
,
0.
,
0.
),
fc
=
(
1.
,
1.
,
1.
)),
fontsize
=
16
,
transform
=
axs
[
1
].
transAxes
)
axs
[
1
].
tick_params
(
axis
=
'x'
,
which
=
'both'
,
direction
=
'inout'
,
labelsize
=
16
)
axs
[
1
].
tick_params
(
axis
=
'x'
,
which
=
'both'
,
direction
=
'inout'
,
labelsize
=
16
)
axs
[
1
].
tick_params
(
axis
=
'y'
,
which
=
'both'
,
direction
=
'inout'
,
labelsize
=
16
)
axs
[
1
].
tick_params
(
axis
=
'y'
,
which
=
'both'
,
direction
=
'inout'
,
labelsize
=
16
)
axs
[
0
].
set_xlim
([
0
,
1
]);
axs
[
0
].
set_ylim
([
0
,
1.03
]);
axs
[
1
].
set_xlim
([
0
,
1
]);
axs
[
1
].
set_ylim
([
0
,
1.03
])
axs
[
0
].
set_xlim
([
0
,
1
]);
axs
[
0
].
set_ylim
([
0
,
1.03
]);
axs
[
1
].
set_xlim
([
0
,
1
]);
axs
[
1
].
set_ylim
([
0
,
1.03
])
...
@@ -440,7 +442,7 @@ def Curves(N2,K2,Curves,curve_i,Model_Mean,Model_Std,C,Save):
...
@@ -440,7 +442,7 @@ def Curves(N2,K2,Curves,curve_i,Model_Mean,Model_Std,C,Save):
plt
.
show
()
plt
.
show
()
###
###
###
###
def
Musical
(
Time
,
HTime
,
Storms
,
Kp_all
,
KpHours_all
,
SN
,
SNYears
,
HMC
,
HMC_filt
,
Training
,
Save
):
def
Musical
(
Time
,
HTime
,
Storms
,
Kp_all
,
KpHours_all
,
SN
,
SNYears
,
HMC
,
HMC_filt
,
Reference
,
Save
):
fig
,
axs
=
plt
.
subplots
(
1
,
4
,
facecolor
=
'w'
,
edgecolor
=
'k'
,
sharey
=
True
)
fig
,
axs
=
plt
.
subplots
(
1
,
4
,
facecolor
=
'w'
,
edgecolor
=
'k'
,
sharey
=
True
)
fig
.
set_size_inches
([
6.69
,
8.86
],
forward
=
True
)
fig
.
set_size_inches
([
6.69
,
8.86
],
forward
=
True
)
...
@@ -531,14 +533,14 @@ def Musical(Time,HTime,Storms,Kp_all,KpHours_all,SN,SNYears,HMC,HMC_filt,Trainin
...
@@ -531,14 +533,14 @@ def Musical(Time,HTime,Storms,Kp_all,KpHours_all,SN,SNYears,HMC,HMC_filt,Trainin
# Plot storm events from catalogs (papers)
# Plot storm events from catalogs (papers)
cm
=
plt
.
cm
.
get_cmap
(
'seismic'
)
cm
=
plt
.
cm
.
get_cmap
(
'seismic'
)
KnownE
=
np
.
where
(
Training
[:,
2
]
==
1
)[
0
]
KnownE
=
np
.
where
(
Reference
[:,
2
]
==
1
)[
0
]
diff_t
=
(
pd
.
to_datetime
(
Time
[
Training
[
KnownE
,
1
]])
-
dt
.
datetime
(
1900
,
1
,
1
,
0
,
0
,
0
))
diff_t
=
(
pd
.
to_datetime
(
Time
[
Reference
[
KnownE
,
1
]])
-
dt
.
datetime
(
1900
,
1
,
1
,
0
,
0
,
0
))
y_t
=
np
.
zeros
(
len
(
Training
[
KnownE
,
1
]));
x_t
=
np
.
zeros
(
len
(
Training
[
KnownE
,
1
]))
y_t
=
np
.
zeros
(
len
(
Reference
[
KnownE
,
1
]));
x_t
=
np
.
zeros
(
len
(
Reference
[
KnownE
,
1
]))
for
i
in
range
(
len
(
Training
[
KnownE
,
1
])):
for
i
in
range
(
len
(
Reference
[
KnownE
,
1
])):
y_t
[
i
]
=
np
.
divide
(
diff_t
[
i
].
total_seconds
()
/
(
60
*
60
*
24
),
SolarRot
)
y_t
[
i
]
=
np
.
divide
(
diff_t
[
i
].
total_seconds
()
/
(
60
*
60
*
24
),
SolarRot
)
x_t
[
i
]
=
np
.
mod
(
diff_t
[
i
].
total_seconds
()
/
(
60
*
60
*
24
),
SolarRot
)
x_t
[
i
]
=
np
.
mod
(
diff_t
[
i
].
total_seconds
()
/
(
60
*
60
*
24
),
SolarRot
)
z
=
Training
[
KnownE
,
0
]
z
=
Reference
[
KnownE
,
0
]
sc
=
axs1
.
scatter
(
x_t
,
y_t
,
c
=
z
,
vmin
=
0.0
,
vmax
=
1.0
,
s
=
5
,
cmap
=
cm
,
zorder
=
3
)
sc
=
axs1
.
scatter
(
x_t
,
y_t
,
c
=
z
,
vmin
=
0.0
,
vmax
=
1.0
,
s
=
5
,
cmap
=
cm
,
zorder
=
3
)
cbar_axis
=
fig
.
add_axes
([
0.45
,
0.032
,
0.3
,
0.01
])
cbar_axis
=
fig
.
add_axes
([
0.45
,
0.032
,
0.3
,
0.01
])
cbar
=
plt
.
colorbar
(
sc
,
cax
=
cbar_axis
,
use_gridspec
=
False
,
orientation
=
'horizontal'
,
ticks
=
[
0
,
0.5
,
1
])
cbar
=
plt
.
colorbar
(
sc
,
cax
=
cbar_axis
,
use_gridspec
=
False
,
orientation
=
'horizontal'
,
ticks
=
[
0
,
0.5
,
1
])
...
@@ -547,18 +549,18 @@ def Musical(Time,HTime,Storms,Kp_all,KpHours_all,SN,SNYears,HMC,HMC_filt,Trainin
...
@@ -547,18 +549,18 @@ def Musical(Time,HTime,Storms,Kp_all,KpHours_all,SN,SNYears,HMC,HMC_filt,Trainin
cbar
.
ax
.
set_xticklabels
([
'0:C/SIR'
,
'ICME probability'
,
'1:ICME'
],
fontsize
=
11
)
cbar
.
ax
.
set_xticklabels
([
'0:C/SIR'
,
'ICME probability'
,
'1:ICME'
],
fontsize
=
11
)
cbar
.
ax
.
tick_params
(
axis
=
'x'
,
which
=
'both'
,
direction
=
'in'
)
cbar
.
ax
.
tick_params
(
axis
=
'x'
,
which
=
'both'
,
direction
=
'in'
)
#CIRs = np.where(
Training
[KnownE,0] == 0)[0]
#CIRs = np.where(
Reference
[KnownE,0] == 0)[0]
#CMEs = np.where(
Training
[KnownE,1] == 1)[0]
#CMEs = np.where(
Reference
[KnownE,1] == 1)[0]
# Plots class occurrences
# Plots class occurrences
nip
=
0
nip
=
0
for
i
in
[
1
,
0
]:
for
i
in
[
1
,
0
]:
zi
=
np
.
where
(
z
==
i
)[
0
]
zi
=
np
.
where
(
z
==
i
)[
0
]
ni
,
bins
=
np
.
histogram
(
HTime
[
Training
[
KnownE
[
zi
],
1
],
4
],
np
.
arange
(
1900
,
2017
,
1
))
ni
,
bins
=
np
.
histogram
(
HTime
[
Reference
[
KnownE
[
zi
],
1
],
4
],
np
.
arange
(
1900
,
2017
,
1
))
axs2
.
barh
(
np
.
arange
(
1900
,
2016
,
1
),
ni
,
left
=
nip
,
height
=
0.8
,
color
=
cm
(
float
(
i
)),
zorder
=
5
)
axs2
.
barh
(
np
.
arange
(
1900
,
2016
,
1
),
ni
,
left
=
nip
,
height
=
0.8
,
color
=
cm
(
float
(
i
)),
zorder
=
5
)
nip
+=
ni
nip
+=
ni
#Turner_CIR = np.where(np.logical_and(
Training
[:,2] == b'Turner',Target['type'] ==0))[0]
#Turner_CIR = np.where(np.logical_and(
Reference
[:,2] == b'Turner',Target['type'] ==0))[0]
#Jian_CIR = np.where(np.logical_and(Target['source'] == b'Jian',Target['type'] ==0))[0]
#Jian_CIR = np.where(np.logical_and(Target['source'] == b'Jian',Target['type'] ==0))[0]
#Shen_CIR = np.where(np.logical_and(Target['source'] == b'Shen',Target['type'] ==0))[0]
#Shen_CIR = np.where(np.logical_and(Target['source'] == b'Shen',Target['type'] ==0))[0]
#Turner_CME = np.where(np.logical_and(Target['source'] == b'Turner',Target['type'] ==1))[0]
#Turner_CME = np.where(np.logical_and(Target['source'] == b'Turner',Target['type'] ==1))[0]
...
...
Readme.md
View file @
eb9510fe
# ClassifyStorms -
A
n automatic classifier for geomagnetic storm drivers based on machine learning techniques
# ClassifyStorms -
a
n automatic classifier for geomagnetic storm drivers based on machine learning techniques
### Author
### Author
Leonie Pick, GFZ German Research Centre for Geoscieces, leonie.pick@gfz-potsdam.de
Leonie Pick, GFZ German Research Centre for Geoscieces, leonie.pick@gfz-potsdam.de
...
@@ -32,7 +32,7 @@ executed by a supervised binary logistic regression model in the framework of py
...
@@ -32,7 +32,7 @@ executed by a supervised binary logistic regression model in the framework of py
### How to run ClassifyStorms?
### How to run ClassifyStorms?
Download the GitLab project 'ClassifyStorms' from http://gitext.gfz-potsdam.de/lpick/ClassifyStorms by clicking on the 'Download'
Download the GitLab project 'ClassifyStorms' from http://gitext.gfz-potsdam.de/lpick/ClassifyStorms by clicking on the 'Download'
button (top right). Additionally, download 'Input.nc' from
ftp://ftp.gfz-potsdam.de/home/mag/pick/ClassifyStorms
and place it into
button (top right). Additionally, download 'Input.nc' from
GFZ Data Services ( http://doi.org/10.5880/GFZ.2.3.2019.003 )
and place it into
the extracted directory 'ClassifyStorms-master'. Navigate to ClassifyStorms-master and start the jupyter server
the extracted directory 'ClassifyStorms-master'. Navigate to ClassifyStorms-master and start the jupyter server
(http://jupyter.org) by typing 'jupyter notebook' into the command line. This will open the jupyter 'Home' in your web
(http://jupyter.org) by typing 'jupyter notebook' into the command line. This will open the jupyter 'Home' in your web
browser. Select 'ClassifyStorms.ipynb' from the list and run the notebook by clicking 'Run'.
browser. Select 'ClassifyStorms.ipynb' from the list and run the notebook by clicking 'Run'.
...
@@ -46,6 +46,6 @@ browser. Select 'ClassifyStorms.ipynb' from the list and run the notebook by cli
...
@@ -46,6 +46,6 @@ browser. Select 'ClassifyStorms.ipynb' from the list and run the notebook by cli
project's master branch (destination).
project's master branch (destination).
### References
### References
+
The original version of this software is a supplement to Pick et al.,
GRL, 2019, submitted
.
+
The original version of this software is a supplement to Pick et al.,
Earth and Space Science, 2019
.
+
Details on the HMC index are given in Pick et al., JGR Space Physics, 2019
+
Details on the HMC index are given in Pick et al., JGR Space Physics, 2019
( http://doi.org/10.1029/2018JA026185, with data published under http://doi.org/10.5880/GFZ.2.3.2018.006 ).
( http://doi.org/10.1029/2018JA026185, with data published under http://doi.org/10.5880/GFZ.2.3.2018.006 ).
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment