Stoqs: 2개 μ΄μƒμ˜ λ§€κ°œλ³€μˆ˜μ™€ κ΄€λ ¨λœ 데이터λ₯Ό κ°€μ Έμ˜€λŠ” ν•¨μˆ˜ κ΅¬ν˜„

에 λ§Œλ“  2018λ…„ 10μ›” 30일  Β·  8μ½”λ©˜νŠΈ  Β·  좜처: stoqs/stoqs

https://github.com/stoqs/stoqs/blob/master/stoqs/contrib/analysis/__init__.py , _ getMeasuredPPData κ΅¬ν˜„λœ ν•¨μˆ˜λ₯Ό ν™•μž₯ν•˜μ—¬ 두 개의 λ§€κ°œλ³€μˆ˜κ°€ 제곡될 λ•Œ μΈ‘μ •λœ 데이터λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€. 주어진 ν”Œλž«νΌμ— λŒ€ν•œ λͺ¨λ“  λ§€κ°œλ³€μˆ˜ λ˜λŠ” 주어진 λ§€κ°œλ³€μˆ˜ λͺ©λ‘μ„ κ°€μ Έμ˜€λ„λ‘ 이 κΈ°λŠ₯을 ν™•μž₯ν•˜λ©΄ 좜λ ₯ 데이터λ₯Ό νƒμƒ‰ν•˜κ³  λͺ¨λΈλ§ν•  λ•Œ 더 λ§Žμ€ 데이터와 κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 기계 ν•™μŠ΅ μ•Œκ³ λ¦¬μ¦˜μ˜ μ„±λŠ₯을 κ°œμ„ ν•˜λŠ” 데 μ€‘μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
λͺ©ν‘œλŠ” 이 데이터λ₯Ό pandas 데이터 ν”„λ ˆμž„ λ˜λŠ” 이와 μœ μ‚¬ν•œ κ²ƒμœΌλ‘œ κ°€μ Έμ™€μ„œ μΆ”κ°€ 기계 ν•™μŠ΅ μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•  λ•Œ μž‘μ—…ν•˜κΈ° μ‰¬μš΄ κΈ°λ°˜μ„ κ°–λŠ” κ²ƒμž…λ‹ˆλ‹€.
μ € μžμ‹ , @MBARIMike , @bretstine 및 @markmocek 은 Fall Capstone 2018의 μΌλΆ€λ‘œ 이 문제λ₯Ό 더 μžμ„Ένžˆ 쑰사할 κ²ƒμž…λ‹ˆλ‹€.

λͺ¨λ“  8 λŒ“κΈ€

이것은 STOQS μ½”λ“œ κΈ°λ°˜μ— μ€‘μš”ν•œ μΆ”κ°€ 사항이 될 κ²ƒμž…λ‹ˆλ‹€!

λ‚˜λŠ” μš°λ¦¬κ°€ ν–₯μƒν•˜κ³ μžν•˜λŠ” 것은 생각 createLabels() 의 κΈ°λŠ₯ classify.py μ—μ„œ μ•½κ°„ λ‹€λ₯Έ 방법을 ν˜ΈμΆœν•˜λŠ” ν”„λ‘œκ·Έλž¨, __init__.py : _getPPData () . 이 λ©”μ„œλ“œκ°€ 호좜되면 λ°˜ν™˜μ—μ„œ MeasuredParameter ID만 μ‚¬μš©λ©λ‹ˆλ‹€. 이 문제의 μš”κ΅¬ 사항을 μ˜¬λ°”λ₯΄κ²Œ ν•΄μ„ν•˜λ©΄ λ‹€μŒμ€ κΈ°λŠ₯ μš”κ΅¬ 사항 λͺ©λ‘μž…λ‹ˆλ‹€.

  • [ ] ν”Œλž«νΌμ—μ„œ MeasuredParameter 데이터 κ°’μ˜ μˆ˜μ— 관계없이 ν…Œμ΄λΈ” 생성
  • [ ] μƒˆ λ ˆμ΄λΈ”μ„ DB에 μΆ”κ°€ν•  수 μžˆλ„λ‘ 데이터와 ν•¨κ»˜ MeasuredParameter IDλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • [ ] μ‹œκ°„ λ˜λŠ” 깊이 λ²”μœ„μ— 따라 선택을 μ œν•œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • [ ] MeasuredParameter의 κ°’ λ²”μœ„λ₯Ό 기반으둜 선택을 μ œν•œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

