├── .gitignore
├── 1-basic-envir
├── 1-get-started.md
├── 2-python-envir.md
├── BonusGoogleCloud.md
├── BonusMatlab.ipynb
├── BonusR.ipynb
├── pictures
│ ├── Picture2.png
│ ├── Picture3.png
│ ├── QQ截图20211019102557.jpg
│ ├── QQ截图20211026164025.png
│ ├── QQ截图20211026165042.png
│ ├── QQ截图20211026171908.png
│ ├── QQ截图20211026172108.png
│ ├── QQ截图20211026172637.png
│ ├── QQ截图20211026172826.png
│ ├── QQ截图20211026175505.png
│ ├── QQ截图20211026210552.png
│ ├── QQ截图20211026211810.png
│ ├── QQ截图20211026221536.png
│ ├── QQ截图20211026231602.png
│ ├── debug-configurations.png
│ ├── state_of_packaging.jpg
│ ├── v2-313da6d32657e11ae7d6ed5085ddb9fd_720w.jpg
│ ├── v2-a3f8d44a12dc669abcb3da415940c2fc_720w.png
│ ├── v2-b5ed4693aebbb3ed1180deae916e9130_b.gif
│ ├── v2-ba3030b67beda785f9235eb7f41f9291_720w.jpg
│ ├── v2-e9e0fe4205328b055ffd8a02207efb54_b.gif
│ ├── vscode-ubuntu.png
│ └── workflow.png
├── readme.md
└── triarea.m
├── 1-learn-python
├── 1-python-basic.ipynb
├── 2-python-concept.ipynb
├── 3-python-library.ipynb
├── 4-python-magic.ipynb
├── data.json
├── dump.txt
├── globalLog.py
├── mydict.py
├── mydict2.py
├── mydict_test.py
├── pictures
│ ├── 1489720930-5882-BO4qO.png
│ ├── 1489720930-6827-Vtk4m.png
│ ├── 1489720931-7116-4AQC6.png
│ ├── 1_RKPXdVaqHRzmQ5RPBH_d-g.png
│ ├── 1_V5N9gJdnToIrgAgVJTtl_w.png
│ ├── 6056x8a7rwk1hv9h4oot.png
│ ├── QQ截图20210106180304.png
│ ├── QQ截图20211019104157.jpg
│ ├── QQ截图20211026160107.png
│ ├── QQ截图20211124230028.png
│ ├── blur.jpg
│ ├── class-chain.5cb031a299fe.png
│ ├── comparison.png
│ ├── pkg1.9af1c7aea48f.png
│ ├── res1.jpg
│ ├── res2.jpg
│ ├── test.jpg
│ └── thumbnail.jpg
├── pkg
│ ├── __init__.py
│ ├── mod1.py
│ └── mod2.py
├── readme.md
├── simple.py
├── test.txt
└── test
│ └── test1.txt
├── 2-numpy-examples
├── 1-basic_numpy.ipynb
├── 123.npy
├── 123.npz
├── 170px-Row_and_column_major_order.png
├── 2-numpy_math.ipynb
├── readme.md
├── test
│ ├── test.out
│ ├── test1.out
│ ├── test2.out
│ ├── test3.out
│ ├── test4.out
│ ├── test5.out
│ └── test6.out
└── v2-4e4ce4ad47c1409e837b0182b39f84e3_r.jpg
├── 2-pandas-examples
├── 1-basic-pandas.ipynb
├── AK_U.xlsx
├── Sheet1.csv
├── TMaxMon.csv
├── attr_temp99%_days_99sites.csv
├── attr_temp99%_days_99sites.feather
├── readme.md
├── test-comment.csv
├── test.csv
└── test.json
├── 2-scipy-example
├── readme.md
└── scipy.ipynb
├── 2-xarray-example
├── 1-basic-xarray.ipynb
├── 2-xarray-gallery.ipynb
├── gallery-data
│ ├── 14303200
│ │ ├── 14303200_1990_nomask.nc
│ │ ├── 14303200_1991_nomask.nc
│ │ ├── 14303200_1995_nomask.nc
│ │ ├── 14303200_1996_nomask.nc
│ │ └── 14303200_1997_nomask.nc
│ └── 14306340
│ │ ├── 14306340_1990_nomask.nc
│ │ ├── 14306340_1991_nomask.nc
│ │ ├── 14306340_1995_nomask.nc
│ │ ├── 14306340_1996_nomask.nc
│ │ └── 14306340_1997_nomask.nc
├── pictures
│ └── dataset-diagram.png
├── readme.md
└── saved_on_disk.nc
├── 3-basic-pyviz
├── 1-matplotlib-intro
│ ├── axes-in-matplotlib.png
│ ├── datasets
│ │ ├── austin_weather.csv
│ │ ├── countries.csv
│ │ ├── exams.csv
│ │ ├── national_parks.csv
│ │ ├── stocks.csv
│ │ └── types_movies.csv
│ ├── figure-matplotlib.png
│ ├── how-to-use-matplotlib.ipynb
│ ├── matplotlib4hydro.ipynb
│ └── my_figure.png
├── 1_K8q5e6QuHTGSPtObumouVQ.png
├── 1_QlF69QpvfTQsf2pulCj1og.png
├── 2-seaborn-intro
│ ├── ElegantFigures.md
│ ├── data
│ │ ├── 2014-baby-names-illinois.csv
│ │ ├── 2015-baby-names-illinois.csv
│ │ ├── billboard.csv
│ │ ├── pew-raw.csv
│ │ ├── tb-raw.csv
│ │ ├── weather-raw.csv
│ │ └── weather.txt
│ ├── fig
│ │ ├── box.png
│ │ └── subplot.png
│ ├── hsl_diagram_618.png
│ ├── lightness_hue_saturation_618.png
│ ├── red_green_blue_618.png
│ ├── seaborn.ipynb
│ ├── simultaneous_contrast_618.png
│ ├── three_perceptual_palettes_618.png
│ └── v59i10.pdf
└── readme.md
├── 3-gis-pyviz
├── 1-cartopy-intro.ipynb
├── 2-geoplot-intro.ipynb
├── Miriam.A2012270.2050.2km.jpg
├── clickevent
│ └── plot_map_ts_click_event.py
├── largest-cities-usa.png
├── readme.md
├── shpfile
│ ├── YangtzeRiverBasins.cpg
│ ├── YangtzeRiverBasins.dbf
│ ├── YangtzeRiverBasins.prj
│ ├── YangtzeRiverBasins.qmd
│ ├── YangtzeRiverBasins.shp
│ ├── YangtzeRiverBasins.shx
│ ├── chosen_stations.dbf
│ ├── chosen_stations.prj
│ ├── chosen_stations.shp
│ ├── chosen_stations.shx
│ ├── river_in_sanxia_chosen.dbf
│ ├── river_in_sanxia_chosen.prj
│ ├── river_in_sanxia_chosen.shp
│ └── river_in_sanxia_chosen.shx
└── usa-city-elevations.png
├── 3-interactive-pyviz
├── 1-bokeh-intro.ipynb
├── 2-plotly-intro.ipynb
├── first_figure.html
├── first_geo_figure.html
├── first_us_figure.html
├── lines.html
├── log_lines.html
└── readme.md
├── LICENSE
├── README.md
└── environment.yml
/.gitignore:
--------------------------------------------------------------------------------
1 | ### R template
2 | # History files
3 | .Rhistory
4 | .Rapp.history
5 |
6 | # Session Data files
7 | .RData
8 |
9 | # User-specific files
10 | .Ruserdata
11 |
12 | # Example code in package build process
13 | *-Ex.R
14 |
15 | # Output files from R CMD build
16 | /*.tar.gz
17 |
18 | # Output files from R CMD check
19 | /*.Rcheck/
20 |
21 | # RStudio files
22 | .Rproj.user/
23 |
24 | # produced vignettes
25 | vignettes/*.html
26 | vignettes/*.pdf
27 |
28 | # OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3
29 | .httr-oauth
30 |
31 | # knitr and R markdown default cache directories
32 | *_cache/
33 | /cache/
34 |
35 | # Temporary files created by R markdown
36 | *.utf8.md
37 | *.knit.md
38 |
39 | ### Python template
40 | # Byte-compiled / optimized / DLL files
41 | __pycache__/
42 | *.py[cod]
43 | *$py.class
44 |
45 | # C extensions
46 | *.so
47 |
48 | # Distribution / packaging
49 | .Python
50 | build/
51 | develop-eggs/
52 | dist/
53 | downloads/
54 | eggs/
55 | .eggs/
56 | lib/
57 | lib64/
58 | parts/
59 | sdist/
60 | var/
61 | wheels/
62 | pip-wheel-metadata/
63 | share/python-wheels/
64 | *.egg-info/
65 | .installed.cfg
66 | *.egg
67 | MANIFEST
68 |
69 | # PyInstaller
70 | # Usually these files are written by a python script from a template
71 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
72 | *.manifest
73 | *.spec
74 |
75 | # Installer logs
76 | pip-log.txt
77 | pip-delete-this-directory.txt
78 |
79 | # Unit test / coverage reports
80 | htmlcov/
81 | .tox/
82 | .nox/
83 | .coverage
84 | .coverage.*
85 | .cache
86 | nosetests.xml
87 | coverage.xml
88 | *.cover
89 | .hypothesis/
90 | .pytest_cache/
91 |
92 | # Translations
93 | *.mo
94 | *.pot
95 |
96 | # Django stuff:
97 | *.log
98 | local_settings.py
99 | db.sqlite3
100 |
101 | # Flask stuff:
102 | instance/
103 | .webassets-cache
104 |
105 | # Scrapy stuff:
106 | .scrapy
107 |
108 | # Sphinx documentation
109 | docs/_build/
110 |
111 | # PyBuilder
112 | target/
113 |
114 | # Jupyter Notebook
115 | .ipynb_checkpoints
116 |
117 | # IPython
118 | profile_default/
119 | ipython_config.py
120 |
121 | # pyenv
122 | .python-version
123 |
124 | # pipenv
125 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
126 | # However, in case of collaboration, if having platform-specific dependencies or dependencies
127 | # having no cross-platform support, pipenv may install dependencies that don't work, or not
128 | # install all needed dependencies.
129 | #Pipfile.lock
130 |
131 | # celery beat schedule file
132 | celerybeat-schedule
133 |
134 | # SageMath parsed files
135 | *.sage.py
136 |
137 | # Environments
138 | .env
139 | .venv
140 | env/
141 | venv/
142 | ENV/
143 | env.bak/
144 | venv.bak/
145 |
146 | # Spyder project settings
147 | .spyderproject
148 | .spyproject
149 |
150 | # Rope project settings
151 | .ropeproject
152 |
153 | # mkdocs documentation
154 | /site
155 |
156 | # mypy
157 | .mypy_cache/
158 | .dmypy.json
159 | dmypy.json
160 |
161 | # Pyre type checker
162 | .pyre/
163 |
164 | ### VisualStudio template
165 | ## Ignore Visual Studio temporary files, build results, and
166 | ## files generated by popular Visual Studio add-ons.
167 | ##
168 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
169 |
170 | # User-specific files
171 | *.rsuser
172 | *.suo
173 | *.user
174 | *.userosscache
175 | *.sln.docstates
176 |
177 | # User-specific files (MonoDevelop/Xamarin Studio)
178 | *.userprefs
179 |
180 | # Mono auto generated files
181 | mono_crash.*
182 |
183 | # Build results
184 | [Dd]ebug/
185 | [Dd]ebugPublic/
186 | [Rr]elease/
187 | [Rr]eleases/
188 | x64/
189 | x86/
190 | [Aa][Rr][Mm]/
191 | [Aa][Rr][Mm]64/
192 | bld/
193 | [Bb]in/
194 | [Oo]bj/
195 | [Ll]og/
196 |
197 | # Visual Studio 2015/2017 cache/options directory
198 | .vs/
199 | # Uncomment if you have tasks that create the project's static files in wwwroot
200 | #wwwroot/
201 |
202 | # Visual Studio 2017 auto generated files
203 | Generated\ Files/
204 |
205 | # MSTest test Results
206 | [Tt]est[Rr]esult*/
207 | [Bb]uild[Ll]og.*
208 |
209 | # NUnit
210 | *.VisualState.xml
211 | TestResult.xml
212 | nunit-*.xml
213 |
214 | # Build Results of an ATL Project
215 | [Dd]ebugPS/
216 | [Rr]eleasePS/
217 | dlldata.c
218 |
219 | # Benchmark Results
220 | BenchmarkDotNet.Artifacts/
221 |
222 | # .NET Core
223 | project.lock.json
224 | project.fragment.lock.json
225 | artifacts/
226 |
227 | # StyleCop
228 | StyleCopReport.xml
229 |
230 | # Files built by Visual Studio
231 | *_i.c
232 | *_p.c
233 | *_h.h
234 | *.ilk
235 | *.meta
236 | *.obj
237 | *.iobj
238 | *.pch
239 | *.pdb
240 | *.ipdb
241 | *.pgc
242 | *.pgd
243 | *.rsp
244 | *.sbr
245 | *.tlb
246 | *.tli
247 | *.tlh
248 | *.tmp
249 | *.tmp_proj
250 | *_wpftmp.csproj
251 | *.log
252 | *.vspscc
253 | *.vssscc
254 | .builds
255 | *.pidb
256 | *.svclog
257 | *.scc
258 |
259 | # Chutzpah Test files
260 | _Chutzpah*
261 |
262 | # Visual C++ cache files
263 | ipch/
264 | *.aps
265 | *.ncb
266 | *.opendb
267 | *.opensdf
268 | *.sdf
269 | *.cachefile
270 | *.VC.db
271 | *.VC.VC.opendb
272 |
273 | # Visual Studio profiler
274 | *.psess
275 | *.vsp
276 | *.vspx
277 | *.sap
278 |
279 | # Visual Studio Trace Files
280 | *.e2e
281 |
282 | # TFS 2012 Local Workspace
283 | $tf/
284 |
285 | # Guidance Automation Toolkit
286 | *.gpState
287 |
288 | # ReSharper is a .NET coding add-in
289 | _ReSharper*/
290 | *.[Rr]e[Ss]harper
291 | *.DotSettings.user
292 |
293 | # JustCode is a .NET coding add-in
294 | .JustCode
295 |
296 | # TeamCity is a build add-in
297 | _TeamCity*
298 |
299 | # DotCover is a Code Coverage Tool
300 | *.dotCover
301 |
302 | # AxoCover is a Code Coverage Tool
303 | .axoCover/*
304 | !.axoCover/settings.json
305 |
306 | # Visual Studio code coverage results
307 | *.coverage
308 | *.coveragexml
309 |
310 | # NCrunch
311 | _NCrunch_*
312 | .*crunch*.local.xml
313 | nCrunchTemp_*
314 |
315 | # MightyMoose
316 | *.mm.*
317 | AutoTest.Net/
318 |
319 | # Web workbench (sass)
320 | .sass-cache/
321 |
322 | # Installshield output folder
323 | [Ee]xpress/
324 |
325 | # DocProject is a documentation generator add-in
326 | DocProject/buildhelp/
327 | DocProject/Help/*.HxT
328 | DocProject/Help/*.HxC
329 | DocProject/Help/*.hhc
330 | DocProject/Help/*.hhk
331 | DocProject/Help/*.hhp
332 | DocProject/Help/Html2
333 | DocProject/Help/html
334 |
335 | # Click-Once directory
336 | publish/
337 |
338 | # Publish Web Output
339 | *.[Pp]ublish.xml
340 | *.azurePubxml
341 | # Note: Comment the next line if you want to checkin your web deploy settings,
342 | # but database connection strings (with potential passwords) will be unencrypted
343 | *.pubxml
344 | *.publishproj
345 |
346 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
347 | # checkin your Azure Web App publish settings, but sensitive information contained
348 | # in these scripts will be unencrypted
349 | PublishScripts/
350 |
351 | # NuGet Packages
352 | *.nupkg
353 | # NuGet Symbol Packages
354 | *.snupkg
355 | # The packages folder can be ignored because of Package Restore
356 | **/[Pp]ackages/*
357 | # except build/, which is used as an MSBuild target.
358 | !**/[Pp]ackages/build/
359 | # Uncomment if necessary however generally it will be regenerated when needed
360 | #!**/[Pp]ackages/repositories.config
361 | # NuGet v3's project.json files produces more ignorable files
362 | *.nuget.props
363 | *.nuget.targets
364 |
365 | # Microsoft Azure Build Output
366 | csx/
367 | *.build.csdef
368 |
369 | # Microsoft Azure Emulator
370 | ecf/
371 | rcf/
372 |
373 | # Windows Store app package directories and files
374 | AppPackages/
375 | BundleArtifacts/
376 | Package.StoreAssociation.xml
377 | _pkginfo.txt
378 | *.appx
379 | *.appxbundle
380 | *.appxupload
381 |
382 | # Visual Studio cache files
383 | # files ending in .cache can be ignored
384 | *.[Cc]ache
385 | # but keep track of directories ending in .cache
386 | !?*.[Cc]ache/
387 |
388 | # Others
389 | ClientBin/
390 | ~$*
391 | *~
392 | *.dbmdl
393 | *.dbproj.schemaview
394 | *.jfm
395 | *.pfx
396 | *.publishsettings
397 | orleans.codegen.cs
398 |
399 | # Including strong name files can present a security risk
400 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
401 | #*.snk
402 |
403 | # Since there are multiple workflows, uncomment next line to ignore bower_components
404 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
405 | #bower_components/
406 |
407 | # RIA/Silverlight projects
408 | Generated_Code/
409 |
410 | # Backup & report files from converting an old project file
411 | # to a newer Visual Studio version. Backup files are not needed,
412 | # because we have git ;-)
413 | _UpgradeReport_Files/
414 | Backup*/
415 | UpgradeLog*.XML
416 | UpgradeLog*.htm
417 | ServiceFabricBackup/
418 | *.rptproj.bak
419 |
420 | # SQL Server files
421 | *.mdf
422 | *.ldf
423 | *.ndf
424 |
425 | # Business Intelligence projects
426 | *.rdl.data
427 | *.bim.layout
428 | *.bim_*.settings
429 | *.rptproj.rsuser
430 | *- [Bb]ackup.rdl
431 | *- [Bb]ackup ([0-9]).rdl
432 | *- [Bb]ackup ([0-9][0-9]).rdl
433 |
434 | # Microsoft Fakes
435 | FakesAssemblies/
436 |
437 | # GhostDoc plugin setting file
438 | *.GhostDoc.xml
439 |
440 | # Node.js Tools for Visual Studio
441 | .ntvs_analysis.dat
442 | node_modules/
443 |
444 | # Visual Studio 6 build log
445 | *.plg
446 |
447 | # Visual Studio 6 workspace options file
448 | *.opt
449 |
450 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
451 | *.vbw
452 |
453 | # Visual Studio LightSwitch build output
454 | **/*.HTMLClient/GeneratedArtifacts
455 | **/*.DesktopClient/GeneratedArtifacts
456 | **/*.DesktopClient/ModelManifest.xml
457 | **/*.Server/GeneratedArtifacts
458 | **/*.Server/ModelManifest.xml
459 | _Pvt_Extensions
460 |
461 | # Paket dependency manager
462 | .paket/paket.exe
463 | paket-files/
464 |
465 | # FAKE - F# Make
466 | .fake/
467 |
468 | # CodeRush personal settings
469 | .cr/personal
470 |
471 | # Python Tools for Visual Studio (PTVS)
472 | __pycache__/
473 | *.pyc
474 |
475 | # Cake - Uncomment if you are using it
476 | # tools/**
477 | # !tools/packages.config
478 |
479 | # Tabs Studio
480 | *.tss
481 |
482 | # Telerik's JustMock configuration file
483 | *.jmconfig
484 |
485 | # BizTalk build output
486 | *.btp.cs
487 | *.btm.cs
488 | *.odx.cs
489 | *.xsd.cs
490 |
491 | # OpenCover UI analysis results
492 | OpenCover/
493 |
494 | # Azure Stream Analytics local run output
495 | ASALocalRun/
496 |
497 | # MSBuild Binary and Structured Log
498 | *.binlog
499 |
500 | # NVidia Nsight GPU debugger configuration file
501 | *.nvuser
502 |
503 | # MFractors (Xamarin productivity tool) working folder
504 | .mfractor/
505 |
506 | # Local History for Visual Studio
507 | .localhistory/
508 |
509 | # BeatPulse healthcheck temp database
510 | healthchecksdb
511 |
512 | # Backup folder for Package Reference Convert tool in Visual Studio 2017
513 | MigrationBackup/
514 |
515 | ### VisualStudioCode template
516 | .vscode/*
517 | !.vscode/settings.json
518 | !.vscode/tasks.json
519 | !.vscode/launch.json
520 | !.vscode/extensions.json
521 |
522 | ### VirtualEnv template
523 | # Virtualenv
524 | # http://iamzed.com/2009/05/07/a-primer-on-virtualenv/
525 | .Python
526 | [Bb]in
527 | [Ii]nclude
528 | [Ll]ib
529 | [Ll]ib64
530 | [Ll]ocal
531 | [Ss]cripts
532 | pyvenv.cfg
533 | .venv
534 | pip-selfcheck.json
535 |
536 | ### JetBrains template
537 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
538 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
539 |
540 | # User-specific stuff
541 | .idea/**/workspace.xml
542 | .idea/**/tasks.xml
543 | .idea/**/usage.statistics.xml
544 | .idea/**/dictionaries
545 | .idea/**/shelf
546 |
547 | # Generated files
548 | .idea/**/contentModel.xml
549 |
550 | # Sensitive or high-churn files
551 | .idea/**/dataSources/
552 | .idea/**/dataSources.ids
553 | .idea/**/dataSources.local.xml
554 | .idea/**/sqlDataSources.xml
555 | .idea/**/dynamic.xml
556 | .idea/**/uiDesigner.xml
557 | .idea/**/dbnavigator.xml
558 |
559 | # Gradle
560 | .idea/**/gradle.xml
561 | .idea/**/libraries
562 |
563 | # Gradle and Maven with auto-import
564 | # When using Gradle or Maven with auto-import, you should exclude module files,
565 | # since they will be recreated, and may cause churn. Uncomment if using
566 | # auto-import.
567 | # .idea/modules.xml
568 | # .idea/*.iml
569 | # .idea/modules
570 | # *.iml
571 | # *.ipr
572 |
573 | # CMake
574 | cmake-build-*/
575 |
576 | # Mongo Explorer plugin
577 | .idea/**/mongoSettings.xml
578 |
579 | # File-based project format
580 | *.iws
581 |
582 | # IntelliJ
583 | out/
584 |
585 | # mpeltonen/sbt-idea plugin
586 | .idea_modules/
587 |
588 | # JIRA plugin
589 | atlassian-ide-plugin.xml
590 |
591 | # Cursive Clojure plugin
592 | .idea/replstate.xml
593 |
594 | # Crashlytics plugin (for Android Studio and IntelliJ)
595 | com_crashlytics_export_strings.xml
596 | crashlytics.properties
597 | crashlytics-build.properties
598 | fabric.properties
599 |
600 | # Editor-based Rest Client
601 | .idea/httpRequests
602 |
603 | # Android studio 3.1+ serialized cache file
604 | .idea/caches/build_file_checksums.ser
605 | .idea
606 |
607 | __pycache__
608 | *.py[c,o]
609 | .ipynb_checkpoints
610 |
611 | /1-basic-envir/env
612 | /1-basic-envir/httpie
613 | /2-xarray-example/tutorial-data
614 | /4-optimization-example/parametertrace_algorithms.png
615 | /4-optimization-example/RosenSCEUA.csv
616 | /4-optimization-example/SCEUA_hymod.csv
617 | /5-basic-parallel/parallel-tutorial-master/data
618 | /5-dask-example/data
619 | /5-dask-example/dask-worker-space/
620 | /5-dask-example/profile.html
621 | /5-dask-example/log
622 | /5-dask-example/_build/
623 | /6-download-data/dataset/
624 |
--------------------------------------------------------------------------------
/1-basic-envir/1-get-started.md:
--------------------------------------------------------------------------------
1 | # 开始前的准备
2 |
3 | 在开始python之前先了解一些常见工具的配置和基本使用方法,包括:
4 |
5 | - [git and github](#git-和-github)
6 | - [jupyter lab](#jupyter-lab)
7 |
8 | 这些内容参考了:[Setup Your Earth Analytics Python, Git, Bash Environment On Your Computer](https://www.earthdatascience.org/workshops/setup-earth-analytics-python/)。这里简单记录了一些基本概念和常用操作,更详细的介绍可以参考[这里](https://github.com/waterDLut/WaterResources/blob/master/tools/writing-tool.md)。
9 |
10 | ## git 和 github
11 |
12 | Git 是版本控制的工具,简单地说,通过它能完成对不同开发者不同时间写的代码文件(即不同版本)的高效控制与管理,类似于我们日常管理不同时间更新的word不同版本文件,只不过我们一般都是复制粘贴一个新文件,然后命名后面加上日期,以此区分,而git可以自动地帮助记录下不同版本,并随意获取查看不同版本的文件内容,当然git还有很多更强大的功能,使用中可逐渐体会。
13 |
14 | Ubuntu或者win10下的Ubuntu里已经安装了git,不必再装了;win10下需要自行下载并安装:官网下载,安装一路默认即可。
15 |
16 | Github 是代码共享的网站,每个人可以将自己本地电脑由git控制的代码库(repository,以下简称repo)上传到github上与他人分享,并协作开发。也就是说,github就类似于一个云端的代码库,本地的代码和它上面的代码可以保持同步的关系。使用github前,每个人需要注册一个自己的账号:直接百度搜索github,进入github官网,找到“sign up”标识,进行注册即可,注册后登陆就能进入自己的帐户。github服务器不在国内,所以防火墙对它稍微有一些影响,直接访问常看不到图片,有时候下载repo也不是特别方便,甚至无法访问,所以还是推荐科学上网,可以参考[这里](https://github.com/OuyangWenyu/elks/blob/master/common-sense/else/vpn.md)选择一些工具。
17 |
18 | git和github之间关系:我们写代码或者文档更多地肯定还是在自己本地的电脑上操作,所以我们本地的repo版本需要本地的git软件来管理;github是一个云端代码库,我们可以利用本地的git工具将我们的本地repo上传到github上,这样别人就可以看到我们的repo(各个版本都能看到);当然我们也能在github上下载别人的代码来使用,还可以修改别人的代码来实现协作。
19 |
20 | 关于github的使用,推荐去这里看看:https://www.zhihu.com/question/20070065/answer/79557687
21 |
22 | 本地git的使用依靠git bash命令。关于bash是什么,可以参考:[How to Access and Use Shell to Set Up a Working Directory](https://www.earthdatascience.org/workshops/setup-earth-analytics-python/introduction-to-bash-shell/),里面讲的还是很清楚的。git bash 里面敲命令和Ubuntu系统下的指令一样的,比如cd,mkdir等常见命令。更多相关具体操作可以参考:https://www.runoob.com/git/git-basic-operations.html
23 |
24 | 其他参考资料:[Introduction to Git and GitHub for Python Developers](https://realpython.com/python-git-github-intro/)
25 |
26 | 最后记录一些常用操作备查,根据实际使用情况慢慢补充:
27 |
28 | ### 配置用户信息
29 |
30 | 第一次使用git,通常需要配置用户名和邮箱信息:
31 |
32 | ```Shell
33 | git config --global user.name “Your Name”
34 | git config --global user.email Youremail@example.com
35 | ```
36 |
37 | ### clone项目
38 |
39 | 进入到自己想要下载的repo页面后,点击绿色的“Code”,然后把地址copy下来,接着使用 “git clone <刚刚copy的地址>”命令,就能把代码下载到本地了;
40 |
41 | 第一个使用的git和github命令一定就是 git clone 了,以本项目为例,打开terminal,进入你想放置本项目的文件夹,执行:
42 |
43 | ```Shell
44 | git clone https://github.com/OuyangWenyu/hydrus.git
45 | ```
46 |
47 | ### 通过SSH链接Github
48 |
49 | 上面是通过https来连接,这里补充下ssh方式,这种方式第一次配置相对麻烦一点,但是后续使用更加方便。
50 |
51 | 首先,使用如下命令创建密钥文件
52 |
53 | ```Shell
54 | ssh-keygen -t rsa -C 你的github账号邮箱
55 | ```
56 |
57 | 输入后会提示保存key的文件以及passphrase,选择直接回车(一共三次),保存到默认位置,默认设置即可。
58 |
59 | 然后命令行上会显示处出密钥保存路径,其中私钥文件是 id_rsa,公钥文件是 id_rsa.pub
60 |
61 | 然后需要将SSH公钥添加到自己的GitHub账户。
62 |
63 | - 复制id_rsa.pub文件中的全部内容
64 | - 登陆到GitHub上,右上角小头像->Setting->SSH and GPG keys中,点击new SSH key,将复制的所有内容添加到其中;名称可以随便起
65 |
66 | 接下来测试链接:
67 |
68 | ```Shell
69 | ssh -T git@github.com
70 | ```
71 |
72 | 将会看到如下提示:
73 |
74 | The authenticity of host 'github.com (xxx.xxx.xxx.xxx)' can't be established.
75 | RSA key fingerprint is xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
76 | Are you sure you want to continue connecting (yes/no)?
77 |
78 | 输入yes,然后回车即可,这时候结果为 “ …You’ve successfully authenticated, but GitHub does not provide shell access”,则说明成功。
79 |
80 | ssh下下载的方式和https下一样,在github中clone时选择SSH协议即可,比如下载本repo:
81 |
82 | ```Shell
83 | git clone git@github.com:OuyangWenyu/hydrus.git
84 | ```
85 |
86 | ### 变化远程仓库地址
87 |
88 | 有时候 https连接不稳定, 想要切换 ssh, 参考[这里](https://docs.github.com/cn/github/getting-started-with-github/managing-remote-repositories#switching-remote-urls-from-https-to-ssh), 可以这么做:
89 |
90 | ```Shell
91 | git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
92 | ```
93 |
94 | 使用下面语句可以查看远程仓库是否已变:
95 |
96 | ```Shell
97 | git remote -v
98 | ```
99 |
100 | ### add/commit/push
101 |
102 | 本地git常用的命令就是add/commit/push 三连了
103 |
104 | ``` Shell
105 | # 修改文件后执行
106 | git add -A
107 | git commit -m "本次提交想要说明的东西"
108 | git push
109 | ```
110 |
111 | ### 创建分支并推送到远程分支
112 |
113 | 参考了[git创建分支并推送到远程分支](https://blog.csdn.net/ljj_9/article/details/79386306)。
114 |
115 | 首先在master分支上,保证工作目标是干净的,也没有需要commit的:
116 |
117 | ``` Shell
118 | git branch
119 | git status
120 | ```
121 |
122 | 然后新建一个本地分支:
123 |
124 | ```Shell
125 | git checkout -b <你的分支名称>
126 | ```
127 |
128 | 比如常见的新建一个“开发”分支:
129 |
130 | ```Shell
131 | git checkout -b dev
132 | ```
133 |
134 | 然后把新建的本地分支push到远程服务器,远程分支与本地分支同名(当然可以随意起名):
135 |
136 | ```Shell
137 | git push origin <你的分支名称>:<你的分支名称>
138 | ```
139 |
140 | 使用git branch -a查看所有分支,会看到remotes/origin/<你的分支名称> 这个远程分支,说明新建远程分支成功。
141 |
142 | 切换分支使用如下命令即可:
143 |
144 | ```Shell
145 | git checkout <你的分支名称>
146 | ```
147 |
148 | ### 拉取远程分支
149 |
150 | 参考:https://blog.csdn.net/tterminator/article/details/52225720
151 |
152 | ```Shell
153 | # 查看所有远程分支
154 | git branch -r
155 | ```
156 |
157 | 第一种方式:
158 |
159 | ```Shell
160 | git checkout -b 本地分支名x origin/远程分支名x
161 | ```
162 |
163 | 使用该方式会在本地新建分支x,并自动切换到该本地分支x。
164 |
165 | 采用此种方法建立的本地分支会和远程分支建立映射关系。
166 |
167 | 方式二:
168 |
169 | ```Shell
170 | git fetch origin 远程分支名x:本地分支名x
171 | ```
172 |
173 | 使用该方式会在本地新建分支x,但是不会自动切换到该本地分支x,需要手动checkout。
174 |
175 | 采用此种方法建立的本地分支不会和远程分支建立映射关系。
176 |
177 | ### 标签tag
178 |
179 | 使用如下命令可以查看已有标签:
180 |
181 | ```Shell
182 | git tag
183 | ```
184 |
185 | 想要给当前已提交的版本打标签可以使用如下方式:
186 |
187 | ```Shell
188 | git tag -a v1.4 -m "my version 1.4"
189 | ```
190 |
191 | 将刚刚创建的tag提交到github:
192 |
193 | ```Shell
194 | git push origin v1.4
195 | ```
196 |
197 | 这样就会在github上看到tag小栏里出现新的tag了。
198 |
199 | 如果标签打错了,想要删除,执行下面语句即可:
200 |
201 | ```Shell
202 | git tag -d v1.4
203 | ```
204 |
205 | 想要把远程github上的对应标签也删除,执行下面语句:
206 |
207 | ```Shell
208 | git push origin :refs/tags/v1.4
209 | ```
210 |
211 | ### fork后同步源的新更新内容
212 |
213 | fork了别人的repo,一段时间后,别人更新了,想要同步过来最新的内容,应该怎么做?
214 |
215 | 参考:
216 |
217 | - [gitlab或github下fork后如何同步源的新更新内容?](https://www.zhihu.com/question/28676261)
218 | - [Configuring a remote for a fork](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/configuring-a-remote-for-a-fork)
219 | - [Syncing a fork](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/syncing-a-fork)
220 |
221 | 首先,给fork配置远程库
222 |
223 | 查看远程状态:
224 |
225 | ```Shell
226 | git remote -v
227 | ```
228 |
229 | 确定一个将被同步给 fork 远程的上游仓库:
230 |
231 | ```Shell
232 | git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git
233 | ```
234 |
235 | 然后再次查看远程状态,已经可以看到upstream的信息了。
236 |
237 | 从上游仓库 fetch 分支:
238 |
239 | ```Shell
240 | git fetch upstream
241 | ```
242 |
243 | 转换到main分支
244 |
245 | ```Shell
246 | git checkout main
247 | ```
248 |
249 | 合并远程分支:
250 |
251 | ```Shell
252 | git merge upstream/main
253 | # 或者
254 | git rebase upstream/main
255 | ```
256 |
257 | 如果本地没有更改,那git就直接自动执行一个fast-forward,如果有更改,就手动调整一下有冲突的地方,然后commit即可。
258 |
259 | 最后push到自己的origin上即可。
260 |
261 | ```Shell
262 | git push
263 | ```
264 |
265 | ### 查看历史版本
266 |
267 | 使用命令:
268 |
269 | ```Shell
270 | git log
271 | ```
272 |
273 | 可以查看历史提交记录。
274 |
275 | 使用
276 |
277 | ```Shell
278 | git checkout xxx(某个历史版本的哈希值,即git log下显示的每次commit对应的一串数字字母)
279 | ```
280 |
281 | 即可回到xxx的那个版本。
282 |
283 | ### 其他
284 |
285 | 最后补充一些实例资料,以供参考。
286 |
287 | - 删除不小心提交了的包含大文件的历史commit:[How to remove/delete a large file from commit history in Git repository?](https://stackoverflow.com/questions/2100907/how-to-remove-delete-a-large-file-from-commit-history-in-git-repository)
288 |
289 | ## jupyter lab
290 |
291 | 本节内容主要参考以下资料。
292 |
293 | - [Why Jupyter is data scientists’ computational notebook of choice](https://www.nature.com/articles/d41586-018-07196-1)
294 | - [利器|JupyterLab 数据分析必备IDE完全指南](https://zhuanlan.zhihu.com/p/67959768)
295 | - [Reactive, reproducible, collaborative: computational notebooks evolve](https://www.nature.com/articles/d41586-021-01174-w)
296 |
297 | ### 概述
298 |
299 | Jupyter Notebook 是一种用于科学计算的电子笔记本,可以在它其中嵌入代码,数据和文本来记笔记。该笔记本能够提供交互式计算形式,在这种环境中,我们可以执行代码并立刻看到发生了什么,进而能够有效地对代码和文本进行修改,从而在主题,理论,数据和结果之间建立更紧密的联系。可以说jupyter notebook是用于科学和工程计算笔记的杀手级应用程序。
300 |
301 | 可以认为 JupyterLab 是 Jupyter notebook的新一代版本。相对于 Jupyter Notebook,它的集成性更强,更灵活并且更易扩展。它支持100种多种语言,支持多种文档相互集成。使用 JupyterLab,可以进行数据分析相关的工作,可以进行交互式编程,可以学习社区中丰富的 Notebook 资料(在 GitHub上有超过170万个公共 Jupyter Notebook -- [A gallery of interesting Jupyter Notebooks](https://github.com/jupyter/jupyter/wiki/A-gallery-of-interesting-Jupyter-Notebooks))。所以这里就直接使用JupyterLab了。
302 |
303 | 如果已经根据本项目下README文件配置过python环境,那么jupyter lab就已经安装好了。
304 |
305 | 下面简单了解其基本使用方法。
306 |
307 | ### 打开jupyterlab
308 |
309 | 进入jupyter lab的方式很简单,进入项目所在文件夹,打开cmd,激活安装jupyter lab的python环境,然后启动即可:
310 |
311 | ```Shell
312 | # 激活conda环境
313 | conda activate hydrus
314 | # 启动jupyter lab
315 | jupyter lab
316 | ```
317 |
318 | 启动后,浏览器会自动打开jupyterlab界面,应该可以看到类似下面的界面:
319 |
320 | 
321 |
322 | ### 基本介绍
323 |
324 | 界面上边是工具栏,和word之类的工具有些相似;左边栏是总览工具,包括文件浏览器、正在运行的 kernel 列表等;右边是主面板,也是笔记的主体部分,除了可以构建jupyter笔记外,还可以创建并编辑[markdown](https://github.com/younghz/Markdown)文件等,还能打开命令行工具。
325 |
326 | jupyter 笔记文件中可以创建使用以下几种cell类型:
327 |
328 | - Code——写代码和运行代码的地方。
329 | - Markdown——写文本的地方。可以在运行一段代码后添加结论、注释等。
330 | - Raw——这是一个可将笔记本转换成另一种格式(比如 HTML)的命令行工具。
331 |
332 | 平常主要使用Code 和 Markdown
333 |
334 | ### 一些使用小技巧
335 |
336 | 这里日常积累一些jupyter lab使用技巧
337 |
338 | #### 快捷键
339 |
340 | 运行 cell 的快捷键 shift + command,大概会是用到最多次的一个快捷键。
341 |
342 | 选择 cell 之后,点击空白处,按下m键,代表转为markdown cell,y键代表转为code cell,同理r键代表转为row cell。
343 |
344 | 
345 |
346 | 快捷键清单可以参考下图:
347 |
348 | 
349 |
350 | #### 自动补全
351 |
352 | 与大多数本地集成开发环境(IDE)相同,输入部分代码之后按 tab 键,即可自动补全。Jupyter Lab 中的自动补全功能可以通过不同的颜色和图标,显示出补全的类型。
353 |
354 | 
355 |
356 | #### Magic Code
357 |
358 | 一些特殊命令(不是内置于 Python 本身)被称为“魔术”命令。魔术命令是以百分号%为前缀的任何命令。
359 |
360 | ##### %matplotlib
361 |
362 | 最常用的魔法命令,大概就是 %matplotlib了。它用于指定 matplotlib 后端(backend)。通常使用:
363 |
364 | ```IPython
365 | %matplotlib inline
366 | ```
367 |
368 | 代表使用 inline作为后端,直接在 Notebook 中内嵌图片,并且可以省略掉 plt.show() 这一步骤(后面第三章节介绍可视化时会详细介绍)。
369 |
370 | ##### %timeit
371 |
372 | %timeit 函数检查任何 Python 语句的执行时间,例如:
373 |
374 | 
375 |
376 | ##### %run
377 |
378 | 使用 %run 命令,可以在Notebook中运行任意的Python文件。例如:
379 |
380 | ```IPython
381 | %run add.py
382 | ```
383 |
384 | 还有其他一些常用命令,例如 %debug、%load_ext 和 %pwd,完整命令可以参考[这里](https://ipython.readthedocs.io/en/stable/interactive/magics.html)。
385 |
386 | ### 不只能用来记录Python代码
387 |
388 | 还可以在Jupyter Notebooks中使用R、Julia和Javascript等其他语言。比如:[Interactive Workflows for C++ with Jupyter](https://blog.jupyter.org/interactive-workflows-for-c-with-jupyter-fe9b54227d92)。如果不感兴趣,下面内容可忽略,environments.yml文件中也不涉及下面的包,如果需要需自行安装。
389 |
390 | - 要在 Jupyter 中启用 R,需要 IRKernel,官方安装方式请参考:https://github.com/IRkernel/IRkernel 。R语言最常见的编辑器是RStudio,也可以使用 VSCode等。
391 | - Julia,如果你是一位 Julia 用户,你也能在 Jupyter Notebooks 中使用 Julia!你可以查看这篇为 Julia 用户学习数据科学而编写的全面介绍文章,其中有一个章节就是关于如何在 Jupyter 环境中使用 Julia:https://www.analyticsvidhya.com/blog/2017/10/comprehensive-tutorial-learn-data-science-julia-from-scratch/ ;jupyterlab的julia插件安装方式可以参考[How to Add Julia to Jupyter Notebook](https://datatofish.com/add-julia-to-jupyter/),Julia本身也有类似jupyter的Pluto工具可用;
392 | - JavaScript, IJavascript kernel。这个 GitHub 库包含了在不同操作系统上安装这个 kernel 的各个步骤:https://github.com/n-riesco/ijavascript。注意,在使用它之前,你必需要先安装好 Node.js 和 npm。
393 |
394 | 接下来进入下一节:[1-basic-envir/2-python-envir.md](https://github.com/OuyangWenyu/hydrus/blob/master/1-basic-envir/2-python-envir.md)
395 |
--------------------------------------------------------------------------------
/1-basic-envir/2-python-envir.md:
--------------------------------------------------------------------------------
1 | # python环境配置
2 |
3 | 本文的内容框架主要参考了[Setting Up a Python Development Environment with and without Docker](https://nickjanetakis.com/blog/setting-up-a-python-development-environment-with-and-without-docker),下面每小节又各有参考(详见下文)。
4 |
5 | 程序开始前一个很重要的环节就是 setting up your computer 。总的来说,包括以下几个部分:
6 |
7 | 1. What code editor should I use? 用什么编辑器
8 | 2. How do I install Python? 如何安装Python
9 | 3. How do I install my app’s dependencies? 如何安装程序依赖包 (如果不用docker基本上到这小节的前半部分就够了)
10 | 4. How do I install required external services? 如何安装必须的外部服务
11 | 5. How do I run my application? 如何运行自己的程序
12 |
13 | ## What Code Editor Should I Use?
14 |
15 | python中比较常用的IDE有pycharm和vscode,都可以。本repo下的内容是笔记类型的,所以直接使用的jupyter lab,不过如果需要构建完整的项目,还是推荐使用pycharm 或 vscode,下面就简单记录下这两种工具的基本安装使用方法。
16 |
17 | ### Pycharm
18 |
19 | 首先还是推荐pycharm,因为更容易上手一些,windows下安装直接下载安装包(下载免费的 Community版 就够了):https://www.jetbrains.com/pycharm/download/#section=windows ,点击安装即可。
20 |
21 | Ubuntu下可以使用这个链接: https://www.jetbrains.com/pycharm/download/#section=linux 下载安装包。
22 |
23 | 然后解压文件:
24 |
25 | ```Shell
26 | # 注意后面日期自行对应下载的版本
27 | tar -xzf pycharm-community-20xx.x.x.tar.gz
28 | ```
29 |
30 | 使用tar -xzf pycharm-community-20xx.x.x.tar.gz -C <指定文件夹> 可以解压到指定文件夹下,当然也可以解压后再移动到指定文件夹下,比如:
31 |
32 | ```Shell
33 | mv pycharm-community-20xx.x.x ../programs/pycharm-community-20xx.x.x
34 | ```
35 |
36 | 然后可以进入文件夹打开软件:
37 |
38 | ```Shell
39 | cd ../programs/pycharm-community-20xx.x.x/bin
40 | sh pycharm.sh
41 | ```
42 |
43 | 这时候稍等一会儿,会弹出pycharm的界面,提示配置pycharm。可以一直默认。
44 |
45 | 如果想让pycharm后台运行,那么可以执行下列代码:
46 |
47 | ```Shell
48 | sh pycharm.sh &
49 | ```
50 |
51 | 然后在命令行敲回车,就可以打开新的对话了。
52 |
53 | 如果不想要.Pycharmxxx 系统配置文件在默认文件夹下,那么可以参考:[PyCharm 占用过大 C 盘空间,system 配置文件迁移](https://www.cnblogs.com/jingsupo/p/11616205.html) 配置。
54 |
55 | 首先,先将你的.PyCharm2018.3文件复制到你想放的文件夹下。
56 |
57 | 然后利用PyCharm 里的 Help/Edit Custom Properties 的选项新建 idea.properties 文件
58 |
59 | 之后在创建的文件夹下进行如下修改,当然除了 system 之外,还可以配置其他路径将其他内容也进行迁移。
60 |
61 | ``` config
62 | # custom PyCharm properties
63 |
64 | idea.config.path=${user.home}/.PyCharm20xx.x/config
65 | idea.system.path=${user.home}/.PyCharm20xx.x/system
66 | # idea.plugins.path=${idea.config.path}/plugins
67 | # idea.log.path=${idea.system.path}/log
68 | ```
69 |
70 | 比如我的是:idea.config.path=/mnt/sdc/wvo5024/.PyCharm20xx.x/config
71 |
72 | 然后将原文件夹下的system文件夹删除即可,注意不要删除config文件夹,因为这个idea.properties 文件就在这个文件夹下。
73 |
74 | ### VSCode
75 |
76 | vscode也是一个很常用的编程工具,特别是有些代码只能在linux上运行,但是我们手边又只有windows系统的电脑时,推荐使用 windows下的linux运行程序,这时候编辑代码就推荐vscode工具了。下面介绍也主要基于这点。不过其使用稍微麻烦一点,所以建议先把后续的python环境配置、python基础等搞明白了,在必要的时候再用它,**优先还是选择pycharm**。
77 |
78 | 首先我们要有windows下的linux系统,具体安装以及其下python的安装可以参考[这里](https://github.com/OuyangWenyu/elks)的REAMDE.md文件中的记录。
79 |
80 | 接下来安装vscode,可以直接先在windows下安装,去官网下载并安装 vscode,安装一路默认即可。
81 |
82 | 然后因为配置了win10下的ubuntu,所以vscode会自动提醒是否安装 Remote-WSL 插件,安装即可,这样就能运行 win10下ubuntu文件系统里的代码了。
83 |
84 | 想进入 win10下的Ubuntu,点击左边栏的远程连接即可:
85 |
86 | 
87 |
88 | 这时候可以看到打开一个新界面,左下角显示连接到Ubuntu了。尝试打开终端,可以看到默认的终端是bash了(没有连到WSL时候,默认终端是powershell)。
89 |
90 | 这样下次你再打开,就会自动连接到ubuntu。
91 |
92 | 接下来安装ubuntu条件下的vscode插件,按下快捷键Ctrl+Shift+X,进入插件管理页面。在搜索栏输入python。选择插件,点击安装(注意是ubuntu下的,如下图所示)。
93 |
94 | 
95 |
96 | 然后你可以尝试打开一个文件夹,或者创建一个文件夹作为项目工作区域。
97 |
98 | 接着就配置这个工作区域
99 |
100 | 
101 |
102 | 打开后现在看到的应该是如下界面
103 |
104 | 
105 |
106 | 现在vscode提供了同步设置的功能,可以直接使用自己的github账号同步自己的本地设置到云端。
107 |
108 | 同时可以看到,有三类不同的设置对象:用户、远程和工作区
109 |
110 | 
111 |
112 | 既然开启了用户同步,这里尝试为用户统一设置。
113 |
114 | 配置代码检查工具flake8和格式化文本的工具black。
115 |
116 | 设置界面如下:
117 |
118 | 
119 |
120 | 
121 |
122 | 如果你还没有安装flake8和black,后面编辑代码的时候会提示你安装flake8和black到环境中,同意安装即可。
123 |
124 | 接着可以尝试配置下python 运行和调试工具。
125 |
126 | 
127 |
128 | 然后选择python文件项:
129 |
130 | 
131 |
132 | 还有一项重要配置是在vscode中配置python环境(可以参考[这里](https://code.visualstudio.com/docs/python/environments))。
133 |
134 | 安装虚拟环境后面会介绍,假设我们安装完毕了,那么接下来vscode的Python 扩展会寻找并使用它在系统路径中发现的第一个 Python 解释器。
135 |
136 | 要手动选择一个特定的环境的话,按 Ctrl+Shift+P,然后搜索“Python: Select Interpreter ”,选择自己安装的虚拟环境即可。
137 |
138 | 值得一提的是,如果想让自己的代码能找到自己写的module(后续介绍python的时候会更详细介绍),则需要设置PYTHONPATH变量。通常如果你把源代码放在src文件夹中,把测试放在test文件夹中。然而,当运行测试时,这些测试通常不能访问 src 中的模块,除非你硬编码相对路径。
139 |
140 | 为了解决这个问题,你可以在VS Code当前工作区(项目根目录)创建一个.env文件如下
141 |
142 | ```.env
143 | PYTHONPATH=src
144 | ```
145 |
146 | 然后在settings.json中将src的路径添加到PYTHONPATH:
147 |
148 | ```settings.json
149 | {
150 | "python.envFile": "${workspaceFolder}/.env"
151 | }
152 | ```
153 |
154 | 保存重启编辑器(必须要重启后才会生效)即可。
155 |
156 | 注意代码中导入包的时候,语句里就不要再带src了,直接import src下面的module即可,比如文件夹结构是下面这样:
157 |
158 | ```txt
159 | -- src
160 | |-- core
161 | |-- rectangle.py
162 | |-- utils
163 | |-- ...
164 | -- test
165 | |-- test.py
166 | |-- _init_path.py
167 | ```
168 |
169 | 那么导入的时候就不要 import src.core了,而是直接import core,否则是会报错的,因为envfile配置的是路径,不是模块(请参考[这里](https://cloud.tencent.com/developer/article/1749664)的解释)。
170 |
171 | 最后说下测试环境的配置,请参考[这里](https://code.visualstudio.com/docs/python/testing#_configure-tests)。
172 |
173 | 安装了Python扩展后,VS Code活动栏上就会出现一个测试烧杯的图标--它就是测试浏览器。当打开测试资源管理器时,如果你没有启用测试框架,你会看到一个配置测试的按钮。一旦你选择了配置测试,你将被提示选择一个测试框架和一个包含测试的文件夹,文件夹一般是专门构建的一个test文件夹。
174 |
175 | 
176 |
177 | 选中后 vscode会自动进行 Test discovery工作,如果报错,检查“输出”->“Python”,看看报的什么错。
178 |
179 | 
180 |
181 | 报错的原因可能是pytest等相关测试工具安装的问题,也有可能是代码里有一些包没安装好等,多看看输出台报的错,根据错来判断原因。
182 |
183 | 如果能够成功让vscode发现test文件,就会看到如下图所示的界面,那么接下来就很容易运行测试代码了,直接能够看到每个函数前面都有“运行”键。
184 |
185 | 
186 |
187 | 也很容易debug,加断点后,点击点击测试函数右边显示的debug按键就能进入debug模式了。
188 |
189 | 
190 |
191 | 但是注意如果安装了pytest-cov覆盖模块,那么VS Code在调试时不会在断点处停止,因为pytest-cov也是用同样的技术来访问正在运行的源代码。为了防止这种行为,在调试测试时在pytestArgs中加入--no-cov,例如加入 "env": {"PYTEST_ADDOPTS": "--no-cov"} 到launch.json中(如下所示,是整个launch.json的配置,configurations下面第二个大括号里的内容就是为了debug而设置的)。
192 |
193 | ```launch.json
194 | {
195 | // 使用 IntelliSense 了解相关属性。
196 | // 悬停以查看现有属性的描述。
197 | // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
198 | "version": "0.2.0",
199 | "configurations": [
200 | {
201 | "name": "Python: 当前文件",
202 | "type": "python",
203 | "request": "launch",
204 | "program": "${file}",
205 | "console": "integratedTerminal",
206 | },
207 | {
208 | "name": "Debug Tests",
209 | "type": "python",
210 | "request": "test",
211 | "console": "integratedTerminal",
212 | "justMyCode": false,
213 | "env": {"PYTEST_ADDOPTS": "--no-cov"}
214 | }
215 | ]
216 | }
217 | ```
218 |
219 | 这时候再debug就会成功了。
220 |
221 | ## Install Python
222 |
223 | 首先安装python,个人建议直接安装anaconda或者miniconda,README中已经提供安装参考了,也可以参考[这里](https://github.com/waterDLut/WaterResources/blob/master/tools/jupyterlab&markdown.md#12-jupyterlab%E5%90%AF%E5%8A%A8),这里就不赘述了。
224 |
225 | 这里简单补充下pip和conda的相关概念。主要参考了anaconda的文章:[Understanding Conda and Pip](https://www.anaconda.com/understanding-conda-and-pip/)
226 |
227 | conda 和 pip 通常被认为是差不多的。然而虽然它们很多功能重叠,但它们被设计是用于不同的目的。
228 |
229 | Pip 是一个python包官方推荐的从[Python Package Index, PyPI](https://pypi.org/)安装包的工具。Pip 以wheels或source distributions的形式安装 打包的python 软件。从源码安装,即后者source distribution需要系统有兼容的解释器和需要的库。
230 |
231 | Conda是一个跨平台的包和环境管理器,它是从Anaconda repository 和 anaconda cloud 安装和管理conda 包。conda包是二进制包,所以不需要解释器来安装,并且conda安装的不仅限于python软件,也可以是C或者C++库,或者R包等。
232 |
233 | 这就是两者的一个主要区别,即pip安装python包,而conda安装任何语言的包。在使用pip之前,必须要安装有python解释器。而conda不仅可以安装python包,还可以安装python解释器。
234 |
235 | 两者的另一个区别是conda能创建独立的环境,在各独立环境中,可以安装各自的python版本和包。这在数据科学工具中很有用,因为不同工具的依赖可能会有冲突。而pip需要依赖于一些工具来创建独立环境,比如virtualenv或venv。还有一些像pipenv,poetry和hatch的工具,它们包装了pip和virtualenv来提供简易的使用方法。
236 |
237 | pip和conda在安装依赖时也有不同。安装包时,pip安装以递归序列的循环来安装依赖包,不能保证同时满足所有依赖包的安装。如果按顺序较早安装的包与按顺序较晚安装的包有不兼容的依赖项版本,则可能导致环境以微妙的方式被破坏。而conda使用了可满足性(SAT)求解器来验证安装在环境中的所有包的所有要求都能得到满足。这个check会花费一些时间,但是能防止出现错误的安装。只要包 元数据关于依赖的内容是正确的,conda就能产出正确的工作环境。
238 |
239 | 用conda可以安装的包 有 anaconda repo里超过1500个库以及anaconda cloud中的可以从包括 conda-forge 和 bioconda 等channel(通道或频道)处获取的数千个包。conda有很多不同的通道,什么意思呢?这里简单补充下,根据[conda-forge 的 introduction](https://conda-forge.org/docs/user/introduction.html),conda团队打包了很多包并以默认channel的形式提供给所有的用户。但是如果想要使用的包不在默认通道中,用户就要创建自己的channel,而这时候找包,想要实现不同channel包能兼容且channel一直有维护等是比较难做到的,但conda-forge是一个专用通道,它能帮助轻松解决这些问题,简而言之,用conda的话,优先用它就行了。
240 |
241 | 尽管conda中可以有这么多的工具包可用,但是相比于PyPI上的超过15万可用包而言仍然是很小的。如果有些工具包只能通过pip来安装,考虑到conda和pip的相似性,混合使用这两种工具来创建计算环境也不奇怪了,不过混合使用时需要注意一些事项,稍后更详细介绍。
242 |
243 | 一个表格简单总结下conda和pip的比较:
244 |
245 | | |conda|pip|
246 | |-|-|-|
247 | |manages |binaries|wheel or source|
248 | |can require compilers|no|yes|
249 | |package types|any|Python-only|
250 | |create environment|yes, built-in|no, requires virtualenv or venv|
251 | |dependency checks|yes|no|
252 | |package sources|Anaconda repo and cloud|PyPI|
253 |
254 | ## Getting Your Python App Running without Docker
255 |
256 | 关于docker是什么可以不用管,因为这一节是不会用到它的。
257 |
258 | 接下来,就是如何安装所需程序包。比如numpy,pandas等,也有 required external services 比如你的数据库。
259 |
260 | 先说如何安装依赖工具包。当然你可以使用pip或者conda一个个地安装。但是一个一个地安装显然是比较慢的,最关键的是,可能会有两个不同项目使用同一个包不同版本的情况,那就很麻烦了。所以就有人开发了一个叫做 Virtual Environment 的东西--Virtualenv,这个python工具可以为每个项目创建一个虚拟环境,这样项目互相之间就不会影响了。接下来记录下Virtual Environment及其相关的内容。因为conda和pip的方式不同,所以下面分开记录,个人根据自己的情况自己选择工具,各有优劣,比如对于conda,因为是跨语言的,所以有些外部依赖可以容易安装,但是会有很多python包不在conda中,需要混合使用pip;而pip虚拟环境中就能随意安装python包,但是它的问题是有可能有些外部依赖会导致python包不能安装成功,这对于经常需要一些外部依赖的水文水资源相关计算来说确实不是很方便。个人建议可以优先使用conda来配置虚拟环境,当conda安装不了的时候再用pip补充。更多建议可以参考:[Conda: Myths and Misconceptions](https://jakevdp.github.io/blog/2016/08/25/conda-myths-and-misconceptions/);当然如果更愿意用 pip,或者有些重要的工具(比如 tensorflow)推荐使用pip安装,那么可以直接看[virtual-environment和pipenv](https://github.com/OuyangWenyu/hydrus/blob/master/1-basic-envir/2-python-envir.md#virtual-environment-%E5%92%8C-pipenv)
261 |
262 | ### Conda Environment
263 |
264 | 本小节先简单介绍下conda的使用的一些意见,尤其是和pip混合使用时要注意的内容,然后再看看具体如何用conda管理environment。
265 |
266 | 根据前面第二节的介绍可以看出,根据anaconda的意见,是能用conda就用conda,不够的时候再用pip。关于在conda中使用pip,再补充一些内容,参考:[Using Pip in a Conda Environment](https://www.anaconda.com/using-pip-in-a-conda-environment/)
267 |
268 | 混合使用conda和pip有时候会遇到一些问题,这是因为conda不会控制它不安装的包,如果conda 在pip之后安装,可能会overwrite一些包,这可能会破坏pip安装的内容。类似的pip也会破坏conda的。有一些方式可以避免在同时使用conda和pip时遇到环境被破坏的情况。
269 |
270 | 一种就是只用conda,如果需要的软件不是作为conda包提供的,那么可以使用conda build为上述软件创建包。对于PyPI上可用的项目,conda skeleton命令(它是conda-build的一部分)经常生成一个配方,可以使用该配方创建一个conda包,而几乎不需要修改。
271 |
272 | 为所有需要的附加软件创建conda包是将数据科学环境放在一起的一种可靠的安全方法,但如果环境中包含大量仅在PyPI上可用的包,则可能成为一种负担。在这些情况下,**仅在通过conda安装了所有其他需求之后才使用pip是最安全的做法**。此外,应该使用“仅在需要时才升级策略”的参数来运行pip,以防止对通过conda安装的包进行不必要地升级。这是运行pip时的默认值,注意最好不更改它。
273 |
274 | 如果希望使用pip与conda包一起安装软件,那么最好将此安装**安装到专门构建的conda环境中**,以保护其他环境不受pip可能进行的任何修改的影响。Conda环境彼此隔离,允许安装不同版本的包。许多用户仅依赖于通过安装Anaconda或Miniconda创建的根conda环境。如果这个环境充斥着pip和conda安装,那么恢复起来就会困难得多。另一方面,创建独立的conda环境允许您轻松地删除和重新创建环境,而不会危及您的核心conda功能。
275 |
276 | 一旦使用pip将软件安装到conda环境中,conda将不知道这些更改,并可能进行破坏环境的修改。与先运行conda、pip再运行conda不同,更可靠的方法是使用合并后的conda需求创建一个新环境,然后运行pip。可以在删除旧环境之前测试这个新环境。再次强调,造成问题的主要是pip的状态性。由于安装包的顺序而存在的状态越多,就越难以保持正常工作。
277 |
278 | 对于经常重新创建的环境,将conda和pip包需求存储在文本文件中是一个很好的实践。包需求可以通过文件参数提供给conda,通过-r或需求提供给pip。可以将包含conda和pip需求的单个文件导出或提供给conda env命令来控制环境。这两种方法的优点是,描述环境的文件可以检入版本控制系统并与他人共享。
279 |
280 | 总之,在结合使用conda和pip时,最好使用一个隔离的conda环境。只有在使用conda来安装尽可能多的包之后,才能使用pip来安装任何剩余的软件。如果需要对环境进行修改,最好创建一个新环境,而不是在pip之后运行conda。在适当的时候,conda和pip需求应该存储在文本文件中,比如本项目下的environment.yml文件。
281 |
282 | 总结下,就是:
283 |
284 | - Use pip only after conda
285 | - install as many requirements as possible with conda, then use pip
286 | - pip should be run with –upgrade-strategy only-if-needed (the default)
287 | - Do not use pip with the –user argument, avoid all “users” installs
288 | - Use conda environments for isolation
289 | - create a conda environment to isolate any changes pip makes
290 | - environments take up little space thanks to hard links
291 | - care should be taken to avoid running pip in the “root” environment
292 | - Recreate the environment if changes are needed
293 | - once pip has been used conda will be unaware of the changes
294 | - to install additional conda packages it is best to recreate the environment
295 | - Store conda and pip requirements in text files
296 | - package requirements can be passed to conda via the –file argument
297 | - pip accepts a list of Python packages with -r or –requirements
298 | - conda env will export or create environments based on a file with conda and pip requirements
299 |
300 | 了解了以上概念,现在根据conda官方文档[Managing environments](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html),看看如何管理环境。
301 |
302 | 接下来就以为本项目创建环境为例
303 |
304 | 如果仅运行本repo,就用项目README.md中说的环境文件安装即可,以下内容就**不要执行了**,这里记录下列是为了给其他项目的环境构建做一个指导。
305 |
306 | 在本项目文件夹下打开terminal,输入:
307 |
308 | ```Shell
309 | conda create --name hydrus
310 | ```
311 |
312 | 输入y即可创建。创建的环境存储在 anaconda3\envs 文件夹下。如果没有指定python环境,那么默认的使用的和安装的anaconda一样的python版本,这里指定使用的是python3.7。要创建一个特定的python版本环境可以使用如下代码:
313 |
314 | ```Shell
315 | $ conda create --name hydrus python=3.7
316 | ```
317 |
318 | 根据提示可以看到执行以下语句可进入hydrus环境:
319 |
320 | ```Shell
321 | $ conda activate hydrus
322 | ```
323 |
324 | 如果你没能进入,那可能是terminal环境有点问题,如果你是windows那就重新打开终端试试,如果是Ubuntu,那么就重新加载下.bashrc文件。
325 |
326 | 进入hydrus环境后,执行以下语句可以退出hydrus环境。
327 |
328 | ```Shell
329 | conda deactivate
330 | ```
331 |
332 | 还可以指定environment的安装环境,比如下列命令会在当前目录下创建一个叫做envs的子文件夹:
333 |
334 | ```Shell
335 | conda create --prefix ./envs python=3.9
336 | ```
337 |
338 | 这时候进入环境的命令需要使用全名(安装后会有提示),比如我在Ubuntu下为项目建立了独立环境:
339 |
340 | ```Shell
341 | conda activate /mnt/xxx/hydrus/envs
342 | ```
343 |
344 | 这在需要单独为一个项目创建单独的环境时尤其有用,如果你的anaconda或者miniconda的文件夹所在硬盘空间够,就不要折腾了,直接创建 hydrus 环境即可。
345 |
346 | 激活hydrus环境后,就可以进入jupyter lab了。注意,如果直接进入cmd,输入jupyter lab,那么进入的还是外边安装的anaconda的jupyter lab,所以这里要在hydrus环境下安装jupyter:
347 |
348 | ```Shell
349 | $ conda install -c conda-forge jupyterlab
350 | ```
351 |
352 | 然后再执行:
353 |
354 | ```Shell
355 | $ jupyter lab
356 | ```
357 |
358 | 现在可以在命令行里看到:
359 |
360 | 
361 |
362 | 可以看到启动的jupyter lab是hydrus环境下的,接下来就可以在jupyter lab中操作了,jupyter lab 导航页面如下所示:
363 |
364 | 
365 |
366 | 可以看到,能打开终端,能新建notebook,txt文件等。以下没有特别说明,终端操作都是在jupyter lab中打开的终端上进行,打开一个终端,输入:
367 |
368 | ```Shell
369 | $ conda env list
370 | ```
371 |
372 | 可以看到已经处于hydrus环境下了。
373 |
374 | 接下来可以使用代码安装package,比如
375 |
376 | ```Shell
377 | conda install -n hydrus scipy
378 | ```
379 |
380 | 如果需要指定版本,可以使用如下语句:
381 |
382 | ```Shell
383 | conda install -n hydrus scipy=0.15.0
384 | ```
385 |
386 | 如果在创建环境时,就指定安装包,可以使用类似如下语句:
387 |
388 | ```Shell
389 | conda create -n hydrus python=3.6 scipy=0.15.0 astroid babel
390 | ```
391 |
392 | 也可以通过environment.yml文件来创建环境。手动创建文件的方式可以参考:[Creating an environment file manually](https://docs.conda.io/projects/conda/en/latest/user-guide/tasks/manage-environments.html#create-env-file-manually)
393 |
394 | 示例可直接看本项目的environment.yml文件。可以先删除刚刚创建的虚拟环境:
395 |
396 | ```Shell
397 | conda remove --name hydrus --all
398 | ```
399 |
400 | 如果是删除./envs文件夹,可以直接手动删除即可。
401 |
402 | 然后在项目文件夹下执行以下语句就可以创建环境hydrus了,直接使用下列语句:
403 |
404 | ```Shell
405 | conda env create -f environment.yml
406 | ```
407 |
408 | 进入虚拟环境并查看当前环境是否安装正确:
409 |
410 | ```Shell
411 | conda activate hydrus
412 | conda env list
413 | ```
414 |
415 | 如果更改了environment.yml文件的内容后需要更新环境,则可以运行:
416 |
417 | ```Shell
418 | conda env update --file environment.yml --prune
419 | ```
420 |
421 | --prune参数表示删除不再需要的依赖包。
422 |
423 | 如果需要复制环境,则可以使用:
424 |
425 | ```Shell
426 | conda create --name hydrus-clone --clone hydrus
427 | ```
428 |
429 | 如果在conda中使用pip,首先在conda中安装pip:
430 |
431 | ```Shell
432 | conda install -n hydrus pip
433 | conda activate hydrus
434 | ```
435 |
436 | 然后就可以使用pip了。比如安装 matplotlib:
437 |
438 | ```Shell
439 | pip install matplotlib
440 | ```
441 |
442 | 除了前面说的手动写yml文件,还可以直接使用conda导出。在hydrus环境下,使用下列代码可以生成新的environment.yml文件:
443 |
444 | ```Shell
445 | $ conda env export > environment.yml
446 | ```
447 |
448 | 环境会同时导出conda和pip安装的包(如果pip安装了包),但是这个导出的环境一般会非常详细复杂,所以一般还是建议手动设置好environment.yml。
449 |
450 | 另外,可以看到环境文件里有用到conda-forge channel,这个频道是我们水资源等地球科学相关专业都会经常用的一个conda频道。这里建议直接看看earthlab的github项目:[earth-analytics-python-env](https://github.com/earthlab/earth-analytics-python-env)的environment.yml文件,就知道了,对应的博客:[Lesson 4. Set Up Your Conda Earth Analytics Python Environment Setup earth analytics environment](https://www.earthdatascience.org/workshops/setup-earth-analytics-python/setup-python-conda-earth-analytics-environment/)
451 |
452 | 注意根据[conda-forge Tips & tricks](https://conda-forge.org/docs/user/tipsandtricks.html#how-to-fix-it) 的说明,conda-forge和conda并不完全兼容,因此有时候,**需要将前后顺序钉死,conda-forge在前**,这样才能避免出现安装错误,否则很可能报错(个人实践中暂时没有碰到问题,所以下面的.condarc文件仅供参考)。
453 |
454 | 执行以下语句,系统会自动为你创建一个.condarc 文件:
455 |
456 | ```Shell
457 | conda config --add channels conda-forge
458 | ```
459 |
460 | .condarc文件内容如下:
461 |
462 | ``` code
463 | channel_priority: strict
464 | channels:
465 | - conda-forge
466 | - defaults
467 | ```
468 |
469 | .condarc文件在我的win10上,是在 C:\Users\xxx下 ,即用户的主目录下,如果没有channel_priority: strict,在终端执行以下语句可以固定顺序:
470 |
471 | ```Shell
472 | conda config --set channel_priority strict
473 | ```
474 |
475 | 另外,如果需要清理conda的包,可以使用conda clean 命令,conda clean --help 看看自己需要哪个指令,这在自己的硬盘空间不够的时候还是很有用的。
476 |
477 | **如果不需要用docker,也不用pip的environment,到这里就够了,不必再往下看了,下面都是针对实际项目中使用pipenv及docker的。**
478 |
479 | 进入下一节:[1-learn-python/1.1-basic-python.ipynb](https://github.com/OuyangWenyu/hydrus/blob/master/1-learn-python/1.1-basic-python.ipynb)
480 |
481 | ### Virtual Environment 和 Pipenv
482 |
483 | 在开发Python应用程序的时候,系统安装的Python3只有一个版本。所有第三方的包都会被pip安装到Python3的site-packages目录下。
484 |
485 | 如果我们要同时开发多个应用程序,那这些应用程序都会共用一个Python,就是安装在系统的Python 3。如果应用A需要ruanjian 2.7,而应用B需要ruanjian 2.6怎么办?
486 |
487 | 这种情况下,**每个应用可能需要各自拥有一套“独立”的Python运行环境**。**virtualenv**就是用来为一个应用**创建一套“隔离”的Python运行环境**。
488 |
489 | python3.3之后可以直接使用python自带的 venv,用法和virtualenv 差不多,将下面代码中的“virtualenv ”换成“python -m venv ”即可,不过细节可能不同,这里没有尝试,所以就不多说了,还是以virtualenv为主。
490 |
491 | 在一切开始之前,需要安装python和pip,这点和前面的conda 做法不太一样。可以先安装一个所需版本的python,比如最新版的 Python 3.7: 3.7.9 。
492 |
493 | 首先,从[python网站](https://www.python.org/downloads/)下载该版本,win10下面直接下载 Windows x86-64 executable installer 安装包即可。
494 |
495 | 然后点击安装包进行安装,直接选择给出的第一项点击安装即可,下面勾选项一个都不用勾选,可以都取消。即不需要配置python环境(也可以勾选配置,无所谓),因为我们可能在不同的虚拟环境中需要不同版本的python,因此这里没必要指定好python环境,不过如果想方便,也可以配置好,但注意要将python文件根目录、Scripts目录名以及**Library\bin**三个文件路径都放入环境变量下。记住刚刚安装的位置,比如我的是在:C:\Users\hust2\AppData\Local\Programs\Python\Python37,在C:\Users\hust2\AppData\Local\Programs\Python\Python37\Scripts 文件夹里有pip工具。
496 |
497 | 在pip的文件夹下打开命令行,然后用pip安装virtualenv:
498 |
499 | ``` bash
500 | pip install virtualenv
501 | ```
502 |
503 | 然后,假定我们要开发一个新的项目,需要一套独立的Python运行环境,可以这么做:
504 |
505 | 第一步,在本文件所在的文件夹下打开命令行,创建目录:
506 |
507 | ```bash
508 | mkdir myproject
509 | cd myproject
510 | ```
511 |
512 | 第二步,用virtualenv创建一个独立的Python运行环境(如前所述,没有配置环境变量,所以这里直接用了绝对路径),环境命名为venv;如果需要指定python版本,则用安装的python来作为-p参数的值,如下所示:
513 |
514 | ```Shell
515 | C:\Users\hust2\AppData\Local\Programs\Python\Python37\Scripts\virtualenv venv -p C:\Users\hust2\AppData\Local\Programs\Python\Python37\python.exe
516 | ```
517 |
518 | 如果想要删除刚刚创建的虚拟环境,因为我们什么也没装,直接删除venv文件夹就行了。
519 |
520 | 新建的Python环境被放到当前目录下的venv目录。有了venv这个Python环境,可以用下面的命令激活该环境:
521 |
522 | ```Shell
523 | .\venv\Scripts\activate
524 | ```
525 |
526 | 可以观察命令行,注意到命令提示符变了,**有个(venv)前缀**,表示当前环境是一个名为venv的Python环境。如果想要更新pip环境,可以使用如下命令:
527 |
528 | ```Shell
529 | python -m pip install --upgrade pip
530 | ```
531 |
532 | 然后可以正常安装各种第三方包,比如安装 numpy:
533 |
534 | ``` Shell
535 | pip install numpy
536 | ```
537 |
538 | 在venv环境下,用pip安装的包都被安装到venv这个环境下,系统Python环境不受任何影响。也就是说,venv环境是专门针对myproject这个应用创建的。
539 |
540 | 如果想要退出当前的venv环境,可以使用deactivate命令:
541 |
542 | ```Shell
543 | deactivate
544 | ```
545 |
546 | 此时就回到了正常的环境,现在pip或python均是在系统Python环境下执行。
547 |
548 | 以上可知,完全**可以针对每个应用创建独立的Python运行环境**,这样就可以对每个应用的Python环境进行隔离。那virtualenv是如何创建“独立”的Python运行环境的呢?原理很简单,就是把系统Python复制一份到virtualenv的环境,用命令 .venv/bin/activate进入一个virtualenv环境时,virtualenv会修改相关环境变量,让命令python和pip均指向当前的virtualenv环境。
549 |
550 | 另外还有一个重要的文件requirements.txt必须一提,接下来的内容参考:[What is the python requirements.txt?](https://www.idkrtm.com/what-is-the-python-requirements-txt/)
551 |
552 | 如果浏览github上的python项目,经常会看到它。它就是一个指定运行项目所需的python packages 的。一般是在项目根目录下。一个requirements.txt形如:
553 |
554 | ```requirements.txt
555 | pyOpenSSL==0.13.1
556 | pyparsing==2.0.1
557 | python-dateutil==1.5
558 | ```
559 |
560 | 每行对应一个package,然后是它的版本号。版本号也很重要,毕竟版本变化之后,容易出bug。
561 |
562 | 在刚才的venv虚拟环境下使用下面的命令即可生成requirements.txt文件。
563 |
564 | ``` Shell
565 | pip freeze >requirements.txt
566 | ```
567 |
568 | 可以看到已经安装的所有库以及其版本(这里只试装了一个numpy,因此只有一个numpy==xxx)。
569 |
570 | 如果转移到一个新的环境下,可以直接根据requirements.txt安装库,创建好virtual environment,然后激活环境,再在环境中执行下述操作即可。
571 |
572 | 1. 打开终端
573 | 2. 进入 requirements.txt 所在的文件夹
574 | 3. 运行: pip install -r requirements.txt
575 |
576 | 最后,前面已经说了,pip是不能安装非python的外部依赖的,所以如果有些库需要额外安装,还需要提前手动处理好。
577 |
578 | 前面提到了pip和virtualenv,其实还有一个更强大的工具pipenv,接下来就记录下其基本内容,不过根据一些介绍:https://zhuanlan.zhihu.com/p/81568689 ,这些更高级工具貌似稳定性略差了一些,所以个人建议还是优先使用底层的工具较好,所以到这pip工具的使用学习也可以结束了,如果需要pipenv再了解后续内容。
579 |
580 | 以下内容主要参考了:[pipenv使用指南](https://crazygit.wiseturtles.com/2018/01/08/pipenv-tour/),[Pipenv: A Guide to the New Python Packaging Tool](https://realpython.com/pipenv-guide/) 以及 [Pipenv——最好用的python虚拟环境和包管理工具](https://www.cnblogs.com/zingp/p/8525138.html)等。
581 |
582 | 首先,简单概述下,pipenv是**Python官方推荐的包管理工具**。可以说,它**集成了virtualenv, pip和pyenv三者的功能**。其目的旨在集合了所有的包管理工具的长处,如: npm, yarn, composer等的优点。
583 |
584 | 它能够**自动为项目创建和管理虚拟环境**,从Pipfile文件添加或删除安装的包,同时生成Pipfile.lock来锁定安装包的版本和依赖信息,避免构建错误。
585 |
586 | pipenv主要解决了如下问题:
587 |
588 | - 不用再单独使用**pip和virtualenv**, 现在它们**合并**在一起了
589 | - **不用再维护requirements.txt**, 使用**Pipfile和Pipfile.lock**来代替
590 | - 可以使用多个python版本(python2和python3)
591 | - 在安装了pyenv的条件下,可以自动安装需要的Python版本
592 |
593 | 接下来,看看pipenv的来龙去脉。首先明确pipenv解决了什么问题?
594 |
595 | #### Problems that Pipenv Solves
596 |
597 | 从上面说到的requirements.txt说起,比如在requirements中有flask==0.12.1,虽然指定了flask的版本,但是flask的依赖的版本是没有指定的,如果直接使用上一节说到的pip install安装的话,都会安装最新版的依赖。这可能会导致一些小问题。这就是real issue:**the build isn’t deterministic**。 即给定相同的requirements.txt文件,安装的库却可能是不同的。
598 |
599 | 比较常用的解决方法是上一节也提到过的freeze,这样就能获取所有的库及其版本号。执行之后,将结果copy到requirements.txt即可。然而,这个方法却有另外的问题。
600 |
601 | 因为,旧版本可能会有bug,有可能某个版本的依赖是需要及时更新补丁的,如果用了freeze的办法得到requirements文件,现在就需要手动修改一下某个依赖库。实际上,很多时候也并不需要一直保持在现有的版本下,很多依赖库使用最新版本可能更好更安全。这一部分的问题就是:**How do you allow for deterministic builds for your Python project without gaining the responsibility of updating versions of sub-dependencies?**
602 |
603 | 答案就是Pipenv。
604 |
605 | 现在再看另一个问题。当处理多个项目时,如果项目A需要django 1.9版本,另一个项目B需要django 1.10版本。那么这时候就需要使用前面提到的 virtual environment 来处理。工具就是venv 。现在Pipenv是包含了venv 的功能的。
606 |
607 | 然后还有一个Dependency Resolution。什么意思?加入 requirements.txt 文件中有如下代码:
608 |
609 | ```python requirements
610 | package_a
611 | package_b
612 | ```
613 |
614 | 假如package_a有依赖 package_c>=1.0,而package_b 有依赖 package_c<=2.0. 那么现在就是要求package_c (being >=1.0 and <=2.0) 。现在想要工具自动选择一个合适的版本,这就是“dependency resolution.”现在如果在requirements文件中加入下列语句:
615 |
616 | ```python requirements
617 | package_c>=1.0,<=2.0
618 | package_a
619 | package_b
620 | ```
621 |
622 | 不过如前所述,如果package_a改变了它的requirement,那么按照指定的requirements安装可能会出错。
623 |
624 | 所以需要更加智能的安装工具,在不明确指定子依赖的情况下,能选择满足所有条件的库安装。
625 |
626 | #### Pipenv Introduction
627 |
628 | ``` Shell
629 | pip install pipenv
630 | ```
631 |
632 | 安装了pipenv之后,就可以忘记pip了。因为它可以完全替代pip。它还会引入两个文件,一个Pipfile,替代requirements.txt,另一个是Pipfile.lock来执行deterministic builds。
633 |
634 | Pipenv整合了pip和virtualenv,可以让我们以简单的方式使用。
635 |
636 | 比如创建一个virtual environment,在项目的根目录下,打开命令行,然后直接使用一下语句即可:
637 |
638 | ```Shell
639 | pipenv shell
640 | ```
641 |
642 | 该语句会为该项目创建好一个同名虚拟环境,并在该项目文件夹下创建一个Pipfile文件,然后现在的命令行下已经处在该项目的虚拟环境下了。
643 |
644 | Pipfile是替代 requirements.txt 的。其语法是TOML的,关于TOML,可以参考:[TOML 教程 - 可能是目前最好的配置文件格式](https://zhuanlan.zhihu.com/p/50412485) ,总之是一个比较新的配置文件的格式。
645 |
646 | 如果不小心创建错了,想要删除,则可以在同一个文件夹下执行下面语句:
647 |
648 | ```Shell
649 | pipenv --rm
650 | ```
651 |
652 | 删除之后,Pipfile还在,如果不想要的话,手动删除即可。
653 |
654 | 接下来就可以安装包了。首先可以看看虚拟环境下有什么包已经安装了:
655 |
656 | ```Shell
657 | pipenv graph
658 | ```
659 |
660 | 上述语句可以查看所有包依赖情况。
661 |
662 | 安装package语句类似如下形式:
663 |
664 | ```Shell
665 | pipenv install numpy
666 | ```
667 |
668 | 一旦安装了一个package, pipenv就会再生成一个Pipfile.lock文件。
669 |
670 | Pipfile.lock是确保 deterministic builds 的,是一个JSON文件。其中有指定子依赖的版本。
671 |
672 | 如果想要卸载安装的package,使用下面语句:
673 |
674 | ```Shell
675 | pipenv uninstall numpy
676 | ```
677 |
678 | 卸载所有:
679 |
680 | ```Shell
681 | pipenv uninstall --all
682 | ```
683 |
684 | 如果想要安装的是pytest,并且只想让它在测试开发的时候才用,生产时候不适用,可以加上--dev参数:
685 |
686 | ```Shell
687 | pipenv install pytest --dev
688 | ```
689 |
690 | 如果想要将库推到生产环境下,需要锁定下安装环境:
691 |
692 | ```Shell
693 | pipenv lock
694 | ```
695 |
696 | 这样,Pipfile.lock就不要再手动修改了。以上就是利用pipenv的一些基本操作。
697 |
698 | 查看有哪些虚拟环境,对应项目在哪,可以使用下列语句:
699 |
700 | ```Shell
701 | pipenv --venv
702 | pipenv --where
703 | ```
704 |
705 | 退出当前的虚拟环境直接使用:
706 |
707 | ```Shell
708 | deactivate
709 | ```
710 |
711 | 如果想重新进入某个虚拟环境,可以用pipenv --venv找到该环境,比如/home/owen/.local/share/virtualenvs/hydrus--ORegRFb,然后使用类似如下代码即可:
712 |
713 | ```Shell
714 | . /home/owen/.local/share/virtualenvs/hydrus--ORegRFb/bin/activate
715 | ```
716 |
717 | 如果不需要将自己的项目打包发布,那么到这就ok了。
718 |
719 | 如果需要在IDE中配置虚拟环境,比如在Pycharm中配置,可以参考官网的步骤:[Pipenv environment](https://www.jetbrains.com/help/pycharm/pipenv.html),但是我按照官方的没成功,因为没有.local/bin文件夹,这是因为我个人安装pipenv的时候,用的是anaconda下的pip,所以pipenv是安装在ananconda的文件夹下面了,在ananconda/bin文件夹下即可看到pipenv的可执行文件。
720 |
721 | 注意首先在项目文件夹下创建虚拟环境(项目根目录下终端执行 pipenv shell),然后再到pycharm的该项目下,将pipenv添加到interpreter路径中。
722 |
723 | 如果需要发布自己的项目,即做一个可以让别人import来使用的代码包,可以使用setup.py ,一般的工作流是这样的:
724 |
725 | - setup.py
726 | - install_requires keyword should include whatever the package “minimally needs to run correctly.”
727 | - Pipfile
728 | - Represents the concrete requirements for your package
729 | - Pull the minimally required dependencies from setup.py by installing your package using Pipenv:
730 | - Use pipenv install '-e .'
731 | - That will result in a line in your Pipfile that looks something like "e1839a8" = {path = ".", editable = true}.
732 | - Pipfile.lock
733 | - Details for a reproducible environment generated from pipenv lock
734 |
735 | #### pipenv 基本使用
736 |
737 | 这部分总结下前面introduction的内容,记录下如何生成pipfile和pipfile.lock,以及如何根据这些文件,快速在一个新环境下配置好依赖包。
738 |
739 | 这部分参考了:[Pipenv一键搭建python虚拟环境](https://www.jianshu.com/p/1441169b3dbe).
740 |
741 | 首先,安装pipenv。为了方便使用, 建议全局安装:
742 |
743 | ```Shell
744 | pip install pipenv
745 | ```
746 |
747 | 进入你项目根目录文件夹,打开终端,执行:
748 |
749 | ```Shell
750 | pipenv install
751 | ```
752 |
753 | 如果你已经有了pipfile和pipfile.lock文件,那么pipenv不仅会创建一个虚拟环境,还会安装pipfile.lock中的依赖包。如果没有,那pipenv会生成虚拟环境,并创建一个pipfile文件。
754 |
755 | 然后你每次使用pipenv安装依赖的时候,pipfile都会自动更新。
756 |
757 | 安装好你的依赖包,之后,使用:
758 |
759 | ```Shell
760 | pipenv lock
761 | ```
762 |
763 | 就会生成你的pipfile.lock文件,这样你换到另一个环境下,也能很快地按照依赖包了。
764 |
765 | 如果需要卸载虚拟环境,进入项目根目录,使用下述方式:
766 |
767 | ```Shell
768 | pipenv --rm
769 | ```
770 |
771 | ## Installing external services
772 |
773 | 前面说完了关于依赖包的安装,接着说说installing external services的事。
774 |
775 | 如果你存储数据到数据库中了,那么数据库很可能会用到一些服务,比如MySQL,Postgres,Redis等。比如要用Postgres,那么你就要在电脑上安装它。还要注意由于你可能使用的操作系统不同,因此安装的情况也不一样。所以,要每个情况单独处理。因为我个人暂时以科研用的数据为主,即通常见到的是 txt/csv/hdf5/netcdf等格式的文件,不太需要使用数据库,所以就不具体举例了。
776 |
777 | 总之,安装好外部程序之后,就可以运行自己的代码程序了。如果你开发web服务端软件的话,你就知道有一些关于微服务的事,你可能有很多服务,管理这些服务还需要一些设置的,不知道就算了,不重要。
778 |
779 | 总之,就是如果你需要很多外部程序,完成前面python及其环境的安装之后,还是有很多麻烦事。这也就是为什么要使用docker的motivation之一。
780 |
781 | docker 部分放在了最后第七章构建python项目中,等后续自己实际用到了再了解不迟。
782 |
--------------------------------------------------------------------------------
/1-basic-envir/BonusGoogleCloud.md:
--------------------------------------------------------------------------------
1 | # Google Cloud
2 |
3 | google为了推广自己的云服务,有google cloud + colab + tensorflow + google earth engine的套装操作。另外,如果自己的数据量不是特别大,那么拿到这个平台上试运行也会死一个不错的选择。本文主要参考了:[Google Colab Free GPU Tutorial](https://medium.com/deep-learning-turkey/google-colab-free-gpu-tutorial-e113627b9f5d),[苦逼学生党的Google Colab使用心得](https://zhuanlan.zhihu.com/p/54389036),[3 个相见恨晚的 Google Colaboratory 奇技淫巧!](https://zhuanlan.zhihu.com/p/56581879)等资料,以简单了解谷歌云平台和Colab在线编辑器的基本内容,关于tensorflow,本repo下后续会有一些介绍,关于google earth engine,在[hydroGIS](https://github.com/OuyangWenyu/hydroGIS)中有介绍。
4 |
5 | ## Introduction to Colab
6 |
7 | 直接抄一段:
8 | Google Colab is a free cloud service and now it supports free GPU!
9 | You can;
10 | improve your Python programming language coding skills.
11 | develop deep learning applications using popular libraries such as Keras, TensorFlow, PyTorch, and OpenCV.
12 |
13 | 简而言之,就是一个带GPU的云端开发环境。
14 |
15 | 因为Cloab是在Google drive上工作的,因此首先,在Google drive上创建一个文件夹来让其使用,比如我创建了一个Colab Notebooks文件夹。
16 |
17 | 在该文件夹下,右键,选择“更多”-“关联更多应用”,搜索colab,并关联。如果关联上了还看不到,可参考以下引用的评论中的表述:
18 |
19 | ```
20 | 何笑鸥修改时间:2019年9月5日
21 | 看到有小伙伴即使关联本应用,在谷歌云端硬盘的新建目录下仍然看不到它。我的办法是:
22 | 1. 转到页面:https://colab.research.google.com/notebooks/welcome.ipynb
23 | 2. 单击菜单栏偏下方的“复制到云端硬盘”
24 | 3. 进入自己的谷歌云端硬盘(drive.google.com),可以看到出现一个黄色的文件夹,叫做Colab Notebooks,双击打开,里面有文件名为'“欢迎使用Colaboratory”的副本‘
25 | 4. 这时候再单击云端硬盘的“新建”-“更多”,就能看到“Google Colaboratory”项了。
26 | ```
27 |
28 | 如果还不行,就用新文件夹,留一个空白的colab文件用来复制粘贴即可。
29 |
30 |
31 | ### Running Python Codes
32 |
33 | 其使用方法和jupyter notebook是很像的。在左上角选择“+代码”,“+文本”可以分别添加代码和文本。注意colab貌似对中文的支持并不友好,所以尽量使用英文。
34 |
35 | 简单的代码可以直接运行即可。这里重点说下关于导入第三方模块和从github clone代码等操作。
36 |
37 | ### 选择GPU
38 |
39 | 然后选择硬件,直接 Edit(修改) > Notebook settings(笔记本设置) 或 Runtime>Change runtime type,然后选择GPU作为Hardware accelerator(硬件加速器)即可。
40 |
41 | ### 安装库
42 |
43 | 因为Tensorflow本身就是Google的,所以不用安装,可以直接用。直接使用tensorflow官方文档给的[初学者教程](https://www.tensorflow.org/tutorials/quickstart/beginner)即可。
44 |
45 | 因此,这里以pytorch的安装为例,不过colab上也有torch已经安装了.不过依然可以自己安装,这部分参考了:[使用Google Colab训练PyTorch神经网络](https://tiangexiao.github.io/2019/01/06/%E4%BD%BF%E7%94%A8Google-Colab%E8%AE%AD%E7%BB%83PyTorch%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C/),可以查看云端的系统/python版本/cuda版本,然后再根据pytorch官网上的推荐进行安装,可以发现,以 !开头的命令是可以执行操作系统的指令,以 %开头的命令表示魔法指令.colab没有原装conda,不过有pip和apt包管理器.
46 |
47 | ### 上传并使用数据文件
48 |
49 | 可以使用以下命令调用笔记本中的文件选择器:
50 |
51 | ``` python
52 | from google.colab import files
53 | uploaded = files.upload()
54 | ```
55 |
56 | 运行之后,我们就会发现单元 cell 下出现“选择文件”按钮.
57 |
58 | 也可以直接传入谷歌云盘。
59 |
60 | 在指定之前先用!ls命令查看一下云端自动分配的默认文件目录,云端默认的文件根目录是datalab.
61 |
62 | ```
63 | ! ls
64 | ```
65 |
66 | 详细的操作可以参考[官方文档](https://colab.research.google.com/notebooks/welcome.ipynb)。
67 |
68 | ### Clone github文件到Colab
69 |
70 | clone文件到colab中直接使用!git clone命令即可,不过colab上运行的都是jupyter notebook文件,因此,对于工程性质的python项目,需要采用另外的方式。其实,Colab就是一个云端运行机器学习算法的jupyter文件的平台。
71 |
72 | ### Debug in Colab
73 |
74 | 在colab中的debug和在jupyter notebook中的类似,
75 |
76 | ## 使用Google Cloud Platform
77 |
78 | 虽然colab很好,但是还是在一个电脑上操作可能更舒服一些,这里从GCP的安装开始,这部分主要参考了:[薅羊毛,Google Cloud免费使用一年以及详细教程说明](https://www.luofan.net/post/112.html).
79 |
80 | 先完成第一个步骤--试用GCP。然后创建一个项目。
81 |
82 | 接下来可以参考官方的[tensorflow文档](https://cloud.google.com/ml-engine/docs/tensorflow/getting-started-training-prediction?hl=zh-cn),确保GCP已启动结算功能,并启用AIPlatform。
83 |
84 | 进入项目,首先,进入实例创建页面,点击快速入门简介,边看边操作,按照官方的提示要求做即可。
85 |
86 | 接下来参考[视频](https://www.bilibili.com/video/av31141381/)快速搭建深度学习环境,首先要升级下账号(免费的),才能在“IAM和管理”界面修改配额(quotas)。然后参考视频介绍即可。申请GPU配额的话,需要等两天才有回复,所以就先耐心等待了。可以通过配额页面的当前使用量看自己的机器配额情况。
87 |
88 | 在等待GPU申请的过程中,可以下载安装Google Cloud SDK来使用,这是一个用于管理托管在GCP上的资源和应用的工具。
89 |
--------------------------------------------------------------------------------
/1-basic-envir/BonusMatlab.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Python调用Matlab\n",
8 | "\n",
9 | "很多科学计算程序由Matlab完成,但是我们想要在Python中直接调用,这时候可以使用Matlab在python中的计算引擎来帮助实现。\n",
10 | "\n",
11 | "主要参考了以下资料:\n",
12 | "\n",
13 | "- [从 Python 调用 MATLAB](https://ww2.mathworks.cn/help/matlab/matlab-engine-for-python.html?s_tid=CRUX_lftnav)\n",
14 | "- [python中调用matlab](https://zhuanlan.zhihu.com/p/47655091)\n",
15 | "\n",
16 | "首先本地电脑上要已经安装好matlab,进入matlab文件夹内的“extern\\engines\\python”文件夹,在python环境下执行:\n",
17 | "\n",
18 | "```Shell\n",
19 | "# 进入matlab的python引擎文件夹\n",
20 | "cd C:\\Program Files\\MATLAB\\R2021a\\extern\\engines\\python\n",
21 | "# 激活python环境\n",
22 | "conda activate hydrus\n",
23 | "# 安装matlabengine\n",
24 | "python setup.py install\n",
25 | "```\n",
26 | "\n",
27 | "如果因为权限原因报错,可以使用windows下的sudo,参考[这里](https://stackoverflow.com/questions/9652720/how-to-run-sudo-command-in-windows)安装 sudo 工具,这部分完整命令如下:\n",
28 | "\n",
29 | "```Shell\n",
30 | "# 打开windows terminal,执行下列语句\n",
31 | "# 首先,安装scoop工具\n",
32 | "Set-ExecutionPolicy RemoteSigned -scope CurrentUser\n",
33 | "iwr -useb get.scoop.sh | iex\n",
34 | "# 然后安装sudo工具\n",
35 | "scoop install gsudo\n",
36 | "# 检查安装是否成功\n",
37 | "sudo -v\n",
38 | "# 在指定python环境下安装matlabengine\n",
39 | "# 进入matlab的python引擎文件夹\n",
40 | "cd C:\\Program Files\\MATLAB\\R2021a\\extern\\engines\\python\n",
41 | "# 激活python环境\n",
42 | "conda activate hydrus\n",
43 | "# 安装matlabengine\n",
44 | "sudo python setup.py install\n",
45 | "# 弹出gsudo提示框,允许执行即可\n",
46 | "# 安装完成之后,输入conda list,可以看到 matlabengineforpython 包\n",
47 | "```\n",
48 | "\n",
49 | "接下来尝试执行一个matlab函数。"
50 | ]
51 | },
52 | {
53 | "cell_type": "code",
54 | "execution_count": 4,
55 | "metadata": {},
56 | "outputs": [
57 | {
58 | "name": "stdout",
59 | "output_type": "stream",
60 | "text": [
61 | "True\n"
62 | ]
63 | }
64 | ],
65 | "source": [
66 | "import matlab.engine\n",
67 | "eng = matlab.engine.start_matlab()\n",
68 | "tf = eng.isprime(37)\n",
69 | "print(tf)"
70 | ]
71 | },
72 | {
73 | "cell_type": "markdown",
74 | "metadata": {},
75 | "source": [
76 | "下面尝试调用一个自建的函数。函数文件为triarea.m,内容如下:\n",
77 | "\n",
78 | "```Matlab\n",
79 | "b = 5;\n",
80 | "h = 3;\n",
81 | "a = 0.5*(b.* h)\n",
82 | "```"
83 | ]
84 | },
85 | {
86 | "cell_type": "code",
87 | "execution_count": 5,
88 | "metadata": {},
89 | "outputs": [],
90 | "source": [
91 | "import matlab.engine\n",
92 | "eng = matlab.engine.start_matlab()\n",
93 | "eng.triarea(nargout=0)"
94 | ]
95 | },
96 | {
97 | "cell_type": "markdown",
98 | "metadata": {},
99 | "source": [
100 | "指定 nargout=0。尽管脚本会打印输出,但它不会向 Python 返回任何输出参数。所以在jupyter里面我们没看到输出,不过在命令行里可以看到输出:\n",
101 | "\n",
102 | "```Shell\n",
103 | "a=\n",
104 | " 7.5000\n",
105 | "```\n",
106 | "\n",
107 | "将脚本转换为函数并通过引擎调用该函数。要编辑文件,请打开 MATLAB 编辑器。"
108 | ]
109 | },
110 | {
111 | "cell_type": "code",
112 | "execution_count": 6,
113 | "metadata": {},
114 | "outputs": [],
115 | "source": [
116 | "eng.edit('triarea',nargout=0)"
117 | ]
118 | },
119 | {
120 | "cell_type": "markdown",
121 | "metadata": {},
122 | "source": [
123 | "执行上面的命令,可以看到matlab的编辑器被打开了。\n",
124 | "\n",
125 | "将triarea.m内容改为:\n",
126 | "\n",
127 | "```Matlab\n",
128 | "function a = triarea(b,h)\n",
129 | "a = 0.5*(b.* h);\n",
130 | "```\n",
131 | "\n",
132 | "然后执行:"
133 | ]
134 | },
135 | {
136 | "cell_type": "code",
137 | "execution_count": 7,
138 | "metadata": {},
139 | "outputs": [
140 | {
141 | "name": "stdout",
142 | "output_type": "stream",
143 | "text": [
144 | "2.5\n"
145 | ]
146 | }
147 | ],
148 | "source": [
149 | "ret = eng.triarea(1.0,5.0)\n",
150 | "print(ret)"
151 | ]
152 | },
153 | {
154 | "cell_type": "markdown",
155 | "metadata": {},
156 | "source": [
157 | "此时,triarea 函数仅返回一个输出参数,因此无需指定 nargout。"
158 | ]
159 | }
160 | ],
161 | "metadata": {
162 | "kernelspec": {
163 | "display_name": "hydrus",
164 | "language": "python",
165 | "name": "hydrus"
166 | },
167 | "language_info": {
168 | "codemirror_mode": {
169 | "name": "ipython",
170 | "version": 3
171 | },
172 | "file_extension": ".py",
173 | "mimetype": "text/x-python",
174 | "name": "python",
175 | "nbconvert_exporter": "python",
176 | "pygments_lexer": "ipython3",
177 | "version": "3.10.4"
178 | }
179 | },
180 | "nbformat": 4,
181 | "nbformat_minor": 4
182 | }
183 |
--------------------------------------------------------------------------------
/1-basic-envir/BonusR.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Jupyterlab下简单接触 R 语言\n",
8 | "\n",
9 | "承接 1-basic-envir/1-get-started.ipynb 最后一段话中关于R的部分,打开本文件后,将kernel选为R即可运行下面的代码。\n",
10 | "\n",
11 | "这里稍微给几个R语言的例子。日常积累。首先,是安装R包。这里以USGS 的 dataRetrieval 为例子,如果还未执行过下面句子,就取消注释,运行即可。代码主要参考了[这里](https://usgs-r.github.io/dataRetrieval/articles/tutorial.html)"
12 | ]
13 | },
14 | {
15 | "cell_type": "code",
16 | "execution_count": 1,
17 | "metadata": {},
18 | "outputs": [
19 | {
20 | "name": "stderr",
21 | "output_type": "stream",
22 | "text": [
23 | "将程序包安装入'C:/Users/hust2/OneDrive/Documents/R/win-library/4.1'\n",
24 | "(因为'lib'没有被指定)\n",
25 | "\n",
26 | "还安装相依关系'dotCall64', 'gridExtra', 'cli', 'spam', 'viridis', 'maps', 'iterators', 'sass', 'rlang', 'vctrs', 'fields', 'truncnorm', 'foreach', 'bslib', 'xfun', 'whisker', 'sp'\n",
27 | "\n",
28 | "\n"
29 | ]
30 | },
31 | {
32 | "name": "stdout",
33 | "output_type": "stream",
34 | "text": [
35 | "package 'dotCall64' successfully unpacked and MD5 sums checked\n",
36 | "package 'gridExtra' successfully unpacked and MD5 sums checked\n",
37 | "package 'cli' successfully unpacked and MD5 sums checked\n"
38 | ]
39 | },
40 | {
41 | "name": "stderr",
42 | "output_type": "stream",
43 | "text": [
44 | "Warning message:\n",
45 | "\"cannot remove prior installation of package 'cli'\"\n",
46 | "Warning message in file.copy(savedcopy, lib, recursive = TRUE):\n",
47 | "\"拷贝C:\\Users\\hust2\\OneDrive\\Documents\\R\\win-library\\4.1\\00LOCK\\cli\\libs\\x64\\cli.dll到C:\\Users\\hust2\\OneDrive\\Documents\\R\\win-library\\4.1\\cli\\libs\\x64\\cli.dll时出了问题:Permission denied \"\n",
48 | "Warning message:\n",
49 | "\"restored 'cli'\"\n"
50 | ]
51 | },
52 | {
53 | "name": "stdout",
54 | "output_type": "stream",
55 | "text": [
56 | "package 'spam' successfully unpacked and MD5 sums checked\n",
57 | "package 'viridis' successfully unpacked and MD5 sums checked\n",
58 | "package 'maps' successfully unpacked and MD5 sums checked\n",
59 | "package 'iterators' successfully unpacked and MD5 sums checked\n",
60 | "package 'sass' successfully unpacked and MD5 sums checked\n",
61 | "package 'rlang' successfully unpacked and MD5 sums checked\n"
62 | ]
63 | },
64 | {
65 | "name": "stderr",
66 | "output_type": "stream",
67 | "text": [
68 | "Warning message:\n",
69 | "\"cannot remove prior installation of package 'rlang'\"\n",
70 | "Warning message in file.copy(savedcopy, lib, recursive = TRUE):\n",
71 | "\"拷贝C:\\Users\\hust2\\OneDrive\\Documents\\R\\win-library\\4.1\\00LOCK\\rlang\\libs\\x64\\rlang.dll到C:\\Users\\hust2\\OneDrive\\Documents\\R\\win-library\\4.1\\rlang\\libs\\x64\\rlang.dll时出了问题:Permission denied \"\n",
72 | "Warning message:\n",
73 | "\"restored 'rlang'\"\n"
74 | ]
75 | },
76 | {
77 | "name": "stdout",
78 | "output_type": "stream",
79 | "text": [
80 | "package 'vctrs' successfully unpacked and MD5 sums checked\n"
81 | ]
82 | },
83 | {
84 | "name": "stderr",
85 | "output_type": "stream",
86 | "text": [
87 | "Warning message:\n",
88 | "\"cannot remove prior installation of package 'vctrs'\"\n",
89 | "Warning message in file.copy(savedcopy, lib, recursive = TRUE):\n",
90 | "\"拷贝C:\\Users\\hust2\\OneDrive\\Documents\\R\\win-library\\4.1\\00LOCK\\vctrs\\libs\\x64\\vctrs.dll到C:\\Users\\hust2\\OneDrive\\Documents\\R\\win-library\\4.1\\vctrs\\libs\\x64\\vctrs.dll时出了问题:Permission denied \"\n",
91 | "Warning message:\n",
92 | "\"restored 'vctrs'\"\n"
93 | ]
94 | },
95 | {
96 | "name": "stdout",
97 | "output_type": "stream",
98 | "text": [
99 | "package 'fields' successfully unpacked and MD5 sums checked\n",
100 | "package 'truncnorm' successfully unpacked and MD5 sums checked\n",
101 | "package 'foreach' successfully unpacked and MD5 sums checked\n",
102 | "package 'bslib' successfully unpacked and MD5 sums checked\n",
103 | "package 'xfun' successfully unpacked and MD5 sums checked\n",
104 | "package 'whisker' successfully unpacked and MD5 sums checked\n",
105 | "package 'sp' successfully unpacked and MD5 sums checked\n",
106 | "package 'dplyr' successfully unpacked and MD5 sums checked\n",
107 | "package 'dataRetrieval' successfully unpacked and MD5 sums checked\n",
108 | "package 'ggplot2' successfully unpacked and MD5 sums checked\n",
109 | "package 'tidyr' successfully unpacked and MD5 sums checked\n",
110 | "package 'RColorBrewer' successfully unpacked and MD5 sums checked\n",
111 | "package 'EGRET' successfully unpacked and MD5 sums checked\n",
112 | "package 'rmarkdown' successfully unpacked and MD5 sums checked\n",
113 | "package 'geoknife' successfully unpacked and MD5 sums checked\n",
114 | "\n",
115 | "The downloaded binary packages are in\n",
116 | "\tC:\\Users\\hust2\\AppData\\Local\\Temp\\RtmpYrW3mc\\downloaded_packages\n"
117 | ]
118 | }
119 | ],
120 | "source": [
121 | "install.packages(c(\"dplyr\",\"dataRetrieval\",\"ggplot2\",\"tidyr\",\"RColorBrewer\",\"EGRET\", \"rmarkdown\", \"geoknife\"))"
122 | ]
123 | },
124 | {
125 | "cell_type": "markdown",
126 | "metadata": {},
127 | "source": [
128 | "R中使用包前,同样需要先导入。"
129 | ]
130 | },
131 | {
132 | "cell_type": "code",
133 | "execution_count": 2,
134 | "metadata": {},
135 | "outputs": [
136 | {
137 | "name": "stderr",
138 | "output_type": "stream",
139 | "text": [
140 | "Warning message:\n",
141 | "\"程辑包'dataRetrieval'是用R版本4.1.3 来建造的\"\n"
142 | ]
143 | }
144 | ],
145 | "source": [
146 | "library(dataRetrieval)"
147 | ]
148 | },
149 | {
150 | "cell_type": "code",
151 | "execution_count": 3,
152 | "metadata": {},
153 | "outputs": [],
154 | "source": [
155 | "MauiCo_avgdailyQ <- readNWISdata(stateCd=\"Hawaii\", countyCd=\"Maui\", service=\"dv\", parameterCd=\"00060\")"
156 | ]
157 | },
158 | {
159 | "cell_type": "code",
160 | "execution_count": 4,
161 | "metadata": {},
162 | "outputs": [
163 | {
164 | "data": {
165 | "text/html": [
166 | "
\n",
167 | "A data.frame: 6 × 6\n",
168 | "\n",
169 | "\t | agency_cd | site_no | dateTime | X_00060_00003 | X_00060_00003_cd | tz_cd |
\n",
170 | "\t | <chr> | <chr> | <dttm> | <dbl> | <chr> | <chr> |
\n",
171 | "\n",
172 | "\n",
173 | "\t1 | USGS | 16400000 | 2022-05-26 | 3.62 | P | UTC |
\n",
174 | "\t2 | USGS | 16401000 | 1929-08-31 | 18.00 | A | UTC |
\n",
175 | "\t3 | USGS | 16402000 | 1957-07-31 | 51.00 | A | UTC |
\n",
176 | "\t4 | USGS | 16403000 | 1957-06-30 | 5.50 | A | UTC |
\n",
177 | "\t5 | USGS | 16403600 | 1970-09-30 | 2.40 | A | UTC |
\n",
178 | "\t6 | USGS | 16403900 | 1996-09-30 | 1.30 | A | UTC |
\n",
179 | "\n",
180 | "
\n"
181 | ],
182 | "text/latex": [
183 | "A data.frame: 6 × 6\n",
184 | "\\begin{tabular}{r|llllll}\n",
185 | " & agency\\_cd & site\\_no & dateTime & X\\_00060\\_00003 & X\\_00060\\_00003\\_cd & tz\\_cd\\\\\n",
186 | " & & & & & & \\\\\n",
187 | "\\hline\n",
188 | "\t1 & USGS & 16400000 & 2022-05-26 & 3.62 & P & UTC\\\\\n",
189 | "\t2 & USGS & 16401000 & 1929-08-31 & 18.00 & A & UTC\\\\\n",
190 | "\t3 & USGS & 16402000 & 1957-07-31 & 51.00 & A & UTC\\\\\n",
191 | "\t4 & USGS & 16403000 & 1957-06-30 & 5.50 & A & UTC\\\\\n",
192 | "\t5 & USGS & 16403600 & 1970-09-30 & 2.40 & A & UTC\\\\\n",
193 | "\t6 & USGS & 16403900 & 1996-09-30 & 1.30 & A & UTC\\\\\n",
194 | "\\end{tabular}\n"
195 | ],
196 | "text/markdown": [
197 | "\n",
198 | "A data.frame: 6 × 6\n",
199 | "\n",
200 | "| | agency_cd <chr> | site_no <chr> | dateTime <dttm> | X_00060_00003 <dbl> | X_00060_00003_cd <chr> | tz_cd <chr> |\n",
201 | "|---|---|---|---|---|---|---|\n",
202 | "| 1 | USGS | 16400000 | 2022-05-26 | 3.62 | P | UTC |\n",
203 | "| 2 | USGS | 16401000 | 1929-08-31 | 18.00 | A | UTC |\n",
204 | "| 3 | USGS | 16402000 | 1957-07-31 | 51.00 | A | UTC |\n",
205 | "| 4 | USGS | 16403000 | 1957-06-30 | 5.50 | A | UTC |\n",
206 | "| 5 | USGS | 16403600 | 1970-09-30 | 2.40 | A | UTC |\n",
207 | "| 6 | USGS | 16403900 | 1996-09-30 | 1.30 | A | UTC |\n",
208 | "\n"
209 | ],
210 | "text/plain": [
211 | " agency_cd site_no dateTime X_00060_00003 X_00060_00003_cd tz_cd\n",
212 | "1 USGS 16400000 2022-05-26 3.62 P UTC \n",
213 | "2 USGS 16401000 1929-08-31 18.00 A UTC \n",
214 | "3 USGS 16402000 1957-07-31 51.00 A UTC \n",
215 | "4 USGS 16403000 1957-06-30 5.50 A UTC \n",
216 | "5 USGS 16403600 1970-09-30 2.40 A UTC \n",
217 | "6 USGS 16403900 1996-09-30 1.30 A UTC "
218 | ]
219 | },
220 | "metadata": {},
221 | "output_type": "display_data"
222 | }
223 | ],
224 | "source": [
225 | "head(MauiCo_avgdailyQ)"
226 | ]
227 | },
228 | {
229 | "cell_type": "markdown",
230 | "metadata": {},
231 | "source": [
232 | "指定站点id来读取数据看看。"
233 | ]
234 | },
235 | {
236 | "cell_type": "code",
237 | "execution_count": 5,
238 | "metadata": {},
239 | "outputs": [
240 | {
241 | "data": {
242 | "text/html": [
243 | "\n",
244 | "A data.frame: 6 × 5\n",
245 | "\n",
246 | "\t | agency_cd | site_no | Date | X_00060_00003 | X_00060_00003_cd |
\n",
247 | "\t | <chr> | <chr> | <date> | <dbl> | <chr> |
\n",
248 | "\n",
249 | "\n",
250 | "\t1 | USGS | 01491000 | 2010-01-01 | 415 | A |
\n",
251 | "\t2 | USGS | 01491000 | 2010-01-02 | 425 | A |
\n",
252 | "\t3 | USGS | 01491000 | 2010-01-03 | 334 | A |
\n",
253 | "\t4 | USGS | 01491000 | 2010-01-04 | 268 | A |
\n",
254 | "\t5 | USGS | 01491000 | 2010-01-05 | 241 | A |
\n",
255 | "\t6 | USGS | 01491000 | 2010-01-06 | 224 | A |
\n",
256 | "\n",
257 | "
\n"
258 | ],
259 | "text/latex": [
260 | "A data.frame: 6 × 5\n",
261 | "\\begin{tabular}{r|lllll}\n",
262 | " & agency\\_cd & site\\_no & Date & X\\_00060\\_00003 & X\\_00060\\_00003\\_cd\\\\\n",
263 | " & & & & & \\\\\n",
264 | "\\hline\n",
265 | "\t1 & USGS & 01491000 & 2010-01-01 & 415 & A\\\\\n",
266 | "\t2 & USGS & 01491000 & 2010-01-02 & 425 & A\\\\\n",
267 | "\t3 & USGS & 01491000 & 2010-01-03 & 334 & A\\\\\n",
268 | "\t4 & USGS & 01491000 & 2010-01-04 & 268 & A\\\\\n",
269 | "\t5 & USGS & 01491000 & 2010-01-05 & 241 & A\\\\\n",
270 | "\t6 & USGS & 01491000 & 2010-01-06 & 224 & A\\\\\n",
271 | "\\end{tabular}\n"
272 | ],
273 | "text/markdown": [
274 | "\n",
275 | "A data.frame: 6 × 5\n",
276 | "\n",
277 | "| | agency_cd <chr> | site_no <chr> | Date <date> | X_00060_00003 <dbl> | X_00060_00003_cd <chr> |\n",
278 | "|---|---|---|---|---|---|\n",
279 | "| 1 | USGS | 01491000 | 2010-01-01 | 415 | A |\n",
280 | "| 2 | USGS | 01491000 | 2010-01-02 | 425 | A |\n",
281 | "| 3 | USGS | 01491000 | 2010-01-03 | 334 | A |\n",
282 | "| 4 | USGS | 01491000 | 2010-01-04 | 268 | A |\n",
283 | "| 5 | USGS | 01491000 | 2010-01-05 | 241 | A |\n",
284 | "| 6 | USGS | 01491000 | 2010-01-06 | 224 | A |\n",
285 | "\n"
286 | ],
287 | "text/plain": [
288 | " agency_cd site_no Date X_00060_00003 X_00060_00003_cd\n",
289 | "1 USGS 01491000 2010-01-01 415 A \n",
290 | "2 USGS 01491000 2010-01-02 425 A \n",
291 | "3 USGS 01491000 2010-01-03 334 A \n",
292 | "4 USGS 01491000 2010-01-04 268 A \n",
293 | "5 USGS 01491000 2010-01-05 241 A \n",
294 | "6 USGS 01491000 2010-01-06 224 A "
295 | ]
296 | },
297 | "metadata": {},
298 | "output_type": "display_data"
299 | }
300 | ],
301 | "source": [
302 | "# Choptank River near Greensboro, MD\n",
303 | "siteNumber <- \"01491000\" \n",
304 | "ChoptankInfo <- readNWISsite(siteNumber)\n",
305 | "parameterCd <- \"00060\"\n",
306 | "\n",
307 | "#Raw daily data:\n",
308 | "rawDailyData <- readNWISdv(siteNumber,parameterCd, \"2010-01-01\",\"2011-01-01\")\n",
309 | "head(rawDailyData)"
310 | ]
311 | },
312 | {
313 | "cell_type": "code",
314 | "execution_count": 6,
315 | "metadata": {},
316 | "outputs": [],
317 | "source": [
318 | "siteNo <- \"01491000\"\n",
319 | "pCode <- \"00060\"\n",
320 | "start.date <- \"2010-01-03\"\n",
321 | "end.date <- \"2010-01-03\"\n",
322 | "\n",
323 | "pheasant <- readNWISuv(siteNumbers = siteNo,\n",
324 | " parameterCd = pCode,\n",
325 | " startDate = start.date,\n",
326 | " endDate = end.date)"
327 | ]
328 | },
329 | {
330 | "cell_type": "code",
331 | "execution_count": 7,
332 | "metadata": {},
333 | "outputs": [
334 | {
335 | "data": {
336 | "text/html": [
337 | "\n",
342 | "- 'agency_cd'
- 'site_no'
- 'dateTime'
- 'X_00060_00000'
- 'X_00060_00000_cd'
- 'tz_cd'
\n"
343 | ],
344 | "text/latex": [
345 | "\\begin{enumerate*}\n",
346 | "\\item 'agency\\_cd'\n",
347 | "\\item 'site\\_no'\n",
348 | "\\item 'dateTime'\n",
349 | "\\item 'X\\_00060\\_00000'\n",
350 | "\\item 'X\\_00060\\_00000\\_cd'\n",
351 | "\\item 'tz\\_cd'\n",
352 | "\\end{enumerate*}\n"
353 | ],
354 | "text/markdown": [
355 | "1. 'agency_cd'\n",
356 | "2. 'site_no'\n",
357 | "3. 'dateTime'\n",
358 | "4. 'X_00060_00000'\n",
359 | "5. 'X_00060_00000_cd'\n",
360 | "6. 'tz_cd'\n",
361 | "\n",
362 | "\n"
363 | ],
364 | "text/plain": [
365 | "[1] \"agency_cd\" \"site_no\" \"dateTime\" \"X_00060_00000\" \n",
366 | "[5] \"X_00060_00000_cd\" \"tz_cd\" "
367 | ]
368 | },
369 | "metadata": {},
370 | "output_type": "display_data"
371 | }
372 | ],
373 | "source": [
374 | "names(pheasant)"
375 | ]
376 | },
377 | {
378 | "cell_type": "code",
379 | "execution_count": 8,
380 | "metadata": {},
381 | "outputs": [
382 | {
383 | "data": {
384 | "text/html": [
385 | "\n",
386 | "A data.frame: 6 × 6\n",
387 | "\n",
388 | "\t | agency_cd | site_no | dateTime | X_00060_00000 | X_00060_00000_cd | tz_cd |
\n",
389 | "\t | <chr> | <chr> | <dttm> | <dbl> | <chr> | <chr> |
\n",
390 | "\n",
391 | "\n",
392 | "\t1 | USGS | 01491000 | 2010-01-03 05:00:00 | 389 | A | UTC |
\n",
393 | "\t2 | USGS | 01491000 | 2010-01-03 05:15:00 | 386 | A | UTC |
\n",
394 | "\t3 | USGS | 01491000 | 2010-01-03 05:30:00 | 386 | A | UTC |
\n",
395 | "\t4 | USGS | 01491000 | 2010-01-03 05:45:00 | 382 | A | UTC |
\n",
396 | "\t5 | USGS | 01491000 | 2010-01-03 06:00:00 | 382 | A | UTC |
\n",
397 | "\t6 | USGS | 01491000 | 2010-01-03 06:15:00 | 379 | A | UTC |
\n",
398 | "\n",
399 | "
\n"
400 | ],
401 | "text/latex": [
402 | "A data.frame: 6 × 6\n",
403 | "\\begin{tabular}{r|llllll}\n",
404 | " & agency\\_cd & site\\_no & dateTime & X\\_00060\\_00000 & X\\_00060\\_00000\\_cd & tz\\_cd\\\\\n",
405 | " & & & & & & \\\\\n",
406 | "\\hline\n",
407 | "\t1 & USGS & 01491000 & 2010-01-03 05:00:00 & 389 & A & UTC\\\\\n",
408 | "\t2 & USGS & 01491000 & 2010-01-03 05:15:00 & 386 & A & UTC\\\\\n",
409 | "\t3 & USGS & 01491000 & 2010-01-03 05:30:00 & 386 & A & UTC\\\\\n",
410 | "\t4 & USGS & 01491000 & 2010-01-03 05:45:00 & 382 & A & UTC\\\\\n",
411 | "\t5 & USGS & 01491000 & 2010-01-03 06:00:00 & 382 & A & UTC\\\\\n",
412 | "\t6 & USGS & 01491000 & 2010-01-03 06:15:00 & 379 & A & UTC\\\\\n",
413 | "\\end{tabular}\n"
414 | ],
415 | "text/markdown": [
416 | "\n",
417 | "A data.frame: 6 × 6\n",
418 | "\n",
419 | "| | agency_cd <chr> | site_no <chr> | dateTime <dttm> | X_00060_00000 <dbl> | X_00060_00000_cd <chr> | tz_cd <chr> |\n",
420 | "|---|---|---|---|---|---|---|\n",
421 | "| 1 | USGS | 01491000 | 2010-01-03 05:00:00 | 389 | A | UTC |\n",
422 | "| 2 | USGS | 01491000 | 2010-01-03 05:15:00 | 386 | A | UTC |\n",
423 | "| 3 | USGS | 01491000 | 2010-01-03 05:30:00 | 386 | A | UTC |\n",
424 | "| 4 | USGS | 01491000 | 2010-01-03 05:45:00 | 382 | A | UTC |\n",
425 | "| 5 | USGS | 01491000 | 2010-01-03 06:00:00 | 382 | A | UTC |\n",
426 | "| 6 | USGS | 01491000 | 2010-01-03 06:15:00 | 379 | A | UTC |\n",
427 | "\n"
428 | ],
429 | "text/plain": [
430 | " agency_cd site_no dateTime X_00060_00000 X_00060_00000_cd tz_cd\n",
431 | "1 USGS 01491000 2010-01-03 05:00:00 389 A UTC \n",
432 | "2 USGS 01491000 2010-01-03 05:15:00 386 A UTC \n",
433 | "3 USGS 01491000 2010-01-03 05:30:00 386 A UTC \n",
434 | "4 USGS 01491000 2010-01-03 05:45:00 382 A UTC \n",
435 | "5 USGS 01491000 2010-01-03 06:00:00 382 A UTC \n",
436 | "6 USGS 01491000 2010-01-03 06:15:00 379 A UTC "
437 | ]
438 | },
439 | "metadata": {},
440 | "output_type": "display_data"
441 | }
442 | ],
443 | "source": [
444 | "head(pheasant)"
445 | ]
446 | },
447 | {
448 | "cell_type": "markdown",
449 | "metadata": {},
450 | "source": [
451 | "可以注意到每天的数据并不是从0点开始的,也不是到0点结束的,因为美国各地时区不同,为了统一,在日期表示上,统一采用了UTC时间,而上例中的 Choptank River near Greensboro, MD 时区是美东时区,当地早上5点是UTC的0点。所以当输入是UTC 0点时候,就是从当地5点开始计算的。因此,日均值也是基于当地时间的。"
452 | ]
453 | },
454 | {
455 | "cell_type": "markdown",
456 | "metadata": {},
457 | "source": [
458 | "做一些简单的统计,可以看看summary。"
459 | ]
460 | },
461 | {
462 | "cell_type": "code",
463 | "execution_count": 9,
464 | "metadata": {},
465 | "outputs": [
466 | {
467 | "data": {
468 | "text/plain": [
469 | " agency_cd site_no dateTime \n",
470 | " Length:96 Length:96 Min. :2010-01-03 05:00:00 \n",
471 | " Class :character Class :character 1st Qu.:2010-01-03 10:56:15 \n",
472 | " Mode :character Mode :character Median :2010-01-03 16:52:30 \n",
473 | " Mean :2010-01-03 16:52:30 \n",
474 | " 3rd Qu.:2010-01-03 22:48:45 \n",
475 | " Max. :2010-01-04 04:45:00 \n",
476 | " X_00060_00000 X_00060_00000_cd tz_cd \n",
477 | " Min. :307.0 Length:96 Length:96 \n",
478 | " 1st Qu.:313.0 Class :character Class :character \n",
479 | " Median :320.5 Mode :character Mode :character \n",
480 | " Mean :334.3 \n",
481 | " 3rd Qu.:356.8 \n",
482 | " Max. :389.0 "
483 | ]
484 | },
485 | "metadata": {},
486 | "output_type": "display_data"
487 | }
488 | ],
489 | "source": [
490 | "summary(pheasant)"
491 | ]
492 | },
493 | {
494 | "cell_type": "code",
495 | "execution_count": null,
496 | "metadata": {},
497 | "outputs": [],
498 | "source": []
499 | }
500 | ],
501 | "metadata": {
502 | "kernelspec": {
503 | "display_name": "R",
504 | "language": "R",
505 | "name": "ir"
506 | },
507 | "language_info": {
508 | "codemirror_mode": "r",
509 | "file_extension": ".r",
510 | "mimetype": "text/x-r-source",
511 | "name": "R",
512 | "pygments_lexer": "r",
513 | "version": "4.1.2"
514 | }
515 | },
516 | "nbformat": 4,
517 | "nbformat_minor": 4
518 | }
519 |
--------------------------------------------------------------------------------
/1-basic-envir/pictures/Picture2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/Picture2.png
--------------------------------------------------------------------------------
/1-basic-envir/pictures/Picture3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/Picture3.png
--------------------------------------------------------------------------------
/1-basic-envir/pictures/QQ截图20211019102557.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/QQ截图20211019102557.jpg
--------------------------------------------------------------------------------
/1-basic-envir/pictures/QQ截图20211026164025.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/QQ截图20211026164025.png
--------------------------------------------------------------------------------
/1-basic-envir/pictures/QQ截图20211026165042.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/QQ截图20211026165042.png
--------------------------------------------------------------------------------
/1-basic-envir/pictures/QQ截图20211026171908.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/QQ截图20211026171908.png
--------------------------------------------------------------------------------
/1-basic-envir/pictures/QQ截图20211026172108.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/QQ截图20211026172108.png
--------------------------------------------------------------------------------
/1-basic-envir/pictures/QQ截图20211026172637.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/QQ截图20211026172637.png
--------------------------------------------------------------------------------
/1-basic-envir/pictures/QQ截图20211026172826.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/QQ截图20211026172826.png
--------------------------------------------------------------------------------
/1-basic-envir/pictures/QQ截图20211026175505.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/QQ截图20211026175505.png
--------------------------------------------------------------------------------
/1-basic-envir/pictures/QQ截图20211026210552.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/QQ截图20211026210552.png
--------------------------------------------------------------------------------
/1-basic-envir/pictures/QQ截图20211026211810.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/QQ截图20211026211810.png
--------------------------------------------------------------------------------
/1-basic-envir/pictures/QQ截图20211026221536.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/QQ截图20211026221536.png
--------------------------------------------------------------------------------
/1-basic-envir/pictures/QQ截图20211026231602.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/QQ截图20211026231602.png
--------------------------------------------------------------------------------
/1-basic-envir/pictures/debug-configurations.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/debug-configurations.png
--------------------------------------------------------------------------------
/1-basic-envir/pictures/state_of_packaging.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/state_of_packaging.jpg
--------------------------------------------------------------------------------
/1-basic-envir/pictures/v2-313da6d32657e11ae7d6ed5085ddb9fd_720w.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/v2-313da6d32657e11ae7d6ed5085ddb9fd_720w.jpg
--------------------------------------------------------------------------------
/1-basic-envir/pictures/v2-a3f8d44a12dc669abcb3da415940c2fc_720w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/v2-a3f8d44a12dc669abcb3da415940c2fc_720w.png
--------------------------------------------------------------------------------
/1-basic-envir/pictures/v2-b5ed4693aebbb3ed1180deae916e9130_b.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/v2-b5ed4693aebbb3ed1180deae916e9130_b.gif
--------------------------------------------------------------------------------
/1-basic-envir/pictures/v2-ba3030b67beda785f9235eb7f41f9291_720w.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/v2-ba3030b67beda785f9235eb7f41f9291_720w.jpg
--------------------------------------------------------------------------------
/1-basic-envir/pictures/v2-e9e0fe4205328b055ffd8a02207efb54_b.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/v2-e9e0fe4205328b055ffd8a02207efb54_b.gif
--------------------------------------------------------------------------------
/1-basic-envir/pictures/vscode-ubuntu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/vscode-ubuntu.png
--------------------------------------------------------------------------------
/1-basic-envir/pictures/workflow.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-basic-envir/pictures/workflow.png
--------------------------------------------------------------------------------
/1-basic-envir/readme.md:
--------------------------------------------------------------------------------
1 | # 开始前的准备
2 |
3 | 个人学习python的原因可以归纳为以下几点:
4 |
5 | - 人工智能算法最常用语言
6 | - 常用基本科学计算,数据分析,GIS,地球科学等水文水资源相关学科计算库丰富
7 | - 上手快等
8 |
9 | 主要目的是为了快速实现科学计算。关于 Open Reproducible Science 可以参考[What Is Open Reproducible Science](https://www.earthdatascience.org/courses/intro-to-earth-data-science/open-reproducible-science/get-started-open-reproducible-science/),这里贴个图。
10 |
11 | 
12 |
13 | 说明:本项目大部分内容是在windows 10下jupyter lab(稍后介绍)下完成的,有一部分提到的内容是在Ubuntu18.04下实践的,会有专门说明。另外,windows下推荐使用windows终端:https://www.zhihu.com/question/323284458 。
14 |
15 | 不过在开始正式了解python前,我们需要先做好一些准备,包括常用工具的安装使用(1-get-started),python环境的构建(2-python-envir)等,更多高级内容到后续自己开始制作python工具(本repo第七章)了再说。此外,本文件夹下还包括了一点python和其他工具(R、Matlab、Google Cloud等)一起使用的方法,有需要的可以了解下。
16 |
--------------------------------------------------------------------------------
/1-basic-envir/triarea.m:
--------------------------------------------------------------------------------
1 | function a = triarea(b,h)
2 | a = 0.5*(b.* h);
--------------------------------------------------------------------------------
/1-learn-python/data.json:
--------------------------------------------------------------------------------
1 | {"name": "ACME", "shares": 100, "price": 542.23}
--------------------------------------------------------------------------------
/1-learn-python/dump.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/dump.txt
--------------------------------------------------------------------------------
/1-learn-python/globalLog.py:
--------------------------------------------------------------------------------
1 | import logging
2 |
3 |
4 | def get_hydro_logger(log_level_param):
5 | logger = logging.getLogger(__name__)
6 | # StreamHandler
7 | stream_handler = logging.StreamHandler() # console stream output
8 | stream_handler.setLevel(level=log_level_param)
9 | logger.addHandler(stream_handler)
10 | return logger
11 |
12 |
13 | log_level = logging.INFO
14 | hydro_logger = get_hydro_logger(log_level)
15 |
--------------------------------------------------------------------------------
/1-learn-python/mydict.py:
--------------------------------------------------------------------------------
1 | import unittest
2 |
3 |
4 | class Dict(dict):
5 | def __init__(self, **kw):
6 | super().__init__(**kw)
7 |
8 | def __getattr__(self, key):
9 | try:
10 | return self[key]
11 | except KeyError:
12 | raise AttributeError(r"'Dict' object has no attribute '%s'" % key)
13 |
14 | def __setattr__(self, key, value):
15 | self[key] = value
16 |
--------------------------------------------------------------------------------
/1-learn-python/mydict2.py:
--------------------------------------------------------------------------------
1 | # mydict2.py
2 | class Dict(dict):
3 | """
4 | Simple dict but also support access as x.y style.
5 |
6 | >>> d1 = Dict()
7 | >>> d1['x'] = 100
8 | >>> d1.x
9 | 100
10 | >>> d1.y = 200
11 | >>> d1['y']
12 | 200
13 | >>> d2 = Dict(a=1, b=2, c='3')
14 | >>> d2.c
15 | '3'
16 | >>> d2['empty']
17 | Traceback (most recent call last):
18 | ...
19 | KeyError: 'empty'
20 | >>> d2.empty
21 | Traceback (most recent call last):
22 | ...
23 | AttributeError: 'Dict' object has no attribute 'empty'
24 | """
25 |
26 | def __init__(self, **kw):
27 | super(Dict, self).__init__(**kw)
28 |
29 | def __getattr__(self, key):
30 | try:
31 | return self[key]
32 | except KeyError:
33 | raise AttributeError(r"'Dict' object has no attribute '%s'" % key)
34 |
35 | def __setattr__(self, key, value):
36 | self[key] = value
37 |
38 |
39 | if __name__ == "__main__":
40 | import doctest
41 |
42 | doctest.testmod()
43 |
--------------------------------------------------------------------------------
/1-learn-python/mydict_test.py:
--------------------------------------------------------------------------------
1 | import unittest
2 |
3 | from mydict import Dict
4 |
5 |
6 | class TestDict(unittest.TestCase):
7 | def test_init(self):
8 | d = Dict(a=1, b="test")
9 | self.assertEqual(d.a, 1)
10 | self.assertEqual(d.b, "test")
11 | self.assertTrue(isinstance(d, dict))
12 |
13 | def test_key(self):
14 | d = Dict()
15 | d["key"] = "value"
16 | self.assertEqual(d.key, "value")
17 |
18 | def test_attr(self):
19 | d = Dict()
20 | d.key = "value"
21 | self.assertTrue("key" in d)
22 | self.assertEqual(d["key"], "value")
23 |
24 | def test_keyerror(self):
25 | d = Dict()
26 | with self.assertRaises(KeyError):
27 | value = d["empty"]
28 |
29 | def test_attrerror(self):
30 | d = Dict()
31 | with self.assertRaises(AttributeError):
32 | value = d.empty
33 |
34 |
35 | if __name__ == "__main__":
36 | unittest.main()
37 |
--------------------------------------------------------------------------------
/1-learn-python/pictures/1489720930-5882-BO4qO.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/1489720930-5882-BO4qO.png
--------------------------------------------------------------------------------
/1-learn-python/pictures/1489720930-6827-Vtk4m.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/1489720930-6827-Vtk4m.png
--------------------------------------------------------------------------------
/1-learn-python/pictures/1489720931-7116-4AQC6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/1489720931-7116-4AQC6.png
--------------------------------------------------------------------------------
/1-learn-python/pictures/1_RKPXdVaqHRzmQ5RPBH_d-g.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/1_RKPXdVaqHRzmQ5RPBH_d-g.png
--------------------------------------------------------------------------------
/1-learn-python/pictures/1_V5N9gJdnToIrgAgVJTtl_w.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/1_V5N9gJdnToIrgAgVJTtl_w.png
--------------------------------------------------------------------------------
/1-learn-python/pictures/6056x8a7rwk1hv9h4oot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/6056x8a7rwk1hv9h4oot.png
--------------------------------------------------------------------------------
/1-learn-python/pictures/QQ截图20210106180304.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/QQ截图20210106180304.png
--------------------------------------------------------------------------------
/1-learn-python/pictures/QQ截图20211019104157.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/QQ截图20211019104157.jpg
--------------------------------------------------------------------------------
/1-learn-python/pictures/QQ截图20211026160107.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/QQ截图20211026160107.png
--------------------------------------------------------------------------------
/1-learn-python/pictures/QQ截图20211124230028.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/QQ截图20211124230028.png
--------------------------------------------------------------------------------
/1-learn-python/pictures/blur.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/blur.jpg
--------------------------------------------------------------------------------
/1-learn-python/pictures/class-chain.5cb031a299fe.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/class-chain.5cb031a299fe.png
--------------------------------------------------------------------------------
/1-learn-python/pictures/comparison.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/comparison.png
--------------------------------------------------------------------------------
/1-learn-python/pictures/pkg1.9af1c7aea48f.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/pkg1.9af1c7aea48f.png
--------------------------------------------------------------------------------
/1-learn-python/pictures/res1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/res1.jpg
--------------------------------------------------------------------------------
/1-learn-python/pictures/res2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/res2.jpg
--------------------------------------------------------------------------------
/1-learn-python/pictures/test.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/test.jpg
--------------------------------------------------------------------------------
/1-learn-python/pictures/thumbnail.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/1-learn-python/pictures/thumbnail.jpg
--------------------------------------------------------------------------------
/1-learn-python/pkg/__init__.py:
--------------------------------------------------------------------------------
1 | A = ["quux", "corge", "grault"]
2 |
--------------------------------------------------------------------------------
/1-learn-python/pkg/mod1.py:
--------------------------------------------------------------------------------
1 | def foo():
2 | print("[mod1] foo()")
3 |
4 |
5 | class Foo:
6 | pass
7 |
--------------------------------------------------------------------------------
/1-learn-python/pkg/mod2.py:
--------------------------------------------------------------------------------
1 | def bar():
2 | print("[mod2] bar()")
3 |
4 |
5 | class Bar:
6 | pass
7 |
--------------------------------------------------------------------------------
/1-learn-python/readme.md:
--------------------------------------------------------------------------------
1 | # Python 基础
2 |
3 | Python基础有很多内容,作为非CS专业的想快速上手的同学,没必要完全从头到尾学习,不过把握基本内容还是需要一定的系统性。
4 |
5 | 这部分结构主要参考了[Python programming guide for Earth Scientists](http://python.hydrology-amsterdam.nl/manuals/hydro_python_manual.pdf)。
6 |
7 | 内容上参考了
8 |
9 | 剩下的内容安排思路是这样的:
10 |
11 | 1. 熟悉基本的语法:变量常量、数据类型、运算、循环for/while、条件if、函数等,这部分在 [1-python-basic](https://github.com/iHeadWater/hydrus/blob/master/1-learn-python/1-python-basic.ipynb)中;
12 | 2. 面向对象编程以及python中重要的函数式编程,还有就是模块与包,异常,调试,python文档等概念性的内容,这部分放在 [2-python-concept](https://github.com/iHeadWater/hydrus/blob/master/1-learn-python/2-python-concept.ipynb) 中;
13 | 3. 熟悉python的内置库,基础库的使用,这部分放在[3-python-library](https://github.com/iHeadWater/hydrus/blob/master/1-learn-python/3-python-library.ipynb)中;
14 | 4. 一些特别语法补充,放在[4-python-magic](https://github.com/iHeadWater/hydrus/blob/master/1-learn-python/4-python-magic.ipynb)中,刚接触python的话,到这基本就够了
15 |
--------------------------------------------------------------------------------
/1-learn-python/simple.py:
--------------------------------------------------------------------------------
1 | def simple_function():
2 | return "You have called simple_function"
3 |
4 |
5 | class SimpleClass(object):
6 | def explode(self):
7 | return "KABOOM!"
8 |
--------------------------------------------------------------------------------
/1-learn-python/test.txt:
--------------------------------------------------------------------------------
1 | Hello, world!
2 | Hello, Owen!
--------------------------------------------------------------------------------
/1-learn-python/test/test1.txt:
--------------------------------------------------------------------------------
1 | Hello, world!
2 | Hello, Owen!
--------------------------------------------------------------------------------
/2-numpy-examples/123.npy:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-numpy-examples/123.npy
--------------------------------------------------------------------------------
/2-numpy-examples/123.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-numpy-examples/123.npz
--------------------------------------------------------------------------------
/2-numpy-examples/170px-Row_and_column_major_order.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-numpy-examples/170px-Row_and_column_major_order.png
--------------------------------------------------------------------------------
/2-numpy-examples/readme.md:
--------------------------------------------------------------------------------
1 | # python科学计算库简介
2 |
3 | Python语言之所以如此风靡,一个重要原因是基于它有不少良好的科学计算库,常见的几个库有:numpy、pandas、scipy 等。接下来本repo的第二部分就简要地记录下在水文水资源计算中常用到的这些库的功能。
4 |
5 | 这些库并不是孤立的,所以接下来首先看看这些库之间的关系,为后面的记录提纲挈领。可以参考:[Python numpy,scipy,pandas这些库的区别是什么?](https://www.zhihu.com/question/38353562),[sklearn库的学习](https://blog.csdn.net/u014248127/article/details/78885180)
6 |
7 | 首先看一张图。
8 |
9 | 
10 |
11 | matplotlib 是绘图库,后面本repo第三部分会介绍;scikit-learn是机器学习库,在后面算法示例部分介绍。除python外的剩下的就是几个常用基础库了。简单总结下:
12 |
13 | - numpy:以矩阵为基础的数学计算模块,可用来存储和处理大型矩阵,比 Python 自身的嵌套列表(nested list structure)结构要高效的多 -- N维数组容器
14 | - pandas:基于 NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,比如DataFrame的数据结构,提供了高效地操作大型数据集所需的工具 -- 表格容器
15 | - scipy:一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题 -- 科学计算函数库
16 |
17 | 另外,xarray也是一个常用的科学计算基础库,它能够方便读取netcdf等格式数据,有强大的处理大数据的能力。
18 |
19 | 接下来就不定期记录日常对这几个库的使用。
20 |
--------------------------------------------------------------------------------
/2-numpy-examples/test/test.out:
--------------------------------------------------------------------------------
1 | 1.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00
2 | 1.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00
3 |
--------------------------------------------------------------------------------
/2-numpy-examples/test/test1.out:
--------------------------------------------------------------------------------
1 | 1.0000e+00 1.0000e+00 1.0000e+00
2 | 1.0000e+00 1.0000e+00 1.0000e+00
3 |
--------------------------------------------------------------------------------
/2-numpy-examples/test/test2.out:
--------------------------------------------------------------------------------
1 | 1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
2 | 1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
3 |
--------------------------------------------------------------------------------
/2-numpy-examples/test/test3.out:
--------------------------------------------------------------------------------
1 | 1.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00a1.000000000000000000e+00 1.000000000000000000e+00 1.000000000000000000e+00a
--------------------------------------------------------------------------------
/2-numpy-examples/test/test4.out:
--------------------------------------------------------------------------------
1 | 1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00a1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00a
--------------------------------------------------------------------------------
/2-numpy-examples/test/test5.out:
--------------------------------------------------------------------------------
1 | # abc
2 | 1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
3 | 1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
4 |
--------------------------------------------------------------------------------
/2-numpy-examples/test/test6.out:
--------------------------------------------------------------------------------
1 | 1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
2 | 1.000000000000000000e+00,1.000000000000000000e+00,1.000000000000000000e+00
3 | # abc
4 |
--------------------------------------------------------------------------------
/2-numpy-examples/v2-4e4ce4ad47c1409e837b0182b39f84e3_r.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-numpy-examples/v2-4e4ce4ad47c1409e837b0182b39f84e3_r.jpg
--------------------------------------------------------------------------------
/2-pandas-examples/AK_U.xlsx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-pandas-examples/AK_U.xlsx
--------------------------------------------------------------------------------
/2-pandas-examples/Sheet1.csv:
--------------------------------------------------------------------------------
1 | 旬流量 单位:m3/s
2 | 旬平均,1970,1971,1972,1973,1974,1975,1976
3 | 1月上旬,946,958,1030,900,861,1060,975
4 | 1月中旬,895,908,969,895,885,1030,890
5 | 1月下旬,891,947,891,916,868,958,885
6 | 2月上旬,887,1050,933,885,993,967,914
7 | 2月中旬,919,1060,991,926,927,1030,909
8 | 2月下旬,1060,1150,1120,967,1100,1150,1090
9 | 3月上旬,1040,1150,967,949,937,1260,974
10 | 3月中旬,1160,1260,1230,961,980,1340,1130
11 | 3月下旬,1210,1110,1170,973,1080,1300,1100
12 | 4月上旬,1410,1180,1330,1350,1730,1500,1420
13 | 4月中旬,1770,1370,1500,1440,1840,1330,1790
14 | 4月下旬,1700,1330,1870,1160,1740,1390,1610
15 | 5月上旬,2510,2030,2020,2230,2410,2180,2290
16 | 5月中旬,4460,1870,2350,2680,2510,2440,2100
17 | 5月下旬,2720,2690,2950,2670,2860,2480,3240
18 | 6月上旬,3030,3400,3030,3590,2700,2380,3560
19 | 6月中旬,2300,3610,3250,6400,3280,3760,3470
20 | 6月下旬,2860,5380,4390,6100,5320,4150,5040
21 | 7月上旬,5010,4450,4810,7680,5430,5120,5920
22 | 7月中旬,5360,4990,5390,6130,4150,4670,6560
23 | 7月下旬,7090,3840,8030,3490,6650,9660,4330
24 | 8月上旬,6830,3460,3710,3920,5270,5710,4870
25 | 8月中旬,5750,7080,1910,3020,5180,6370,4170
26 | 8月下旬,4030,3760,3300,4910,6160,2990,6900
27 | 9月上旬,2620,2510,2330,3060,5130,7670,4520
28 | 9月中旬,2380,2990,2280,4500,5300,4840,4220
29 | 9月下旬,2760,3580,2120,2790,4960,3480,5060
30 | 10月上旬,2510,3710,1760,2260,2510,3460,2880
31 | 10月中旬,2620,3790,2110,2640,2780,4270,4550
32 | 10月下旬,2060,3390,1990,2470,2570,3270,3670
33 | 11月上旬,1780,2120,1280,1910,1990,2580,2070
34 | 11月中旬,1630,1820,1410,1480,1920,2440,1920
35 | 11月下旬,1400,1470,1210,1280,1530,1680,1450
36 | 12月上旬,1220,1210,1070,1130,1390,1380,1190
37 | 12月中旬,1150,1180,993,1160,1260,1310,1050
38 | 12月下旬,1050,1060,917,913,1060,1070,1110
39 |
--------------------------------------------------------------------------------
/2-pandas-examples/TMaxMon.csv:
--------------------------------------------------------------------------------
1 | TMax Stations (Long-term monthly averages),,,,,,,,,,,,,,
2 | Met Node ID,Met Node Name,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec
3 | 11120301,HUC 11120301 TMax,10.16,12.86,17.22,22.94,26.93,31.4,33.96,33.25,29.21,23.72,16.25,11.29
4 | 11120201,HUC 11120201 TMax,10.81,13.36,17.56,23.17,27.43,31.99,34.69,33.88,29.57,24.1,16.7,11.94
5 | 11120202,HUC 11120202 TMax,11.45,14.05,18.72,24.46,28.38,33.16,35.67,34.95,30.52,24.98,17.54,12.55
6 | 11130101,HUC 11130101 TMax,11.98,15.09,19.92,25.5,29.61,34.41,36.71,36.09,31.48,25.68,17.96,12.94
7 | 11120202,HUC 11120202 TMax,11.71,14.86,19.64,25.13,29.3,33.94,36.44,35.72,31.22,25.76,17.99,12.75
8 | 11120304,HUC 11120304 TMax,11.42,14.72,19.58,25.16,29.22,33.86,36.47,35.81,31.33,25.67,17.71,12.45
9 | 11120302,HUC 11120302 TMax,10.69,13.6,18.0,23.64,27.69,32.47,35.23,34.59,30.27,24.51,16.85,11.71
10 | 11120303,HUC 11120303 TMax,11.34,14.53,19.22,24.64,28.91,33.78,36.19,35.37,30.91,25.35,17.68,12.64
11 |
--------------------------------------------------------------------------------
/2-pandas-examples/attr_temp99%_days_99sites.feather:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-pandas-examples/attr_temp99%_days_99sites.feather
--------------------------------------------------------------------------------
/2-pandas-examples/readme.md:
--------------------------------------------------------------------------------
1 | # Pandas
2 |
3 | 可以认为 Numpy和Scipy 是用来具体执行运算过程的,而 Pandas 则是更直接和人交互的,便于分析的工具,所以它会更多地提供一些诸如行列索引,快速统计,快捷可视化等工具。
4 |
5 | 先了解 Pandas 的 Series 和 DataFrame,然后再在实践中慢慢了解需要的函数即可。
6 |
--------------------------------------------------------------------------------
/2-pandas-examples/test-comment.csv:
--------------------------------------------------------------------------------
1 | # 我是注释行
2 | col1,col2,col3
3 | A,2,0
4 | A,1,1
5 | B,9,9
6 | ,8,4
7 | D,7,2
8 | C,4,3
9 |
--------------------------------------------------------------------------------
/2-pandas-examples/test.csv:
--------------------------------------------------------------------------------
1 | col1,col2,col3
2 | A,2,0
3 | A,1,1
4 | B,9,9
5 | ,8,4
6 | D,7,2
7 | C,4,3
8 |
--------------------------------------------------------------------------------
/2-pandas-examples/test.json:
--------------------------------------------------------------------------------
1 | {
2 | "01011000": "H",
3 | "01013500": "F",
4 | "01015800": "C",
5 | "01017000": "C",
6 | "01019000": "H",
7 | "01139000": "R",
8 | "01144000": "HRS"
9 | }
--------------------------------------------------------------------------------
/2-scipy-example/readme.md:
--------------------------------------------------------------------------------
1 | # Scipy
2 |
3 | Scipy 是python下的基础科学计算库,内容可以参考[这篇文章](https://www.nature.com/articles/s41592-019-0686-2?es_p=11046330)。
4 |
5 | 目前本文件夹下主要积累记录一些常用的简单功能函数。
6 |
--------------------------------------------------------------------------------
/2-xarray-example/gallery-data/14303200/14303200_1990_nomask.nc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-xarray-example/gallery-data/14303200/14303200_1990_nomask.nc
--------------------------------------------------------------------------------
/2-xarray-example/gallery-data/14303200/14303200_1991_nomask.nc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-xarray-example/gallery-data/14303200/14303200_1991_nomask.nc
--------------------------------------------------------------------------------
/2-xarray-example/gallery-data/14303200/14303200_1995_nomask.nc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-xarray-example/gallery-data/14303200/14303200_1995_nomask.nc
--------------------------------------------------------------------------------
/2-xarray-example/gallery-data/14303200/14303200_1996_nomask.nc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-xarray-example/gallery-data/14303200/14303200_1996_nomask.nc
--------------------------------------------------------------------------------
/2-xarray-example/gallery-data/14303200/14303200_1997_nomask.nc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-xarray-example/gallery-data/14303200/14303200_1997_nomask.nc
--------------------------------------------------------------------------------
/2-xarray-example/gallery-data/14306340/14306340_1990_nomask.nc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-xarray-example/gallery-data/14306340/14306340_1990_nomask.nc
--------------------------------------------------------------------------------
/2-xarray-example/gallery-data/14306340/14306340_1991_nomask.nc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-xarray-example/gallery-data/14306340/14306340_1991_nomask.nc
--------------------------------------------------------------------------------
/2-xarray-example/gallery-data/14306340/14306340_1995_nomask.nc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-xarray-example/gallery-data/14306340/14306340_1995_nomask.nc
--------------------------------------------------------------------------------
/2-xarray-example/gallery-data/14306340/14306340_1996_nomask.nc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-xarray-example/gallery-data/14306340/14306340_1996_nomask.nc
--------------------------------------------------------------------------------
/2-xarray-example/gallery-data/14306340/14306340_1997_nomask.nc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-xarray-example/gallery-data/14306340/14306340_1997_nomask.nc
--------------------------------------------------------------------------------
/2-xarray-example/pictures/dataset-diagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-xarray-example/pictures/dataset-diagram.png
--------------------------------------------------------------------------------
/2-xarray-example/readme.md:
--------------------------------------------------------------------------------
1 | # xarray
2 |
3 | 从numpy和pandas过来的时候可以认为xarray是结合了numpy多维数据和pandas标记的一个工具;更直接地,可以认为是 [netcdf 数据](https://github.com/OuyangWenyu/aqualord/blob/master/DataFormat/netcdf.ipynb)在python中的镜像表达。
4 |
5 | 网站在[这里](https://xarray.pydata.org/en/stable/)。
6 |
--------------------------------------------------------------------------------
/2-xarray-example/saved_on_disk.nc:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/2-xarray-example/saved_on_disk.nc
--------------------------------------------------------------------------------
/3-basic-pyviz/1-matplotlib-intro/axes-in-matplotlib.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-basic-pyviz/1-matplotlib-intro/axes-in-matplotlib.png
--------------------------------------------------------------------------------
/3-basic-pyviz/1-matplotlib-intro/datasets/exams.csv:
--------------------------------------------------------------------------------
1 | "gender","race/ethnicity","parental level of education","lunch","test preparation course","math score","reading score","writing score"
2 | "male","group C","some high school","free/reduced","none","69","61","58"
3 | "female","group C","some college","free/reduced","completed","47","65","69"
4 | "male","group A","high school","standard","none","66","52","53"
5 | "male","group B","some college","standard","none","88","89","82"
6 | "female","group C","master's degree","free/reduced","none","62","82","76"
7 | "female","group B","some high school","free/reduced","none","47","69","60"
8 | "female","group D","associate's degree","standard","none","71","66","74"
9 | "female","group A","bachelor's degree","standard","none","57","62","60"
10 | "male","group D","associate's degree","free/reduced","none","60","67","65"
11 | "female","group D","some high school","standard","none","74","72","76"
12 | "male","group C","high school","free/reduced","none","77","71","67"
13 | "female","group C","some high school","standard","completed","69","79","83"
14 | "male","group C","some college","free/reduced","none","65","62","56"
15 | "male","group B","high school","free/reduced","none","55","58","51"
16 | "female","group C","some high school","free/reduced","completed","78","88","91"
17 | "female","group C","some high school","standard","none","70","72","72"
18 | "female","group E","high school","standard","none","55","69","55"
19 | "male","group D","some high school","free/reduced","completed","68","68","62"
20 | "male","group C","master's degree","standard","none","73","62","58"
21 | "male","group D","some college","free/reduced","none","54","50","51"
22 | "female","group E","some high school","free/reduced","none","81","76","77"
23 | "male","group C","some high school","free/reduced","none","70","76","73"
24 | "male","group C","high school","standard","none","64","62","63"
25 | "female","group D","master's degree","free/reduced","none","51","66","63"
26 | "male","group D","some college","free/reduced","none","49","50","43"
27 | "female","group C","some high school","standard","none","83","80","82"
28 | "male","group A","master's degree","standard","none","86","92","81"
29 | "female","group C","master's degree","standard","completed","83","89","94"
30 | "male","group C","bachelor's degree","free/reduced","completed","61","77","68"
31 | "male","group D","high school","standard","none","55","50","44"
32 | "female","group C","associate's degree","standard","none","56","59","55"
33 | "female","group C","bachelor's degree","standard","none","46","57","61"
34 | "male","group E","some high school","free/reduced","completed","68","60","52"
35 | "male","group E","some high school","standard","none","78","75","69"
36 | "female","group B","some high school","standard","completed","85","94","93"
37 | "female","group E","associate's degree","standard","none","95","99","95"
38 | "male","group B","associate's degree","standard","completed","82","74","78"
39 | "male","group C","associate's degree","standard","completed","94","85","96"
40 | "female","group C","high school","standard","none","64","71","68"
41 | "female","group C","associate's degree","free/reduced","completed","70","80","85"
42 | "female","group C","some high school","standard","completed","84","78","84"
43 | "female","group B","bachelor's degree","standard","none","62","81","73"
44 | "female","group D","some high school","standard","none","52","58","53"
45 | "male","group B","some college","standard","none","89","72","74"
46 | "female","group C","some high school","standard","none","64","63","63"
47 | "male","group D","associate's degree","free/reduced","completed","74","77","72"
48 | "female","group D","some high school","free/reduced","none","50","54","54"
49 | "male","group D","some college","standard","none","86","76","82"
50 | "female","group A","associate's degree","free/reduced","none","53","62","64"
51 | "male","group C","some high school","free/reduced","none","36","35","33"
52 | "female","group C","some college","standard","none","64","81","75"
53 | "male","group C","some college","standard","completed","71","69","74"
54 | "female","group C","associate's degree","standard","none","73","79","77"
55 | "male","group E","associate's degree","free/reduced","none","80","81","72"
56 | "male","group C","some college","free/reduced","none","75","66","67"
57 | "male","group C","master's degree","standard","none","64","57","51"
58 | "female","group D","some high school","standard","none","68","87","77"
59 | "male","group D","associate's degree","free/reduced","none","73","60","65"
60 | "male","group C","some college","standard","none","77","76","69"
61 | "female","group E","high school","standard","none","85","89","85"
62 | "female","group E","some high school","free/reduced","none","77","85","82"
63 | "female","group D","some college","free/reduced","completed","53","70","72"
64 | "male","group C","some high school","free/reduced","none","48","43","42"
65 | "female","group B","bachelor's degree","standard","completed","91","91","100"
66 | "female","group C","master's degree","free/reduced","completed","67","81","85"
67 | "female","group D","bachelor's degree","free/reduced","completed","74","87","88"
68 | "female","group C","high school","standard","completed","70","82","78"
69 | "male","group D","some high school","standard","completed","65","56","58"
70 | "male","group B","bachelor's degree","standard","none","75","67","63"
71 | "male","group B","some college","standard","none","63","56","49"
72 | "female","group D","high school","standard","completed","86","92","94"
73 | "female","group D","some college","standard","none","76","87","85"
74 | "female","group B","some high school","free/reduced","completed","56","62","67"
75 | "female","group A","some college","free/reduced","completed","48","61","64"
76 | "male","group E","high school","free/reduced","none","67","62","60"
77 | "male","group D","some college","free/reduced","completed","80","86","88"
78 | "male","group D","associate's degree","standard","completed","77","73","74"
79 | "male","group C","some high school","standard","completed","51","58","53"
80 | "female","group C","some high school","free/reduced","completed","71","80","84"
81 | "female","group E","some high school","free/reduced","completed","59","67","72"
82 | "male","group D","some high school","free/reduced","none","69","62","57"
83 | "female","group D","high school","standard","none","74","71","71"
84 | "female","group B","master's degree","standard","none","63","68","65"
85 | "male","group C","some high school","free/reduced","none","68","54","50"
86 | "male","group B","some college","standard","completed","69","79","73"
87 | "female","group D","some college","standard","completed","75","86","89"
88 | "male","group B","bachelor's degree","free/reduced","completed","79","81","74"
89 | "male","group D","master's degree","standard","none","51","36","44"
90 | "male","group D","bachelor's degree","free/reduced","none","59","60","56"
91 | "male","group D","some high school","free/reduced","none","49","55","49"
92 | "male","group D","master's degree","standard","none","76","76","69"
93 | "male","group C","associate's degree","standard","completed","75","78","77"
94 | "male","group A","some high school","standard","none","54","45","43"
95 | "female","group B","some high school","free/reduced","completed","45","63","65"
96 | "female","group D","associate's degree","free/reduced","none","75","75","78"
97 | "female","group D","some college","standard","none","56","59","61"
98 | "female","group C","master's degree","standard","none","64","57","62"
99 | "male","group E","master's degree","standard","completed","62","48","38"
100 | "male","group C","high school","free/reduced","none","44","34","36"
101 | "male","group E","bachelor's degree","free/reduced","none","48","48","40"
102 |
--------------------------------------------------------------------------------
/3-basic-pyviz/1-matplotlib-intro/datasets/national_parks.csv:
--------------------------------------------------------------------------------
1 | Year,Badlands,GrandCanyon,BryceCanyon
2 | 1961,833300,1253000,264800
3 | 1962,1044800,1447400,251000
4 | 1963,1074000,1539500,289500
5 | 1964,1079800,1576600,300300
6 | 1965,1091300,1689200,366800
7 | 1966,1094800,1806000,396600
8 | 1967,1188700,1804900,295000
9 | 1968,1194600,1986300,320800
10 | 1969,1221300,2192600,366900
11 | 1970,1303100,2258200,345900
12 | 1971,1282000,2402100,377800
13 | 1972,1274600,2698300,424830
14 | 1973,1387900,1909700,429700
15 | 1974,1205300,1888600,408800
16 | 1975,1153200,2625100,579200
17 | 1976,1210100,2791600,625600
18 | 1977,1305400,2627200,611500
19 | 1978,1234915,2748642,679260
20 | 1979,858000,2131716,558095
21 | 1980,952652,2304973,571541
22 | 1981,1175952,2472270,474092
23 | 1982,1030484,2293127,471517
24 | 1983,1026981,2248082,472633
25 | 1984,1113675,2173584,495104
26 | 1985,950242,2711529,500782
27 | 1986,1025630,3035787,578018
28 | 1987,1174398,3513030,718342
29 | 1988,1110040,3859886,791348
30 | 1989,1237956,3966209,808045
31 | 1990,1326475,3776685,862659
32 | 1991,1518396,3886031,929067
33 | 1992,1205297,4203545,1018174
34 | 1993,1179458,4575602,1107951
35 | 1994,1130459,4364316,1028134
36 | 1995,1075569,4557645,994548
37 | 1996,1024705,4537703,1269600
38 | 1997,970696,4791668,1174824
39 | 1998,1021049,4239682,1166331
40 | 1999,950453,4575124,1081521
41 | 2000,1105824,4460228,1099275
42 | 2001,955469,4104809,1068619
43 | 2002,908898,4001974,886436
44 | 2003,871034,4124900,903760
45 | 2004,936030,4326234,987253
46 | 2005,909146,4401522,1017681
47 | 2006,840118,4279439,890676
48 | 2007,886654,4413668,1012563
49 | 2008,845734,4425314,1043321
50 | 2009,933918,4348068,1216377
51 | 2010,977778,4388386,1285492
52 | 2011,870741,4298178,1296000
53 | 2012,883406,4421352,1385352
54 | 2013,892372,4564840,1311875
55 | 2014,868094,4756771,1435741
56 | 2015,989354,5520736,1745804
57 | 2016,996263,5969811,2365110
58 | 2017,1054325,6254238,2571684
--------------------------------------------------------------------------------
/3-basic-pyviz/1-matplotlib-intro/datasets/stocks.csv:
--------------------------------------------------------------------------------
1 | Date,AAPL,ADBE,CVX,GOOG,IBM,MDLZ,MSFT,NFLX,ORCL,SBUX
2 | 3-Jan-07,11.107141,38.869999,50.777351,251.001007,79.2425,17.519524,24.118483,3.258571,15.696321,15.752188
3 | 1-Feb-07,10.962033,39.25,48.082939,224.949951,74.503204,16.019426,22.092464,3.218571,15.028588,13.930813
4 | 1-Mar-07,12.037377,41.700001,51.900383,229.309311,75.561348,16.009354,21.857189,3.312857,16.583584,14.138198
5 | 2-Apr-07,12.930043,41.560001,54.588032,235.925919,81.93428,16.924608,23.480597,3.167143,17.196436,13.984914
6 | 1-May-07,15.701322,44.060001,57.598267,249.204208,85.786057,17.111704,24.146753,3.128572,17.726965,12.988567
7 | 1-Jun-07,15.811448,40.150002,59.542004,261.611603,84.699646,17.950714,23.186863,2.77,18.028816,11.82992
8 | 2-Jul-07,17.070766,40.290001,60.262959,255.255249,89.04528,16.677612,22.809202,2.461429,17.489143,12.028288
9 | 1-Aug-07,17.941408,42.75,62.469437,257.882874,94.237984,16.326239,22.683865,2.502857,18.5502,12.420514
10 | 4-Sep-07,19.883505,43.66,66.612236,283.918915,95.134415,17.72064,23.260239,2.964286,19.803343,11.811887
11 | 1-Oct-07,24.609837,47.900002,65.138763,353.853851,93.777657,17.1558,29.063457,3.781429,20.27899,12.028288
12 | 1-Nov-07,23.608341,42.139999,62.896679,346.846832,85.243889,17.74118,26.616703,3.3,18.458729,10.545039
13 | 3-Dec-07,25.663155,42.73,66.881027,346.08609,87.610428,16.893877,28.201029,3.802857,20.654018,9.2286
14 | 2-Jan-08,17.53718,34.93,59.657616,282.432434,86.808075,15.154268,25.824539,3.592857,18.797169,8.525297
15 | 1-Feb-08,16.197536,33.650002,62.548466,235.825821,92.631477,16.137976,21.630577,4.511428,17.196436,8.10602
16 | 3-Mar-08,18.591795,35.59,61.610165,220.45546,93.672829,16.194613,22.56896,4.95,17.891611,7.889619
17 | 1-Apr-08,22.536884,37.290001,69.398048,287.432434,98.196198,16.5184,22.680296,4.568572,19.071581,7.317058
18 | 1-May-08,24.454365,44.060001,72.042557,293.193207,105.728958,16.962301,22.604156,4.337143,20.891842,8.200696
19 | 2-Jun-08,21.693451,39.389999,72.028023,263.47348,96.824951,14.996203,21.95764,3.724286,19.208786,7.096149
20 | 1-Jul-08,20.593491,41.349998,61.441433,237.112106,104.544487,16.772554,20.528915,4.412857,19.693579,6.622771
21 | 1-Aug-08,21.96423,42.830002,63.194691,231.876877,99.826286,16.609152,21.868919,4.405715,20.059462,7.014998
22 | 2-Sep-08,14.725739,39.470001,60.383438,200.460464,95.914581,17.407118,21.388107,4.411428,18.577639,6.703922
23 | 1-Oct-08,13.939312,26.639999,54.614506,179.859863,76.241272,15.509609,17.894207,3.537143,16.729939,5.919468
24 | 3-Nov-08,12.006284,23.16,58.343964,146.626633,67.291237,14.462524,16.31312,3.282857,14.717588,4.02596
25 | 1-Dec-08,11.057907,21.290001,54.622238,153.978973,69.402344,14.426944,15.683832,4.27,16.217703,4.264903
26 | 2-Jan-09,11.677202,19.309999,52.074623,169.434433,75.578949,15.071722,13.795963,5.162857,15.394469,4.255886
27 | 2-Feb-09,11.570964,16.700001,45.24324,169.164169,76.305176,12.240067,13.118857,5.177143,14.214501,4.125144
28 | 2-Mar-09,13.6193,21.389999,50.109627,174.204208,80.33477,12.13574,14.922194,6.131429,16.528702,5.008781
29 | 1-Apr-09,16.302477,27.35,49.260059,198.183182,85.57489,12.740076,16.457466,6.472857,17.736351,6.51908
30 | 1-May-09,17.595482,28.18,50.165421,208.823822,88.580597,14.21553,17.07699,5.631429,17.96562,6.487521
31 | 1-Jun-09,18.453167,28.299999,49.849396,211.006012,87.030357,13.952106,19.431309,5.905715,19.643879,6.262104
32 | 1-Jul-09,21.168736,32.419998,52.272266,221.74675,98.290459,15.603894,19.226942,6.277143,20.34465,7.979786
33 | 3-Aug-09,21.793213,31.42,53.152561,231.066071,98.849388,15.6094,20.263988,6.232857,20.11482,8.561364
34 | 1-Sep-09,24.013863,33.040001,53.524948,248.173172,100.155655,14.624016,21.143602,6.595714,19.158724,9.309751
35 | 1-Oct-09,24.421976,32.939999,58.168388,268.328339,100.993011,15.319867,22.795959,7.635714,19.44449,8.556855
36 | 2-Nov-09,25.900249,35.080002,59.830349,291.791779,106.274231,14.796587,24.283903,8.375714,20.347599,9.873295
37 | 1-Dec-09,27.302084,36.779999,59.025352,310.300293,110.10128,15.291499,25.167404,7.87,22.605371,10.396263
38 | 4-Jan-10,24.883207,32.299999,55.29171,265.235229,102.943436,15.561547,23.26829,8.892858,21.293638,9.823703
39 | 1-Feb-10,26.510475,34.650002,55.960209,263.663666,107.433914,15.994751,23.783585,9.435715,22.761847,10.328638
40 | 1-Mar-10,30.446495,35.369999,58.692429,283.843842,108.35482,17.175674,24.297915,10.534286,23.74065,10.941774
41 | 1-Apr-10,33.826706,33.599998,63.034573,263.113098,108.988472,16.81217,25.334867,14.128572,23.934195,11.761223
42 | 3-May-10,33.281258,32.080002,57.709251,243.05806,106.371109,16.24419,21.499313,15.878572,20.881126,11.72048
43 | 1-Jun-10,32.588116,26.43,53.014076,222.697693,104.859528,16.062218,19.174389,15.521428,19.854185,11.000682
44 | 1-Jul-10,33.329193,28.719999,59.537323,242.667664,109.037598,16.756334,21.507647,14.65,21.917953,11.249669
45 | 2-Aug-10,31.495928,27.700001,58.414536,225.235229,105.080406,17.15789,19.662037,17.931429,20.249075,10.457823
46 | 1-Sep-10,36.76252,26.15,63.910614,263.158173,114.476456,17.865786,20.516544,23.165714,24.894123,11.627388
47 | 1-Oct-10,38.994835,28.15,65.132835,307.157166,122.549728,18.682077,22.342844,24.795713,27.289917,12.99719
48 | 1-Nov-10,40.312454,27.799999,64.393883,278.133148,121.259903,17.512638,21.291639,29.414286,25.125671,13.984607
49 | 1-Dec-10,41.79073,30.780001,72.569366,297.282288,125.803062,18.409662,23.525322,25.1,29.073328,14.683837
50 | 3-Jan-11,43.962147,33.049999,75.496002,300.480469,138.866837,17.860468,23.3736,30.582857,29.799183,14.409629
51 | 1-Feb-11,45.76173,34.5,83.130943,307.007019,139.313385,18.602465,22.536688,29.524286,30.608591,15.132679
52 | 1-Mar-11,45.152802,33.16,86.127663,293.673676,140.337509,18.492435,21.52771,33.968571,31.101677,16.95429
53 | 1-Apr-11,45.362682,33.549999,87.690132,272.322327,146.800583,19.807426,21.977087,33.238571,33.515423,16.610157
54 | 2-May-11,45.064697,34.630001,84.710434,264.77478,146.030731,20.621187,21.344511,38.685715,31.893711,16.941166
55 | 1-Jun-11,43.489254,31.450001,83.038986,253.443451,148.295593,20.950609,22.189415,37.527142,30.672764,18.184469
56 | 1-Jul-11,50.590412,27.709999,83.991791,302.147156,157.199371,20.445131,23.38423,37.998573,28.551634,18.460758
57 | 1-Aug-11,49.858402,25.24,80.448547,270.750763,149.253922,20.825727,22.844763,33.572857,26.20812,17.847031
58 | 1-Sep-11,49.403648,24.17,75.361504,257.777771,151.823807,20.13657,21.376169,16.181429,26.833681,17.232414
59 | 3-Oct-11,52.443115,29.41,85.503036,296.616608,160.297546,21.096024,22.870525,11.725715,30.657543,19.575357
60 | 1-Nov-11,49.517658,27.42,84.349571,299.994995,163.879547,21.677694,22.134188,9.218572,29.329081,20.171509
61 | 1-Dec-11,52.471619,28.27,87.286469,323.273285,160.288147,22.57695,22.462999,9.898571,23.996521,21.345242
62 | 3-Jan-12,59.141342,30.950001,84.595688,290.345337,167.889374,23.144999,25.552095,17.171429,26.450426,22.23134
63 | 1-Feb-12,70.27829,32.889999,90.203979,309.434448,172.157288,23.006008,27.645195,15.818571,27.425556,22.607792
64 | 1-Mar-12,77.677429,34.310001,88.625076,320.940948,182.588409,23.144722,28.098108,16.434286,27.341171,26.020376
65 | 2-Apr-12,75.660187,33.549999,88.087753,302.727722,181.214523,24.277296,27.889072,11.448571,27.622269,26.70941
66 | 1-May-12,74.850441,31.049999,81.999306,290.720734,169.512848,23.30304,25.591,9.062857,24.869436,25.633244
67 | 1-Jun-12,75.662781,32.369999,87.996414,290.325317,171.86792,23.698162,26.818386,9.784286,27.904129,24.900064
68 | 2-Jul-12,79.129791,30.879999,91.399498,316.801788,172.219421,24.367012,25.836475,8.121428,28.432621,21.145441
69 | 1-Aug-12,86.558243,31.27,94.300392,342.887878,171.957504,25.471535,27.199026,8.531428,29.797762,23.257565
70 | 4-Sep-12,86.800262,32.439999,97.999763,377.627625,183.077148,25.558983,26.263563,7.777143,29.618881,23.773252
71 | 1-Oct-12,77.460548,34.029999,92.686119,340.490479,171.675095,24.616072,25.186899,11.32,29.318512,21.518288
72 | 1-Nov-12,76.502007,34.610001,89.626816,349.534546,168.473206,24.004147,23.685518,11.672857,30.356169,24.418251
73 | 3-Dec-12,69.55999,37.68,91.704453,354.044037,169.785034,23.717634,23.765596,13.227143,31.607483,25.246786
74 | 2-Jan-13,59.537144,37.830002,97.649048,378.223236,179.996063,25.898352,24.424023,23.605715,33.684925,26.418974
75 | 1-Feb-13,58.031689,39.310001,100.11853,401.001007,178.759872,25.758562,24.940231,26.868572,32.480202,25.918148
76 | 1-Mar-13,58.197346,43.52,101.545738,397.492493,189.859497,28.78278,25.666908,27.040001,30.668367,26.910458
77 | 1-Apr-13,58.21312,45.080002,104.271973,412.697693,180.281952,29.562979,29.695024,30.867144,31.095236,28.74859
78 | 1-May-13,59.518211,42.91,105.750397,436.046051,186.027618,27.711178,31.529413,32.32143,32.043839,29.93602
79 | 3-Jun-13,52.477612,45.560001,101.951134,440.625641,170.90538,26.939571,31.20418,30.155714,29.131626,31.059689
80 | 1-Jul-13,59.888763,47.279999,108.455536,444.319305,174.419876,29.526829,28.764942,34.925713,30.804611,33.80011
81 | 1-Aug-13,64.905457,45.75,104.608788,423.873871,163.814789,28.960276,30.386908,40.558571,30.33802,33.530228
82 | 3-Sep-13,63.510681,51.939999,105.538216,438.393402,166.43013,29.798428,30.277731,44.172855,31.58544,36.597019
83 | 1-Oct-13,69.63195,54.220001,104.200531,515.805786,161.064621,31.91334,32.21558,46.068573,32.015255,38.536942
84 | 1-Nov-13,74.509857,56.779999,107.247795,530.325317,162.354248,31.79953,34.953289,52.257141,33.725922,38.856625
85 | 2-Dec-13,75.173126,59.880001,109.411316,560.915894,169.483475,33.61298,34.293274,52.595715,36.564285,37.392227
86 | 2-Jan-14,67.077225,59.189999,97.779083,591.07605,159.643524,31.194368,34.68745,58.475716,35.376755,33.924419
87 | 3-Feb-14,70.934898,68.629997,101.917313,608.433411,168.232117,32.403675,35.381634,63.66143,37.495525,33.976177
88 | 3-Mar-14,72.35025,65.739998,105.080963,557.812805,174.882553,33.034172,37.856777,50.290001,39.221218,35.134892
89 | 1-Apr-14,79.541603,61.689999,110.922226,534.880005,178.498489,34.085911,37.311878,46.005714,39.309307,33.813385
90 | 1-May-14,85.802269,64.540001,109.435966,571.650024,168.47142,35.969479,38.077339,59.689999,40.405502,35.196896
91 | 2-Jun-14,88.17572,72.360001,116.352028,584.669983,165.647736,36.096092,38.784199,62.942856,38.972752,37.186451
92 | 1-Jul-14,90.709122,69.25,115.184502,579.549988,175.151428,34.570095,40.142113,60.388573,38.951195,37.330624
93 | 1-Aug-14,97.739883,71.900002,116.352257,582.359985,176.766388,34.73325,42.517292,68.234283,40.050587,37.518917
94 | 2-Sep-14,96.071152,69.190002,107.247215,588.409973,174.495895,33.033169,43.387665,64.454285,36.916359,36.38578
95 | 1-Oct-14,102.984459,70.120003,107.813469,567.869995,151.120087,33.987434,43.939838,56.110001,37.775494,36.433998
96 | 3-Nov-14,113.898628,73.68,98.762024,549.080017,150.0905,37.78524,45.026917,49.512856,41.025829,39.320099
97 | 1-Dec-14,105.710335,72.699997,101.764709,530.659973,148.489365,35.158489,43.746086,48.80143,43.502277,39.72681
98 | 2-Jan-15,112.203506,70.129997,93.010651,537.549988,141.890442,34.103638,38.048264,63.114285,40.63279,42.380104
99 | 2-Feb-15,123.510986,79.099998,97.726128,562.630005,150.929001,35.748814,41.591328,67.844284,42.504868,45.43103
100 | 2-Mar-15,119.636238,73.940002,96.168816,554.700012,149.586899,35.07621,38.565643,59.527142,41.854977,46.019024
101 | 1-Apr-15,120.328499,76.059998,101.738503,548.77002,159.643234,37.29216,46.134602,79.5,42.45919,48.18634
102 | 1-May-15,125.784088,79.089996,95.295212,545.320007,159.31134,40.421711,44.735142,89.151428,42.332653,50.660107
103 | 1-Jun-15,121.101463,81.010002,89.253685,540.039978,152.74733,40.130886,42.148026,93.848572,39.227543,52.278576
104 | 1-Jul-15,117.113991,81.989998,81.861366,657.5,152.118149,44.023018,44.582397,114.309998,39.022148,56.480755
105 | 3-Aug-15,109.361488,78.57,75.875786,647.820007,140.030304,41.320961,41.820564,115.029999,36.237648,53.48838
106 | 1-Sep-15,106.975632,82.220001,73.899025,638.369995,137.265488,41.005852,42.531666,103.260002,35.289936,55.57082
107 | 1-Oct-15,115.898346,88.660004,85.141266,737.390015,132.635361,45.207314,50.584435,108.379997,38.098255,61.172874
108 | 2-Nov-15,115.225647,91.459999,86.598373,762.849976,133.248718,42.758907,52.579689,123.330002,38.225773,60.213558
109 | 1-Dec-15,102.524529,93.940002,85.308685,778.01001,131.528397,44.080826,53.672882,114.379997,35.832371,58.87962
110 | 4-Jan-16,94.810341,89.129997,81.999138,761.349976,119.266312,42.370281,53.295586,91.839996,35.763424,59.605438
111 | 1-Feb-16,94.688271,85.150002,80.12941,717.219971,126.509262,39.843796,49.57613,93.410004,36.226345,57.281075
112 | 1-Mar-16,106.73362,93.800003,91.614883,762.900024,146.224731,39.611477,53.814655,102.230003,40.294178,58.747299
113 | 1-Apr-16,91.799339,94.220001,98.125877,707.880005,140.904846,42.415478,48.59201,90.029999,39.40633,55.332672
114 | 2-May-16,98.388046,99.470001,98.018005,748.849976,149.868225,43.92609,52.003006,102.57,39.742462,54.203049
115 | 1-Jun-16,94.190842,95.790001,101.734932,703.530029,147.957581,45.118515,50.207428,91.480003,40.464153,56.40514
116 | 1-Jul-16,102.673927,97.860001,99.454315,791.340027,156.574951,43.601677,55.613781,91.25,40.722141,57.323502
117 | 1-Aug-16,105.102364,102.309998,98.638901,789.849976,156.2164,44.632732,56.730499,97.449997,40.900745,55.719654
118 | 1-Sep-16,111.987015,108.540001,100.933739,804.059998,156.186905,43.714809,56.868721,98.550003,38.975769,53.648621
119 | 3-Oct-16,112.472404,107.510002,102.728424,809.900024,151.113403,44.75042,59.159267,124.870003,38.270115,52.588333
120 | 1-Nov-16,110.0429,102.809998,110.502274,775.880005,160.947403,41.066032,59.896873,117,40.033211,57.709953
121 | 1-Dec-16,115.320023,102.949997,116.584061,792.450012,164.687836,44.330002,61.765545,123.800003,38.299999,55.270943
122 | 3-Jan-17,121.104935,113.82,110.759811,823.830017,174.420883,44.43,64.737526,141.220001,40.23,55.649239
--------------------------------------------------------------------------------
/3-basic-pyviz/1-matplotlib-intro/datasets/types_movies.csv:
--------------------------------------------------------------------------------
1 | Sector,Percentage
2 | Sci-Fi,20
3 | Drama,35
4 | Action,25
5 | Comedy,5
6 | Romance,15
7 |
--------------------------------------------------------------------------------
/3-basic-pyviz/1-matplotlib-intro/figure-matplotlib.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-basic-pyviz/1-matplotlib-intro/figure-matplotlib.png
--------------------------------------------------------------------------------
/3-basic-pyviz/1-matplotlib-intro/matplotlib4hydro.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "id": "e5443b7b-b82c-48df-a365-717b7a824196",
6 | "metadata": {},
7 | "source": [
8 | "# Gallery for Hydrology and water resources\n",
9 | "\n",
10 | "这里收集一些和专业更相关一些的示例画图"
11 | ]
12 | },
13 | {
14 | "cell_type": "markdown",
15 | "id": "9b506333-b41b-458e-9083-569751f576c0",
16 | "metadata": {
17 | "tags": []
18 | },
19 | "source": [
20 | "## 降雨径流图\n",
21 | "\n",
22 | "下面是在一个ax里面画两个坐标的图,这在降雨径流图中会用得到:\n",
23 | "\n",
24 | "参考:\n",
25 | "\n",
26 | "- https://github.com/matplotlib/matplotlib/issues/12318"
27 | ]
28 | },
29 | {
30 | "cell_type": "code",
31 | "execution_count": 44,
32 | "id": "ea2015ce-d945-4a22-b6a0-f68894d2380c",
33 | "metadata": {},
34 | "outputs": [
35 | {
36 | "data": {
37 | "image/png": "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\n",
38 | "text/plain": [
39 | ""
40 | ]
41 | },
42 | "metadata": {
43 | "needs_background": "light"
44 | },
45 | "output_type": "display_data"
46 | }
47 | ],
48 | "source": [
49 | "import matplotlib.pyplot as plt\n",
50 | "import numpy as np\n",
51 | "\n",
52 | "runoff = np.array([1,4,5,6,7,8,9]) \n",
53 | "precipitation = np.array([4,5,6,7,3,3,7])\n",
54 | "\n",
55 | "\n",
56 | "fig, ax = plt.subplots()\n",
57 | "\n",
58 | "# x axis to plot both runoff and precip. against\n",
59 | "x = np.linspace(0, 10, len(runoff))\n",
60 | "\n",
61 | "ax.plot(x, runoff, color=\"r\")\n",
62 | "\n",
63 | "# Create second axes, in order to get the bars from the top you can multiply \n",
64 | "# by -1\n",
65 | "ax2 = ax.twinx()\n",
66 | "ax2.bar(x, -precipitation)\n",
67 | "\n",
68 | "# Now need to fix the axis labels\n",
69 | "max_pre = max(precipitation)\n",
70 | "ax2.set_ylim(-max_pre * 5, 0)\n",
71 | "y2_ticks = np.linspace(0, max_pre, max_pre+1)\n",
72 | "y2_ticklabels = [str(i) for i in y2_ticks]\n",
73 | "ax2.set_yticks(-1 * y2_ticks)\n",
74 | "ax2.set_yticklabels(y2_ticklabels)\n",
75 | "plt.show()"
76 | ]
77 | }
78 | ],
79 | "metadata": {
80 | "kernelspec": {
81 | "display_name": "hydrus",
82 | "language": "python",
83 | "name": "hydrus"
84 | },
85 | "language_info": {
86 | "codemirror_mode": {
87 | "name": "ipython",
88 | "version": 3
89 | },
90 | "file_extension": ".py",
91 | "mimetype": "text/x-python",
92 | "name": "python",
93 | "nbconvert_exporter": "python",
94 | "pygments_lexer": "ipython3",
95 | "version": "3.10.5"
96 | }
97 | },
98 | "nbformat": 4,
99 | "nbformat_minor": 5
100 | }
101 |
--------------------------------------------------------------------------------
/3-basic-pyviz/1-matplotlib-intro/my_figure.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-basic-pyviz/1-matplotlib-intro/my_figure.png
--------------------------------------------------------------------------------
/3-basic-pyviz/1_K8q5e6QuHTGSPtObumouVQ.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-basic-pyviz/1_K8q5e6QuHTGSPtObumouVQ.png
--------------------------------------------------------------------------------
/3-basic-pyviz/1_QlF69QpvfTQsf2pulCj1og.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-basic-pyviz/1_QlF69QpvfTQsf2pulCj1og.png
--------------------------------------------------------------------------------
/3-basic-pyviz/2-seaborn-intro/ElegantFigures.md:
--------------------------------------------------------------------------------
1 | # Elegant Figures 简易翻译
2 |
3 | 该系列是一个[Rob Simmon的系列blog](https://earthobservatory.nasa.gov/blogs/elegantfigures/2013/08/05/subtleties-of-color-part-1-of-6/),刊登在NASA earth observatory网站里。一共6篇,本文简单地意译下其主要内容。以便后面自己科研配图中使用。(不定时更新中...)
4 |
5 | ## Subtleties of Color
6 |
7 | 这是系列的第一篇--颜色的微妙。
8 |
9 | ### Introduction
10 |
11 | 通常我们在选择颜色时都会打开一个调色板,然后选择一个灰度图或者一个彩虹色,点击apply,就给我们的图上了色。虽然我们知道颜色的选择并不是这么简单,但是我们通常都是这么做的。但是这导致许多可视化并不能很好地表达数据所揭示的内容。
12 |
13 | 数据可视化的目的是阐释数据,是为了展示隐藏在大量数字背后的数据模式和关系。
14 |
15 | 在空间数据集中,颜色可能是最有效的精确表达数量的方法,并且是已使用最广泛的。颜色的认真使用可以增强清晰度,帮助讲好故事,并吸引观看者进入到数据中。不好的颜色使用则会阻碍数据表达,甚至错误表达。
16 |
17 | 幸运地是,有效的,来表示数据的颜色使用的原则是直观的。并且已经由制图工作者发展了超过一个世纪。并由科研工作者进一步地认识,设计和可视化工作的改善了半个世纪。
18 |
19 | 虽然基础内容比较简单,但是仍有一些复杂的颜色选择,比如:
20 |
21 | - 我们看到的光线和我们意识到的颜色之间的关系是十分复杂的
22 | - 有许多不同类型的数据,每一种都适合不同的颜色框架
23 | - 随意的颜色选择会让对数据集不熟悉的观众迷惑
24 | - 暗场中的浅色与亮场中的深色在视觉上是不同的,这可能会使目标检测等一些可视化任务变得复杂
25 |
26 | ### (Very) Basic Color Theory
27 |
28 | 虽然肉眼观色是通过视网膜来检测RGB光线,但是我们却并不会以RGB方式思考颜色,而是以亮度(黑白),色度(红橙黄绿蓝靛紫)和饱和度(暗到亮)。这三个变量是基于人类认知的颜色系统的基石。印刷工和画家使用其他颜色系统来描述墨水和颜料的混合。
29 |
30 | 
31 |
32 | 然而计算机却是以RGB的方式处理颜色的。并且不是人眼观测意义上的红绿蓝。计算机屏幕显示的颜色是一个很窄频率波段内的颜色的组合,而我们眼睛视网膜内的每个锥体是能检测到一个相对较宽的频谱的。更复杂的是计算机是线性计算光线的,而我们人类是对低光度比对高光度的变化更敏感的,且对绿色光比对红色光更敏感,对蓝光更不敏感。
33 |
34 | 
35 |
36 | 比如上图三原色,我们是觉得绿色更亮的。因此,人类观察和计算机表达并不完全一致。
37 |
38 | 在我们的视觉中这些非线性的综合结果就是颜色感知是有些笨的。比如我们对一个颜色的饱和度范围的辨识能力是高度依赖于它的亮度的。换句话说,没有暗黄这种颜色的,即太暗了之后就辨别不出是黄色了。比如下图(最左边的hue小图和下方的lightness箭头以及中间图的saturation是三个坐标,该图片共三个图)。在亮度范围的中心附近,蓝色和红色渐变是可以非常饱和,但绿色色调不能(即我们观察绿色饱和度变化不明显)。此外,非常亮和非常暗的颜色总是不饱和的。
39 |
40 | 
41 |
42 | ### CIE Color Spaces
43 |
44 | 颜色感知的不均匀性是由国际照明委员会上世纪30年代绘制的(国际照明委员会法语简称CIE)。CIE制定了一系列颜色空间来让科学家,艺术家和印刷师等来一致性地描述颜色,并能精准地在不同媒介之间转换。比如Adobe的Photoshop内部就使用CIE L\*a\*b来插值颜色梯度和转换RGB图(屏幕)为CMYK(打印)。
45 |
46 | 另一个标准CIE L\*C\*h \[lightness, chroma (saturation), hue\]是作者常用的颜色板。因为简单易用。它是基于人类视觉认知的。L\*C\*h下开发的颜色范围是能帮助我们准确表达数据的内涵的。
47 |
48 | 总之,人不是计算机。计算机颜色是线性和系统的,人的颜色感知是非线性不平衡的。许多工具是根据计算机设计的,而不是针对人的,包括以RGB或者HSV来指定或计算颜色的工具。恒定增强的亮度人看了是不会认为是线性的的,人对对红色、绿色和蓝色的响应也是不同的。找一些工具和调色板来描述感知色彩空间中的颜色,比如CIE L\*C\*h 或Munsell。
49 |
50 | ## The “Perfect” Palette
51 |
52 | 尽管几乎无处不在的彩虹调色板扭曲了底层数据的模式,但使用颜色表示数据的基础还是很好的建立的。
53 |
54 | 到20世纪60年代中期,制图者已经建立了在制图过程中合理使用颜色的指导原则。Jacques Bertin指出彩虹颜色板的缺点,Eduard Imhof 使用了制作了协调的颜色变化梯度在制图中使用。
55 |
56 | 20世纪八九十年代,感知和视觉研究者基于我们大脑和眼睛对光的物理感知调查了颜色板的效力。这些颜色比例的设计是为了实现空间显示的主要目标:显示数据中的模式和关系,并允许看图者准确地读取各个值。
57 |
58 | 根据研究主要内容,一个颜色刻度应该在全值域范围内变化一致,这样每一步都是相等的,而不管它在刻度上的位置如何。即1和2之间的差别和11和12之间的差别是一样的,这样能保持数据的模式和关系。对于较广泛的值范围,对数差相等更好。数字之间的一致关系,比如灰度调色板,就保持了数据的组成。带有突变或不均匀变化的调色板可以在某些区域夸大对比,并隐藏其他区域。
59 |
60 | 调色板还应尽量减少由附近不同颜色或亮度区域引起的颜色变化,这种现象称为simultaneous contrast. 如下图所示,四个小方块的颜色是一样的,但是视觉上看因为背景不一样,同时看的时候反而觉得颜色不一样了。
61 |
62 | 
63 |
64 | simultaneous contrast 在单色调色板中最明显,而色相的急剧变化使这种效果最小化。因此,彩虹调色板的变化有利于保存准确量。
65 |
66 | 那么如何利用灰度调色板(保留形式)和彩虹调色板(保留数量)的优点,同时最小化它们的缺点?
67 |
68 | 将亮度的线性、比例变化与色相和饱和度的同时变化结合起来。科林·威尔(Colin Ware)将这种调色板描述为一种螺旋形的色彩空间,在各种色调之间循环,同时不断增加明度。**亮度的连续、平滑的增加**保存了模式,**色调的变化**帮助精确量的读取,而**饱和度的变化**增强了对比度。比如下列调色板:
69 |
70 | 
71 |
72 | 在色彩的色相、饱和度和亮度三要素中,亮度是最强的。因此,**亮度的精确、单向变化比色相或饱和度的变化更重要**。例如,从黑色到彩色再到白色的颜色刻度仍然可以被准确读取,即使刻度两端的饱和度低于中间。这在设计调色板时提供了一些灵活性,特别是对于从高对比度渐变中获益的数据集。对于ramp的一部分,您也不需要太担心颜色范围会偏离色域(在特定设备上显示的颜色的完整范围)。只要确保亮度仍然平稳地变化。
73 |
74 | 所有这些调色板都适用于**顺序数据**。从高到低连续变化的数据;例如温度、海拔或收入。**不同的调色板适用于其他类型的数据**,如发散性和定性,下节讨论。
75 |
76 | ## Different Data, Different Colors
77 |
--------------------------------------------------------------------------------
/3-basic-pyviz/2-seaborn-intro/data/2014-baby-names-illinois.csv:
--------------------------------------------------------------------------------
1 | rank,name,frequency,sex
2 | 1,Noah,837,Male
3 | 2,Alexander,747,Male
4 | 3,William,687,Male
5 | 4,Michael,680,Male
6 | 5,Liam,670,Male
7 | 6,Jacob,654,Male
8 | 7,Benjamin,649,Male
9 | 8,Mason,604,Male
10 | 9,Daniel,593,Male
11 | 10,Logan,593,Male
12 | 11,Ethan,579,Male
13 | 12,Anthony,564,Male
14 | 13,Aiden,535,Male
15 | 14,Jayden,530,Male
16 | 15,Joseph,498,Male
17 | 16,James,486,Male
18 | 17,Lucas,481,Male
19 | 18,Henry,477,Male
20 | 19,Jackson,469,Male
21 | 20,David,467,Male
22 | 21,Nathan,446,Male
23 | 22,Elijah,445,Male
24 | 23,Matthew,436,Male
25 | 24,Andrew,433,Male
26 | 25,John,432,Male
27 | 26,Isaac,419,Male
28 | 27,Dylan,417,Male
29 | 28,Jack,411,Male
30 | 29,Joshua,411,Male
31 | 30,Owen,411,Male
32 | 31,Julian,407,Male
33 | 32,Gabriel,399,Male
34 | 33,Ryan,399,Male
35 | 34,Oliver,396,Male
36 | 35,Carter,393,Male
37 | 36,Sebastian,380,Male
38 | 37,Charles,377,Male
39 | 38,Luke,371,Male
40 | 39,Jonathan,364,Male
41 | 40,Samuel,353,Male
42 | 41,Christopher,340,Male
43 | 42,Evan,326,Male
44 | 43,Connor,314,Male
45 | 44,Caleb,313,Male
46 | 45,Christian,308,Male
47 | 46,Thomas,306,Male
48 | 47,Nicholas,300,Male
49 | 48,Wyatt,300,Male
50 | 49,Hunter,298,Male
51 | 50,Adrian,288,Male
52 | 51,Angel,285,Male
53 | 52,Cameron,278,Male
54 | 53,Aaron,274,Male
55 | 54,Landon,266,Male
56 | 55,Nolan,266,Male
57 | 56,Jordan,263,Male
58 | 57,Kevin,261,Male
59 | 58,Gavin,258,Male
60 | 59,Adam,249,Male
61 | 60,Brandon,247,Male
62 | 61,Eli,237,Male
63 | 62,Parker,235,Male
64 | 63,Isaiah,234,Male
65 | 64,Jaxon,232,Male
66 | 65,Levi,232,Male
67 | 66,Tyler,227,Male
68 | 67,Dominic,224,Male
69 | 68,Josiah,224,Male
70 | 69,Jeremiah,222,Male
71 | 70,Austin,220,Male
72 | 71,Robert,210,Male
73 | 72,Cooper,204,Male
74 | 73,Leonardo,203,Male
75 | 74,Ian,202,Male
76 | 75,Blake,200,Male
77 | 76,Brayden,200,Male
78 | 77,Camden,200,Male
79 | 78,Zachary,198,Male
80 | 79,Damian,197,Male
81 | 80,Jace,196,Male
82 | 81,Vincent,196,Male
83 | 82,Ayden,192,Male
84 | 83,Leo,191,Male
85 | 84,Chase,189,Male
86 | 85,Colton,188,Male
87 | 86,Grayson,186,Male
88 | 87,Lincoln,186,Male
89 | 88,Mateo,185,Male
90 | 89,Jose,182,Male
91 | 90,Maxwell,181,Male
92 | 91,Giovanni,178,Male
93 | 92,Jason,177,Male
94 | 93,Kayden,175,Male
95 | 94,Nathaniel,175,Male
96 | 95,Miles,174,Male
97 | 96,Patrick,173,Male
98 | 97,Max,170,Male
99 | 98,Brody,168,Male
100 | 99,Jaxson,168,Male
101 | 100,George,166,Male
102 | 101,Theodore,166,Male
--------------------------------------------------------------------------------
/3-basic-pyviz/2-seaborn-intro/data/2015-baby-names-illinois.csv:
--------------------------------------------------------------------------------
1 | rank,name,frequency,sex
2 | 1,Noah,863,Male
3 | 2,Liam,709,Male
4 | 3,Alexander,703,Male
5 | 4,Jacob,650,Male
6 | 5,William,618,Male
7 | 6,Michael,617,Male
8 | 7,Benjamin,616,Male
9 | 8,Daniel,601,Male
10 | 9,Mason,594,Male
11 | 10,James,576,Male
12 | 11,Logan,568,Male
13 | 12,Ethan,560,Male
14 | 13,Aiden,547,Male
15 | 14,Anthony,524,Male
16 | 15,Henry,514,Male
17 | 16,Oliver,502,Male
18 | 17,Jayden,480,Male
19 | 18,Lucas,471,Male
20 | 19,Matthew,449,Male
21 | 20,Jackson,447,Male
22 | 21,Owen,446,Male
23 | 22,Sebastian,433,Male
24 | 23,Carter,429,Male
25 | 24,Joseph,427,Male
26 | 25,Isaac,421,Male
27 | 26,Elijah,413,Male
28 | 27,John,412,Male
29 | 28,Dylan,403,Male
30 | 29,David,402,Male
31 | 30,Julian,397,Male
32 | 31,Jack,384,Male
33 | 32,Nathan,382,Male
34 | 33,Samuel,379,Male
35 | 34,Andrew,377,Male
36 | 35,Gabriel,375,Male
37 | 36,Joshua,363,Male
38 | 37,Christopher,349,Male
39 | 38,Ryan,335,Male
40 | 39,Caleb,331,Male
41 | 40,Jonathan,328,Male
42 | 41,Charles,320,Male
43 | 42,Luke,308,Male
44 | 43,Wyatt,301,Male
45 | 44,Christian,299,Male
46 | 45,Thomas,299,Male
47 | 46,Dominic,286,Male
48 | 47,Cameron,280,Male
49 | 48,Adrian,279,Male
50 | 49,Nolan,279,Male
51 | 50,Angel,278,Male
52 | 51,Nicholas,274,Male
53 | 52,Connor,269,Male
54 | 53,Levi,268,Male
55 | 54,Hunter,267,Male
56 | 55,Landon,265,Male
57 | 56,Mateo,262,Male
58 | 57,Aaron,260,Male
59 | 58,Grayson,258,Male
60 | 59,Adam,256,Male
61 | 60,Isaiah,254,Male
62 | 61,Jordan,250,Male
63 | 62,Evan,249,Male
64 | 63,Leonardo,246,Male
65 | 64,Leo,244,Male
66 | 65,Jaxon,241,Male
67 | 66,Gavin,236,Male
68 | 67,Josiah,235,Male
69 | 68,Eli,223,Male
70 | 69,Theodore,220,Male
71 | 70,Lincoln,218,Male
72 | 71,Brandon,217,Male
73 | 72,Tyler,215,Male
74 | 73,Brayden,208,Male
75 | 74,Austin,205,Male
76 | 75,Robert,205,Male
77 | 76,Emmett,204,Male
78 | 77,Parker,204,Male
79 | 78,Jeremiah,200,Male
80 | 79,Kevin,200,Male
81 | 80,Colton,199,Male
82 | 81,Ian,199,Male
83 | 82,Vincent,198,Male
84 | 83,Zachary,197,Male
85 | 84,Chase,193,Male
86 | 85,Ayden,187,Male
87 | 86,Cooper,186,Male
88 | 87,Easton,183,Male
89 | 88,Declan,182,Male
90 | 89,Jaxson,180,Male
91 | 90,Xavier,175,Male
92 | 91,Jace,172,Male
93 | 92,Damian,171,Male
94 | 93,Jose,171,Male
95 | 94,Kayden,171,Male
96 | 95,Patrick,169,Male
97 | 96,Giovanni,168,Male
98 | 97,Hudson,167,Male
99 | 98,Camden,165,Male
100 | 99,Max,164,Male
101 | 100,Maxwell,155,Male
--------------------------------------------------------------------------------
/3-basic-pyviz/2-seaborn-intro/data/billboard.csv:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-basic-pyviz/2-seaborn-intro/data/billboard.csv
--------------------------------------------------------------------------------
/3-basic-pyviz/2-seaborn-intro/data/pew-raw.csv:
--------------------------------------------------------------------------------
1 | religion, <$10k, $10-20k,$20-30k,$30-40k, $40-50k,$50-75k
2 | Agnostic,27,34,60,81,76,137
3 | Atheist,12,27,37,52,35,70
4 | Buddhist,27,21,30,34,33,58
5 | Catholic,418,617,732,670,638,1116
6 | Dont know/refused,15,14,15,11,10,35
7 | Evangelical Prot ,575,869,1064,982,881,1486
8 | Hindu ,1,9,7,9,11,34
9 | Historically Black Prot ,228,244,236,238,197,223
10 | Jehovahs Witness ,20,27,24,24,21,30
11 | Jewish ,19,19,25,25,30,95
--------------------------------------------------------------------------------
/3-basic-pyviz/2-seaborn-intro/data/tb-raw.csv:
--------------------------------------------------------------------------------
1 | country,year,m014,m1524,m2534,m3544,m4554,m5564,m65,mu,f014
2 | AD,2000,0,0,1,0,0,0,0,,
3 | AE,2000,2,4,4,6,5,12,10,,3
4 | AF,2000,52,228,183,149,129,94,80,,93
5 | AG,2000,0,0,0,0,0,0,1,,1
6 | AL,2000,2,19,21,14,24,19,16,,3
7 | AM,2000,2,152,130,131,63,26,21,,1
8 | AN,2000,0,0,1,2,0,0,0,,0
9 | AO,2000,186,999,1003,912,482,312,194,,247
10 | AR,2000,97,278,594,402,419,368,330,,121
11 | AS,2000,,,,,1,1,,,
--------------------------------------------------------------------------------
/3-basic-pyviz/2-seaborn-intro/data/weather-raw.csv:
--------------------------------------------------------------------------------
1 | id,year,month,element,d1,d2,d3,d4,d5,d6,d7,d8
2 | MX17004,2010,1,tmax,,,,,,,,
3 | MX17004,2010,1,tmin,,,,,,,,
4 | MX17004 ,2010,2,tmax,,27.3,24.1,,,,,
5 | MX17004,2010,2,tmin,,14.4,14.4,,,,,
6 | MX17004,2010,3,tmax,,,,,32.1,,,
7 | MX17004,2010,3,tmin,,,,,14.2,,,
8 | MX17004,2010,4,tmax,,,,,,,,
9 | MX17004,2010,4,tmin,,,,,,,,
10 | MX17004,2010,5,tmax,,,,,,,,
11 | MX17004,2010,5,tmin,,,,,,,,
--------------------------------------------------------------------------------
/3-basic-pyviz/2-seaborn-intro/fig/box.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-basic-pyviz/2-seaborn-intro/fig/box.png
--------------------------------------------------------------------------------
/3-basic-pyviz/2-seaborn-intro/fig/subplot.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-basic-pyviz/2-seaborn-intro/fig/subplot.png
--------------------------------------------------------------------------------
/3-basic-pyviz/2-seaborn-intro/hsl_diagram_618.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-basic-pyviz/2-seaborn-intro/hsl_diagram_618.png
--------------------------------------------------------------------------------
/3-basic-pyviz/2-seaborn-intro/lightness_hue_saturation_618.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-basic-pyviz/2-seaborn-intro/lightness_hue_saturation_618.png
--------------------------------------------------------------------------------
/3-basic-pyviz/2-seaborn-intro/red_green_blue_618.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-basic-pyviz/2-seaborn-intro/red_green_blue_618.png
--------------------------------------------------------------------------------
/3-basic-pyviz/2-seaborn-intro/simultaneous_contrast_618.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-basic-pyviz/2-seaborn-intro/simultaneous_contrast_618.png
--------------------------------------------------------------------------------
/3-basic-pyviz/2-seaborn-intro/three_perceptual_palettes_618.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-basic-pyviz/2-seaborn-intro/three_perceptual_palettes_618.png
--------------------------------------------------------------------------------
/3-basic-pyviz/2-seaborn-intro/v59i10.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-basic-pyviz/2-seaborn-intro/v59i10.pdf
--------------------------------------------------------------------------------
/3-basic-pyviz/readme.md:
--------------------------------------------------------------------------------
1 | # python可视化
2 |
3 | 记录本文目的主要是了解python可视化的生态圈,以了解在什么条件下使用什么工具比较合适,本文主要参考了:[PyViz: Simplifying the Data Visualisation process in Python](https://towardsdatascience.com/pyviz-simplifying-the-data-visualisation-process-in-python-1b6d2cb728f1)
4 |
5 | 接触了python可视化的童鞋都会发现有太多的可视化包可以使用,都不知道怎么选择了,比如matplotlib这一最基本的库,拿来做简单图可以,但是复杂图还是用它就会比较麻烦。各个库都有自己的优缺点,在不同的特点上各有优势,而我们不可能一个个去学着怎么用,所以可以看看pyviz,它对python的可视化生态做了总结。
6 |
7 | 
8 |
9 | "PyViz is a coordinated effort to make data visualization in Python easier to use, learn and more powerful"
10 |
11 | PyViz包含了一系列开源的python包,使得**在浏览器中**处理大小数据集都很容易。
12 |
13 | 
14 |
15 | pyviz包括了Holoviews, geoviews等诸多库,可以和pandas,geopandas等计算库兼容。
16 |
17 | 不过个人认为这个工具目前可能只是将各个工具箱整合起来,所以可能导致有些笨重,因此最好还是根据实际使用情况,独立安装较好。
18 |
19 | 根据github上的star情况:
20 |
21 | - 对于一般的结果分析,数据统计可视化,个人认为结合使用matplotlib和seaborn即可
22 | - 如果需要交互式分析数据,那么bokeh和plotly.py是较好的选择
23 | - 如果涉及到gis数据可视化,如果需要交互式地那么使用plotly.py是比较好的选择,若只是结果分析,那么先尝试使用cartopy是较好的,此外geoplot之于caropy就像seaborn之于matplotlib,也是个可以尝试使用的库。
24 |
25 | 因此本repo的第三部分就按照上述结构组织:
26 |
27 | 1. 首先是matplotlib和seaborn的使用(3-basic-pyviz,即本文件夹下的内容)
28 | 2. 然后是gis可视化(3-gis-pyviz)
29 | 3. 最后补充一点交互式的bokeh和plotly.py(3-interactive-pyviz)
30 |
31 | 关于可视化不错的一些资料:
32 |
33 | - [The Python Graph Gallery](https://github.com/holtzy/The-Python-Graph-Gallery)
34 | - [The Art of Effective Visualization of Multi-dimensional Data](https://towardsdatascience.com/the-art-of-effective-visualization-of-multi-dimensional-data-6c7202990c57)
35 |
--------------------------------------------------------------------------------
/3-gis-pyviz/Miriam.A2012270.2050.2km.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-gis-pyviz/Miriam.A2012270.2050.2km.jpg
--------------------------------------------------------------------------------
/3-gis-pyviz/clickevent/plot_map_ts_click_event.py:
--------------------------------------------------------------------------------
1 | import matplotlib
2 | import seaborn as sns
3 | import matplotlib.pyplot as plt
4 | import numpy as np
5 | import pandas as pd
6 | import cartopy.crs as ccrs
7 | from cartopy.feature import NaturalEarthFeature
8 | from matplotlib import gridspec
9 | from matplotlib.cm import ScalarMappable
10 | from mpl_toolkits.axes_grid1 import make_axes_locatable
11 |
12 |
13 | def test_plot_map_ts(self):
14 | data_map = np.arange(5).tolist()
15 | lat = [24, 30, 40, 50, 50.5]
16 | lon = [-120, -110, -100, -90, -70]
17 | data_ts_obs_np = np.arange(30).reshape(5, 6)
18 | data_ts_pred_np = np.arange(30, 60).reshape(5, 6)
19 | data_ts = [
20 | [data_ts_obs_np[i], data_ts_pred_np[i]] for i in range(data_ts_obs_np.shape[0])
21 | ]
22 | print(data_ts)
23 | t = np.arange(6).tolist()
24 | sites_id = ["01", "02", "03", "04", "05"]
25 | plot_ts_map(data_map, data_ts, lat, lon, t, sites_id)
26 |
27 |
28 | def plot_map_carto(
29 | data, lat, lon, ax=None, pertile_range=None, fig_size=(8, 8), cmap_str="viridis"
30 | ):
31 | temp = data
32 | if pertile_range is None:
33 | vmin = np.amin(temp)
34 | vmax = np.amax(temp)
35 | else:
36 | assert 0 <= pertile_range[0] < pertile_range[1] <= 100
37 | vmin = np.percentile(temp, pertile_range[0])
38 | vmax = np.percentile(temp, pertile_range[1])
39 | llcrnrlat = (np.min(lat),)
40 | urcrnrlat = (np.max(lat),)
41 | llcrnrlon = (np.min(lon),)
42 | urcrnrlon = (np.max(lon),)
43 | extent = [llcrnrlon[0], urcrnrlon[0], llcrnrlat[0], urcrnrlat[0]]
44 | # Figure
45 | only_map = False
46 | if ax is None:
47 | fig, ax = plt.subplots(
48 | 1, 1, figsize=fig_size, subplot_kw={"projection": ccrs.PlateCarree()}
49 | )
50 | only_map = True
51 | ax.set_extent(extent)
52 | states = NaturalEarthFeature(
53 | category="cultural",
54 | scale="50m",
55 | facecolor="none",
56 | name="admin_1_states_provinces_shp",
57 | )
58 | ax.add_feature(states, linewidth=0.5, edgecolor="black")
59 | ax.coastlines("50m", linewidth=0.8)
60 | # auto projection
61 | scat = plt.scatter(lon, lat, c=temp, s=10, cmap=cmap_str, vmin=vmin, vmax=vmax)
62 |
63 | if only_map:
64 | # get size and extent of axes:
65 | axpos = ax.get_position()
66 | pos_x = axpos.x0 + axpos.width + 0.01 # + 0.25*axpos.width
67 | pos_y = axpos.y0
68 | cax_width = 0.02
69 | cax_height = axpos.height
70 | # create new axes where the colorbar should go.
71 | # it should be next to the original axes and have the same height!
72 | pos_cax = fig.add_axes([pos_x, pos_y, cax_width, cax_height])
73 | plt.colorbar(ax=ax, cax=pos_cax)
74 | return fig
75 | else:
76 | plt.colorbar()
77 | return scat, ax
78 |
79 |
80 | def plot_ts_matplot(t, y, color="r", ax=None, title=None):
81 | assert type(t) == list
82 | assert type(y) == list
83 | if ax is None:
84 | fig = plt.figure()
85 | ax = fig.subplots()
86 | ax.plot(t, y[0], color=color, label="pred")
87 | ax.plot(t, y[1], label="obs")
88 | ax.legend()
89 | if title is not None:
90 | ax.set_title(title, loc="center")
91 | if ax is None:
92 | return fig, ax
93 | else:
94 | return ax
95 |
96 |
97 | def plot_ts_map(dataMap, dataTs, lat, lon, t, sites_id, pertile_range=None):
98 | # show the map in a pop-up window
99 | matplotlib.use("TkAgg")
100 | assert type(dataMap) == list
101 | assert type(dataTs) == list
102 | # setup axes
103 | fig = plt.figure(figsize=(8, 8), dpi=100)
104 | gs = gridspec.GridSpec(2, 1)
105 | # plt.subplots_adjust(left=0.13, right=0.89, bottom=0.05)
106 | # plot maps
107 | ax1 = plt.subplot(gs[0], projection=ccrs.PlateCarree())
108 | scat, ax1 = plot_map_carto(
109 | dataMap, lat=lat, lon=lon, ax=ax1, pertile_range=pertile_range
110 | )
111 | # line plot
112 | ax2 = plt.subplot(gs[1])
113 |
114 | # plot ts
115 | def onclick(event):
116 | print("click event")
117 | # refresh the ax2, then new ts data can be showed without previous one
118 | ax2.cla()
119 | xClick = event.xdata
120 | yClick = event.ydata
121 | d = np.sqrt((xClick - lon) ** 2 + (yClick - lat) ** 2)
122 | ind = np.argmin(d)
123 | titleStr = "site_id %s, lat %.3f, lon %.3f" % (
124 | sites_id[ind],
125 | lat[ind],
126 | lon[ind],
127 | )
128 | tsLst = dataTs[ind]
129 | plot_ts_matplot(t, tsLst, ax=ax2, title=titleStr)
130 | # following funcs both work
131 | fig.canvas.draw()
132 | # plt.draw()
133 |
134 | fig.canvas.mpl_connect("button_press_event", onclick)
135 | plt.show()
136 |
--------------------------------------------------------------------------------
/3-gis-pyviz/largest-cities-usa.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-gis-pyviz/largest-cities-usa.png
--------------------------------------------------------------------------------
/3-gis-pyviz/readme.md:
--------------------------------------------------------------------------------
1 | # GIS可视化
2 |
3 | 这里推荐用的地理信息可视化的工具主要是 Cartopy,geoplot可以当作一个补充工具。
4 |
--------------------------------------------------------------------------------
/3-gis-pyviz/shpfile/YangtzeRiverBasins.cpg:
--------------------------------------------------------------------------------
1 | UTF-8
--------------------------------------------------------------------------------
/3-gis-pyviz/shpfile/YangtzeRiverBasins.dbf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-gis-pyviz/shpfile/YangtzeRiverBasins.dbf
--------------------------------------------------------------------------------
/3-gis-pyviz/shpfile/YangtzeRiverBasins.prj:
--------------------------------------------------------------------------------
1 | GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
--------------------------------------------------------------------------------
/3-gis-pyviz/shpfile/YangtzeRiverBasins.qmd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-gis-pyviz/shpfile/YangtzeRiverBasins.qmd
--------------------------------------------------------------------------------
/3-gis-pyviz/shpfile/YangtzeRiverBasins.shp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-gis-pyviz/shpfile/YangtzeRiverBasins.shp
--------------------------------------------------------------------------------
/3-gis-pyviz/shpfile/YangtzeRiverBasins.shx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-gis-pyviz/shpfile/YangtzeRiverBasins.shx
--------------------------------------------------------------------------------
/3-gis-pyviz/shpfile/chosen_stations.dbf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-gis-pyviz/shpfile/chosen_stations.dbf
--------------------------------------------------------------------------------
/3-gis-pyviz/shpfile/chosen_stations.prj:
--------------------------------------------------------------------------------
1 | GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
--------------------------------------------------------------------------------
/3-gis-pyviz/shpfile/chosen_stations.shp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-gis-pyviz/shpfile/chosen_stations.shp
--------------------------------------------------------------------------------
/3-gis-pyviz/shpfile/chosen_stations.shx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-gis-pyviz/shpfile/chosen_stations.shx
--------------------------------------------------------------------------------
/3-gis-pyviz/shpfile/river_in_sanxia_chosen.dbf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-gis-pyviz/shpfile/river_in_sanxia_chosen.dbf
--------------------------------------------------------------------------------
/3-gis-pyviz/shpfile/river_in_sanxia_chosen.prj:
--------------------------------------------------------------------------------
1 | GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]]
--------------------------------------------------------------------------------
/3-gis-pyviz/shpfile/river_in_sanxia_chosen.shp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-gis-pyviz/shpfile/river_in_sanxia_chosen.shp
--------------------------------------------------------------------------------
/3-gis-pyviz/shpfile/river_in_sanxia_chosen.shx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-gis-pyviz/shpfile/river_in_sanxia_chosen.shx
--------------------------------------------------------------------------------
/3-gis-pyviz/usa-city-elevations.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/iHeadWater/hydro-python-tutorials/7927d93a61791979c7fa825dc4fb0859043a2ae1/3-gis-pyviz/usa-city-elevations.png
--------------------------------------------------------------------------------
/3-interactive-pyviz/1-bokeh-intro.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Bokeh\n",
8 | "\n",
9 | "[Bokeh](https://github.com/bokeh/bokeh) 是一个浏览器端的交互可视化库。它提供了丰富的图形库和应付大数据的高性能,能帮助大家快速简洁地构建交互式图形和数据应用。也是所有python可视化库里使用最多的(多过matplotlib,在awesome-python列出的可视化库里,它的star是最多的。\n",
10 | "\n",
11 | "## 安装\n",
12 | "\n",
13 | "安装很简单:\n",
14 | "\n",
15 | "```Shell\n",
16 | "conda install -c conda-forge bokeh\n",
17 | "```\n",
18 | "\n",
19 | "## 快速开始\n",
20 | "\n",
21 | "直接先看一个例子,绘制折线图:"
22 | ]
23 | },
24 | {
25 | "cell_type": "code",
26 | "execution_count": 1,
27 | "metadata": {},
28 | "outputs": [],
29 | "source": [
30 | "from bokeh.plotting import figure, output_file, show\n",
31 | "\n",
32 | "# prepare some data\n",
33 | "x = [1, 2, 3, 4, 5]\n",
34 | "y = [6, 7, 2, 4, 5]\n",
35 | "\n",
36 | "# output to static HTML file\n",
37 | "output_file(\"lines.html\")\n",
38 | "\n",
39 | "# create a new plot with a title and axis labels\n",
40 | "p = figure(title=\"simple line example\", x_axis_label='x', y_axis_label='y')\n",
41 | "\n",
42 | "# add a line renderer with legend and line thickness\n",
43 | "p.line(x, y, legend_label=\"Temp.\", line_width=2)\n",
44 | "\n",
45 | "# show the results\n",
46 | "show(p)"
47 | ]
48 | },
49 | {
50 | "cell_type": "markdown",
51 | "metadata": {},
52 | "source": [
53 | "运行之后,会看到文件夹下游一个名为\"lines.html\"的文件,并且浏览器会自动打开其展示。\n",
54 | "\n",
55 | "使用 bokeh.plotting 接口创建图形的基本步骤是:\n",
56 | "\n",
57 | "- 准备数据\n",
58 | "- 告诉Bokeh输出到哪\n",
59 | "- 调用figure()\n",
60 | "- 增加renders\n",
61 | "- show()或者save()结果"
62 | ]
63 | },
64 | {
65 | "cell_type": "code",
66 | "execution_count": 2,
67 | "metadata": {},
68 | "outputs": [],
69 | "source": [
70 | "from bokeh.plotting import figure, output_file, show\n",
71 | "\n",
72 | "# prepare some data\n",
73 | "x = [0.1, 0.5, 1.0, 1.5, 2.0, 2.5, 3.0]\n",
74 | "y0 = [i**2 for i in x]\n",
75 | "y1 = [10**i for i in x]\n",
76 | "y2 = [10**(i**2) for i in x]\n",
77 | "\n",
78 | "# output to static HTML file\n",
79 | "output_file(\"log_lines.html\")\n",
80 | "\n",
81 | "# create a new plot\n",
82 | "p = figure(\n",
83 | " tools=\"pan,box_zoom,reset,save\",\n",
84 | " y_axis_type=\"log\", y_range=[0.001, 10**11], title=\"log axis example\",\n",
85 | " x_axis_label='sections', y_axis_label='particles'\n",
86 | ")\n",
87 | "\n",
88 | "# add some renderers\n",
89 | "p.line(x, x, legend_label=\"y=x\")\n",
90 | "p.circle(x, x, legend_label=\"y=x\", fill_color=\"white\", size=8)\n",
91 | "p.line(x, y0, legend_label=\"y=x^2\", line_width=3)\n",
92 | "p.line(x, y1, legend_label=\"y=10^x\", line_color=\"red\")\n",
93 | "p.circle(x, y1, legend_label=\"y=10^x\", fill_color=\"red\", line_color=\"red\", size=6)\n",
94 | "p.line(x, y2, legend_label=\"y=10^x^2\", line_color=\"orange\", line_dash=\"4 4\")\n",
95 | "\n",
96 | "# show the results\n",
97 | "show(p)"
98 | ]
99 | },
100 | {
101 | "cell_type": "code",
102 | "execution_count": null,
103 | "metadata": {},
104 | "outputs": [],
105 | "source": []
106 | }
107 | ],
108 | "metadata": {
109 | "kernelspec": {
110 | "display_name": "hydrus",
111 | "language": "python",
112 | "name": "hydrus"
113 | },
114 | "language_info": {
115 | "codemirror_mode": {
116 | "name": "ipython",
117 | "version": 3
118 | },
119 | "file_extension": ".py",
120 | "mimetype": "text/x-python",
121 | "name": "python",
122 | "nbconvert_exporter": "python",
123 | "pygments_lexer": "ipython3",
124 | "version": "3.10.5"
125 | }
126 | },
127 | "nbformat": 4,
128 | "nbformat_minor": 4
129 | }
130 |
--------------------------------------------------------------------------------
/3-interactive-pyviz/2-plotly-intro.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Plotly\n",
8 | "\n",
9 | "本文主要参考了:[Getting Started with Plotly in Python](https://plot.ly/python/getting-started/)。Plotly python库是基于plotly.js的交互式的绘图库,使用它能让python用户创建在jupyter中展示的图像,并可以保存到HTML文件,还可以和pycharm等非web环境良好交互。\n",
10 | "\n",
11 | "下面是安装方式。\n",
12 | "\n",
13 | "```Shell\n",
14 | "conda install -c conda-forge plotly\n",
15 | "```\n",
16 | "\n",
17 | "下面是一个简单地图形构建示例。"
18 | ]
19 | },
20 | {
21 | "cell_type": "code",
22 | "execution_count": 1,
23 | "metadata": {},
24 | "outputs": [],
25 | "source": [
26 | "import plotly.graph_objects as go\n",
27 | "fig = go.Figure(data=go.Bar(y=[2, 3, 1]))\n",
28 | "fig.write_html('first_figure.html', auto_open=True)"
29 | ]
30 | },
31 | {
32 | "cell_type": "markdown",
33 | "metadata": {},
34 | "source": [
35 | "接下来是一个gis图的构建。"
36 | ]
37 | },
38 | {
39 | "cell_type": "code",
40 | "execution_count": 3,
41 | "metadata": {},
42 | "outputs": [],
43 | "source": [
44 | "import plotly.express as px\n",
45 | "df = px.data.gapminder().query(\"year==2007\")\n",
46 | "fig = px.scatter_geo(df, locations=\"iso_alpha\", color=\"continent\",\n",
47 | " hover_name=\"country\", size=\"pop\",\n",
48 | " projection=\"natural earth\")\n",
49 | "fig.write_html('first_geo_figure.html', auto_open=True)"
50 | ]
51 | },
52 | {
53 | "cell_type": "code",
54 | "execution_count": 4,
55 | "metadata": {},
56 | "outputs": [],
57 | "source": [
58 | "import plotly.graph_objects as go\n",
59 | "\n",
60 | "import pandas as pd\n",
61 | "\n",
62 | "df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2014_us_cities.csv')\n",
63 | "df.head()\n",
64 | "\n",
65 | "df['text'] = df['name'] + '
Population ' + (df['pop']/1e6).astype(str)+' million'\n",
66 | "limits = [(0,2),(3,10),(11,20),(21,50),(50,3000)]\n",
67 | "colors = [\"royalblue\",\"crimson\",\"lightseagreen\",\"orange\",\"lightgrey\"]\n",
68 | "cities = []\n",
69 | "scale = 5000\n",
70 | "\n",
71 | "fig = go.Figure()\n",
72 | "\n",
73 | "for i in range(len(limits)):\n",
74 | " lim = limits[i]\n",
75 | " df_sub = df[lim[0]:lim[1]]\n",
76 | " fig.add_trace(go.Scattergeo(\n",
77 | " locationmode = 'USA-states',\n",
78 | " lon = df_sub['lon'],\n",
79 | " lat = df_sub['lat'],\n",
80 | " text = df_sub['text'],\n",
81 | " marker = dict(\n",
82 | " size = df_sub['pop']/scale,\n",
83 | " color = colors[i],\n",
84 | " line_color='rgb(40,40,40)',\n",
85 | " line_width=0.5,\n",
86 | " sizemode = 'area'\n",
87 | " ),\n",
88 | " name = '{0} - {1}'.format(lim[0],lim[1])))\n",
89 | "\n",
90 | "fig.update_layout(\n",
91 | " title_text = '2014 US city populations
(Click legend to toggle traces)',\n",
92 | " showlegend = True,\n",
93 | " geo = dict(\n",
94 | " scope = 'usa',\n",
95 | " landcolor = 'rgb(217, 217, 217)',\n",
96 | " )\n",
97 | " )\n",
98 | "fig.write_html('first_us_figure.html', auto_open=True)"
99 | ]
100 | },
101 | {
102 | "cell_type": "markdown",
103 | "metadata": {},
104 | "source": [
105 | "以上简单示例,后续用到再继续补充。"
106 | ]
107 | }
108 | ],
109 | "metadata": {
110 | "kernelspec": {
111 | "display_name": "hydrus",
112 | "language": "python",
113 | "name": "hydrus"
114 | },
115 | "language_info": {
116 | "codemirror_mode": {
117 | "name": "ipython",
118 | "version": 3
119 | },
120 | "file_extension": ".py",
121 | "mimetype": "text/x-python",
122 | "name": "python",
123 | "nbconvert_exporter": "python",
124 | "pygments_lexer": "ipython3",
125 | "version": "3.10.5"
126 | }
127 | },
128 | "nbformat": 4,
129 | "nbformat_minor": 4
130 | }
131 |
--------------------------------------------------------------------------------
/3-interactive-pyviz/lines.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Bokeh Plot
6 |
7 |
10 |
11 |
12 |
13 |
14 |
17 |
51 |
52 |
--------------------------------------------------------------------------------
/3-interactive-pyviz/log_lines.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Bokeh Plot
6 |
7 |
10 |
11 |
12 |
13 |
14 |
17 |
51 |
52 |
--------------------------------------------------------------------------------
/3-interactive-pyviz/readme.md:
--------------------------------------------------------------------------------
1 | # 交互式可视化
2 |
3 | 在python可视化的github repos中,bokeh基本上是star数最多的了,可见对其使用之多;plotly能在多种语言中使用,在python中,也是比较常用的库。
4 |
5 | 很多时候,使用这两个库目的也不一定就是做交互式可视化,就是还是为了更方便地展示数据,这里只是突出它们和matplotlib以及seaborn的不同,将它们放在了本文件夹下。
6 |
7 | 个人使用这俩库不多,所以目前很简单地记录一些最基本的使用操作。
8 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2019 OuyangWenyu
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # hydrus
2 |
3 | 水文水资源(Hydrology and Water Resources)研究和应用中使用Python的基础教程
4 |
5 | ## 主要内容
6 |
7 | 本repo不是一个一步步照做的教程,而是基于个人学习记录改编的笔记,作用是为像我一样非计算机相关专业,不需要从头到尾完全系统学习的同学提供参考,串联某些基本概念。本repo目前仍在编辑中,一直会有更新,内容常会做写调整;且可能仍有一些不通畅之处,遇错见谅。
8 |
9 | 主要涉及的内容(持续更新中)有:
10 |
11 | 1. Python基础
12 | - [基础环境配置](https://github.com/OuyangWenyu/hydrus/tree/master/1-basic-envir)
13 | - [python基础](https://github.com/OuyangWenyu/hydrus/tree/master/1-learn-python)
14 | 2. 常用科学计算库
15 | - [numpy](https://github.com/OuyangWenyu/hydrus/tree/master/2-numpy-examples)
16 | - [pandas](https://github.com/OuyangWenyu/hydrus/tree/master/2-pandas-examples)
17 | - [scipy](https://github.com/OuyangWenyu/hydrus/tree/master/2-scipy-example)
18 | - [xarray](https://github.com/OuyangWenyu/hydrus/tree/master/2-xarray-example)
19 | 3. 可视化
20 | - [静态可视化](https://github.com/OuyangWenyu/hydrus/tree/master/3-basic-pyviz)
21 | - [GIS数据可视化](https://github.com/OuyangWenyu/hydrus/tree/master/3-gis-pyviz)
22 | - [交互式可视化](https://github.com/OuyangWenyu/hydrus/tree/master/3-interactive-pyviz)
23 |
24 | ## 运行本repo步骤
25 |
26 | 下载本repo,需要本地预先下载安装好git,如果没有安装那么在[此处](https://git-scm.com/downloads)下载,并点击下载好的安装包安装,安装过程中全部选择默认配置即可。
27 |
28 | 本项目在Windowsn和Linux系统下均可运行,启动前,先在conda的base环境下启动jupyter lab。如果没有jupyterlab就执行下面语句。
29 |
30 | 如果第一步就报错,说明你还没有安装conda,需要先参考 https://zhuanlan.zhihu.com/p/102564715 安装miniconda并配置好环境变量,再执行下面语句
31 |
32 | ```Shell
33 | # 激活conda的base环境
34 | conda activate
35 | # 安装jupyterlab(如果base下没有jupyterlab的话)
36 | conda install jupyterlab
37 | ```
38 | 之后再运行下面的语句。
39 |
40 | 如果已经有了jupyterlab,就从这里开始:
41 |
42 | ```Shell
43 | # fork为自己的repo后,从自己的github处下载本项目
44 | git clone "你的hydrus github仓库的ssh地址"
45 | # 进入本项目根目录
46 | cd hydrus
47 | # 创建hydrus环境
48 | conda create -n hydrus python=3.9
49 | # 激活hydrus环境
50 | conda activate hydrus
51 | # conda安装太慢,因此这里使用mamba安装各种包
52 | conda install mamba -c conda-forge
53 | # 然后使用mamba安装运行代码所需的包
54 | mamba install -c conda-forge ipykernel numpy pandas openpyxl feather-format scipy matplotlib xarray netCDF4 dask seaborn cartopy geopandas geoplot plotly
55 | ```
56 |
57 | 接下来就可以运行本repo中的程序啦:
58 |
59 | ```Shell
60 | # 将hydrus环境添加到jupyterlab Launcher显示的kernel
61 | python -m ipykernel install --user --name hydrus --display-name "hydrus"
62 | # 如果你本来就是在jupyterlab下的terminal中执行就不必再启动jupyterlab了,否则就执行下面语句打开jupyterlab
63 | jupyter lab
64 | ```
65 |
66 | 然后打开任意一个.ipynb文件,如果弹出提示“Select Kernel”,请选择hydrus,接着就可以运行打开的文件了。
67 |
68 | 可以从这里开始:[1-basic-envir](https://github.com/iHeadWater/hydrus/blob/master/1-basic-envir),如果不熟悉刚刚提到的git和jupyter lab,1-basic-envir/1-get-started.md里也有介绍。
69 |
70 | 注意如果之前已经fork过本repo了,现在本repo已经更新,而自己那边还没有过同步,那么版本就会落后于本repo,所以需要注意和上游保持一致,同步方法请参考[这里](https://github.com/iHeadWater/hydrus/blob/master/1-basic-envir/1-get-started.md#fork%E5%90%8E%E5%90%8C%E6%AD%A5%E6%BA%90%E7%9A%84%E6%96%B0%E6%9B%B4%E6%96%B0%E5%86%85%E5%AE%B9)。
71 |
72 | 注意,本repo中可视化部分有涉及关于GIS方面内容,若对水文中gis的简单学习使用有兴趣,可以关注:[hydroGIS](https://github.com/OuyangWenyu/hydroGIS)。
73 |
74 | 最后**推荐**一些学科科研相关的python学习资料:
75 |
76 | - [Earth Lab - Earth Data Science](https://www.earthdatascience.org/)
77 | - [Software Carpentry – Teaching Basic Lab Skills for Scientific Computing](https://software-carpentry.org/lessons/index.html)
78 | - [NumFOCUS](https://numfocus.org/)
79 |
80 | 更多内容可以关注:[awesome-python](https://github.com/vinta/awesome-python)。
81 |
82 | ## 参与贡献
83 |
84 | 1. Fork 本项目
85 | 2. 新建 xxx 分支
86 | 3. 提交代码
87 | 4. 新建 Pull Request
88 |
--------------------------------------------------------------------------------
/environment.yml:
--------------------------------------------------------------------------------
1 | name: hydrus
2 | channels:
3 | - conda-forge
4 | - defaults
5 | dependencies:
6 | - python=3.9
7 | - ipykernel
8 | - numpy
9 | - pandas
10 | - openpyxl
11 | - feather-format
12 | - scipy
13 | - matplotlib
14 | - xarray
15 | - netCDF4
16 | - dask
17 | - seaborn
18 | - cartopy
19 | - geopandas
20 | - geoplot
21 | - plotly
22 |
--------------------------------------------------------------------------------