제 기얡이 λ§žλ‹€λ©΄ _getPPData() λŠ” UI용으둜 이미 개발된 λ©”μ„œλ“œλ₯Ό μž¬μ‚¬μš©ν•˜κ³  MeasuredParameter의 κ°œμˆ˜μ— 관계없이 pvDict 사전을 전달할 수 μžˆλ‹€λŠ” μ μ—μ„œ _getMeasuredPPData() 보닀 μΌλ°˜ν™”λœ κ°œμ„ μž…λ‹ˆλ‹€. 선택에 λŒ€ν•œ κ°’ μ œμ•½.

UI용으둜 이미 개발된 μ½”λ“œλŠ” UI의 Parameter-Parameter μ„Ήμ…˜μ— ν”Œλ‘œνŒ…ν•  μ—¬λŸ¬ λ§€κ°œλ³€μˆ˜λ₯Ό κ²€μƒ‰ν•˜κΈ° μœ„ν•΄ 자체 쑰인 문을 μ‹€ν–‰ν•˜λŠ” μ›μ‹œ SQL 문을 κ΅¬μ„±ν•©λ‹ˆλ‹€. 이 μ½”λ“œλŠ” ν™•μž₯ν•˜κΈ° μ–΄λ €μšΈ κ²ƒμž…λ‹ˆλ‹€. μ•„λ§ˆλ„ μš°λ¦¬λŠ” 기계 ν•™μŠ΅ κΈ°μˆ μ„ μ‚¬μš©ν•˜μ—¬ 탐색 및 λͺ¨λΈλ§μ— μ ν•©ν•œ ν˜•μ‹μœΌλ‘œ 데이터λ₯Ό κ°€μ Έμ˜€λŠ” μƒˆλ‘œμš΄ μ ‘κ·Ό 방식을 μ·¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒμ€ μƒˆλ‘œμš΄ μ ‘κ·Ό 방식, 즉 doradoμ—μ„œ 처음 20개의 데이터 값을 κ°€μ Έμ˜€λŠ” Django 쿼리의 μ‹œμž‘μž…λ‹ˆλ‹€.

(venv-stoqs) [vagrant<strong i="6">@localhost</strong> stoqsgit]$ stoqs/manage.py shell_plus
...

In [1]: mps = MeasuredParameter.objects.using('stoqs_september2013_o').filter(
   ...:                 measurement__instantpoint__activity__platform__name='dorado')
   ...:

In [2]: for i, mp in enumerate(mps[:20]):
   ...:     if i == 0:
   ...:         print("time, depth, latitude, longitude, parameter__name, measuredparameter__datavalue")
   ...:     print(f"{mp.measurement.instantpoint.timevalue}, {mp.measurement.depth:.2f},"
   ...:           f" {mp.measurement.geom.y:.6f}, {mp.measurement.geom.x:.6f}"
   ...:           f" {mp.parameter.name}, {mp.datavalue}")
   ...:
time, depth, latitude, longitude, parameter__name, measuredparameter__datavalue
2013-09-17 18:42:20, -0.03, 36.734970, -122.128144 sigmat, 25.1383576072121
2013-09-17 18:42:20, -0.03, 36.734970, -122.128144 spice, 0.830712889765499
2013-09-17 18:42:20, -0.03, 36.734970, -122.128144 altitude, 1395.68956636994
2013-09-17 18:42:20, -0.03, 36.734970, -122.128144 temperature, 13.9910522171992
2013-09-17 18:42:20, -0.03, 36.734970, -122.128144 salinity, 33.6403972259011
2013-09-17 18:42:20, -0.03, 36.734970, -122.128144 oxygen, 5.670288605996
2013-09-17 18:42:20, -0.03, 36.734970, -122.128144 nitrate, 0.21
2013-09-17 18:42:20, -0.03, 36.734970, -122.128144 bbp420, 0.00231458255927606
2013-09-17 18:42:20, -0.03, 36.734970, -122.128144 bbp700, 0.00228426640768986
2013-09-17 18:42:20, -0.03, 36.734970, -122.128144 fl700_uncorr, 0.000823624706576738
2013-09-17 18:42:20, -0.03, 36.734970, -122.128144 biolume, 194666664.695293
2013-09-17 18:42:20, -0.03, 36.734970, -122.128144 roll, -4.08951048388392
2013-09-17 18:42:20, -0.03, 36.734970, -122.128144 pitch, -0.105888989907026
2013-09-17 18:42:20, -0.03, 36.734970, -122.128144 yaw, 175.513420572358
2013-09-17 18:42:20, -0.03, 36.734970, -122.128144 sepCountList, None
2013-09-17 18:42:20, -0.03, 36.734970, -122.128144 mepCountList, None
2013-09-17 18:42:18, -0.04, 36.734989, -122.128162 sigmat, 25.1403727711047
2013-09-17 18:42:18, -0.04, 36.734989, -122.128162 spice, 0.829269194464183
2013-09-17 18:42:18, -0.04, 36.734989, -122.128162 altitude, 1395.49904668803
2013-09-17 18:42:18, -0.04, 36.734989, -122.128162 temperature, 13.9828055034561

Pandasμ—μ„œ 뢄석할 수 μžˆλŠ” ν˜•μ‹μœΌλ‘œ 데이터λ₯Ό κ°€μ Έμ˜€κΈ° μœ„ν•΄ 이와 같은 좜λ ₯을 ν”Όλ²—ν•˜λŠ” 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

@MBARIMike λŠ” ν™•μ‹€νžˆ μš°λ¦¬κ°€ κ°€κ³ μž ν•˜λŠ” λ°©ν–₯κ³Ό λΉ„μŠ·ν•©λ‹ˆλ‹€. μ–΄μ©Œλ©΄ κΈ°μ‘΄ κΈ°λŠ₯의 "ν™•μž₯"이 μš°λ¦¬κ°€ μƒˆλ‘œ μ‹œμž‘ν•œλ‹€λŠ” 점을 κ°μ•ˆν•  λ•Œ 잘λͺ»λœ ν‘œν˜„μΌ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. ν•΄λͺ…ν•΄μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

λ˜ν•œ Pandasμ—λŠ” Django 데이터λ₯Ό 데이터 ν”„λ ˆμž„μœΌλ‘œ κ°€μ Έμ˜€λŠ” DataFrame.from_records() λ©”μ„œλ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€. 예:

In [1]: import pandas as pd

In [2]: mps = MeasuredParameter.objects.using('stoqs_september2013_o').filter(
   ...:                 measurement__instantpoint__activity__platform__name='dorado')
   ...:

In [3]: df = pd.DataFrame.from_records(mps.values(
   ...:     'measurement__instantpoint__timevalue', 'measurement__depth',
   ...:     'measurement__geom', 'parameter__name', 'datavalue', 'id'
   ...:     ))
   ...:

In [4]: df.head(20)
Out[4]:
       datavalue       id  measurement__depth                         measurement__geom measurement__instantpoint__timevalue parameter__name
0   2.476802e+01  5664562           -0.055507    [-121.934897431052, 36.90470983771924]                  2013-09-16 20:55:49          sigmat
1   1.262683e+00  5673227           -0.055507    [-121.934897431052, 36.90470983771924]                  2013-09-16 20:55:49           spice
2   2.546787e+01  5690556           -0.055507    [-121.934897431052, 36.90470983771924]                  2013-09-16 20:55:49        altitude
3   1.582349e+01  5577911           -0.055507    [-121.934897431052, 36.90470983771924]                  2013-09-16 20:55:49     temperature
4   3.367453e+01  5629901           -0.055507    [-121.934897431052, 36.90470983771924]                  2013-09-16 20:55:49        salinity
5   6.593205e+00  5586576           -0.055507    [-121.934897431052, 36.90470983771924]                  2013-09-16 20:55:49          oxygen
6   5.360300e+02  5595241           -0.055507    [-121.934897431052, 36.90470983771924]                  2013-09-16 20:55:49         nitrate
7   9.528316e-03  5603906           -0.055507    [-121.934897431052, 36.90470983771924]                  2013-09-16 20:55:49          bbp420
8   6.610731e-03  5612571           -0.055507    [-121.934897431052, 36.90470983771924]                  2013-09-16 20:55:49          bbp700
9   4.761394e-04  5621236           -0.055507    [-121.934897431052, 36.90470983771924]                  2013-09-16 20:55:49    fl700_uncorr
10  9.728126e+09  5638566           -0.055507    [-121.934897431052, 36.90470983771924]                  2013-09-16 20:55:49         biolume
11 -1.292509e+01  5647231           -0.055507    [-121.934897431052, 36.90470983771924]                  2013-09-16 20:55:49            roll
12 -6.497791e+00  5655896           -0.055507    [-121.934897431052, 36.90470983771924]                  2013-09-16 20:55:49           pitch
13  5.802254e+01  5664561           -0.055507    [-121.934897431052, 36.90470983771924]                  2013-09-16 20:55:49             yaw
14           NaN  5690705           -0.055507    [-121.934897431052, 36.90470983771924]                  2013-09-16 20:55:49    sepCountList
15           NaN  5691417           -0.055507    [-121.934897431052, 36.90470983771924]                  2013-09-16 20:55:49    mepCountList
16  2.476093e+01  5664563           -0.082238  [-121.93492018129153, 36.90469289678784]                  2013-09-16 20:55:47          sigmat
17  1.270436e+00  5673228           -0.082238  [-121.93492018129153, 36.90469289678784]                  2013-09-16 20:55:47           spice
18  2.544076e+01  5690555           -0.082238  [-121.93492018129153, 36.90469289678784]                  2013-09-16 20:55:47        altitude
19  1.585611e+01  5577910           -0.082238  [-121.93492018129153, 36.90469289678784]                  2013-09-16 20:55:47     temperature

λ”°λΌμ„œ loadLabeledData 와 같이 x와 yλ₯Ό μ‘°μž‘ν•˜λŠ” λŒ€μ‹  이 μ½”λ“œλ‘œ μƒˆ ν•¨μˆ˜λ₯Ό μž‘μ„±ν•˜κ³  pandas 데이터 ν”„λ ˆμž„μ„ λ°˜ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. classify.py 에 μΆ”κ°€ν•˜μ—¬ 이 μž‘μ—…μ„ μˆ˜ν–‰ν•˜κ±°λ‚˜ μƒˆ νŒŒμΌμ„ μƒμ„±ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ?

μ§€κΈˆμ€ μƒˆ νŒŒμΌμ„ λ§Œλ“œλŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μ•„λ§ˆλ„ 뢄석을 λ³΄μ—¬μ£ΌλŠ” Jupyter Notebook이 될 κ²ƒμž…λ‹ˆλ‹€.

λ”°λΌμ„œ classify.pyλ₯Ό 보면 이 μƒˆ νŒŒμΌμ— λŒ€ν•΄ process_command_line() ν•¨μˆ˜λ₯Ό ꡬ성해야 ν•©λ‹ˆκΉŒ?

κΈ°λŠ₯적 μš”κ΅¬ 사항을 더 잘 이해해야 ν•©λ‹ˆλ‹€. μ•„λ§ˆλ„ μƒˆλ‘œμš΄ μ˜΅μ…˜(λ˜λŠ” 이미 classify.py에 μžˆλŠ” 열망적인 μ˜΅μ…˜μ˜ κ΅¬ν˜„)이 μ ‘κ·Ό 방식일 κ²ƒμž…λ‹ˆλ‹€. Jupyter Notebook 데λͺ¨λ₯Ό 보고 μ‹ΆμŠ΅λ‹ˆλ‹€. κ²°μ •ν•˜λŠ” 데 도움이 될 κ²ƒμž…λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