├── .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 | ![](pictures/v2-313da6d32657e11ae7d6ed5085ddb9fd_720w.jpg) 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 | ![](pictures/v2-e9e0fe4205328b055ffd8a02207efb54_b.gif) 345 | 346 | 快捷键清单可以参考下图: 347 | 348 | ![](pictures/v2-ba3030b67beda785f9235eb7f41f9291_720w.jpg) 349 | 350 | #### 自动补全 351 | 352 | 与大多数本地集成开发环境(IDE)相同,输入部分代码之后按 tab 键,即可自动补全。Jupyter Lab 中的自动补全功能可以通过不同的颜色和图标,显示出补全的类型。 353 | 354 | ![](pictures/v2-b5ed4693aebbb3ed1180deae916e9130_b.gif) 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 | ![](pictures/v2-a3f8d44a12dc669abcb3da415940c2fc_720w.png) 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 | ![](pictures/vscode-ubuntu.png) 87 | 88 | 这时候可以看到打开一个新界面,左下角显示连接到Ubuntu了。尝试打开终端,可以看到默认的终端是bash了(没有连到WSL时候,默认终端是powershell)。 89 | 90 | 这样下次你再打开,就会自动连接到ubuntu。 91 | 92 | 接下来安装ubuntu条件下的vscode插件,按下快捷键Ctrl+Shift+X,进入插件管理页面。在搜索栏输入python。选择插件,点击安装(注意是ubuntu下的,如下图所示)。 93 | 94 | ![](pictures/QQ截图20211026164025.png) 95 | 96 | 然后你可以尝试打开一个文件夹,或者创建一个文件夹作为项目工作区域。 97 | 98 | 接着就配置这个工作区域 99 | 100 | ![](pictures/QQ截图20211026165042.png) 101 | 102 | 打开后现在看到的应该是如下界面 103 | 104 | ![](pictures/QQ截图20211026171908.png) 105 | 106 | 现在vscode提供了同步设置的功能,可以直接使用自己的github账号同步自己的本地设置到云端。 107 | 108 | 同时可以看到,有三类不同的设置对象:用户、远程和工作区 109 | 110 | ![](pictures/QQ截图20211026172108.png) 111 | 112 | 既然开启了用户同步,这里尝试为用户统一设置。 113 | 114 | 配置代码检查工具flake8和格式化文本的工具black。 115 | 116 | 设置界面如下: 117 | 118 | ![](pictures/QQ截图20211026172637.png) 119 | 120 | ![](pictures/QQ截图20211026172826.png) 121 | 122 | 如果你还没有安装flake8和black,后面编辑代码的时候会提示你安装flake8和black到环境中,同意安装即可。 123 | 124 | 接着可以尝试配置下python 运行和调试工具。 125 | 126 | ![](pictures/QQ截图20211026175505.png) 127 | 128 | 然后选择python文件项: 129 | 130 | ![](pictures/debug-configurations.png) 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 | ![](pictures/QQ截图20211026210552.png) 176 | 177 | 选中后 vscode会自动进行 Test discovery工作,如果报错,检查“输出”->“Python”,看看报的什么错。 178 | 179 | ![](pictures/QQ截图20211026211810.png) 180 | 181 | 报错的原因可能是pytest等相关测试工具安装的问题,也有可能是代码里有一些包没安装好等,多看看输出台报的错,根据错来判断原因。 182 | 183 | 如果能够成功让vscode发现test文件,就会看到如下图所示的界面,那么接下来就很容易运行测试代码了,直接能够看到每个函数前面都有“运行”键。 184 | 185 | ![](pictures/QQ截图20211026221536.png) 186 | 187 | 也很容易debug,加断点后,点击点击测试函数右边显示的debug按键就能进入debug模式了。 188 | 189 | ![](pictures/QQ截图20211026231602.png) 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 | ![](pictures/Picture3.png) 361 | 362 | 可以看到启动的jupyter lab是hydrus环境下的,接下来就可以在jupyter lab中操作了,jupyter lab 导航页面如下所示: 363 | 364 | ![](pictures/Picture2.png) 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 | "\n", 168 | "\n", 169 | "\t\n", 170 | "\t\n", 171 | "\n", 172 | "\n", 173 | "\t\n", 174 | "\t\n", 175 | "\t\n", 176 | "\t\n", 177 | "\t\n", 178 | "\t\n", 179 | "\n", 180 | "
A data.frame: 6 × 6
agency_cdsite_nodateTimeX_00060_00003X_00060_00003_cdtz_cd
<chr><chr><dttm><dbl><chr><chr>
1USGS164000002022-05-26 3.62PUTC
2USGS164010001929-08-3118.00AUTC
3USGS164020001957-07-3151.00AUTC
4USGS164030001957-06-30 5.50AUTC
5USGS164036001970-09-30 2.40AUTC
6USGS164039001996-09-30 1.30AUTC
\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 | "\n", 245 | "\n", 246 | "\t\n", 247 | "\t\n", 248 | "\n", 249 | "\n", 250 | "\t\n", 251 | "\t\n", 252 | "\t\n", 253 | "\t\n", 254 | "\t\n", 255 | "\t\n", 256 | "\n", 257 | "
A data.frame: 6 × 5
agency_cdsite_noDateX_00060_00003X_00060_00003_cd
<chr><chr><date><dbl><chr>
1USGS014910002010-01-01415A
2USGS014910002010-01-02425A
3USGS014910002010-01-03334A
4USGS014910002010-01-04268A
5USGS014910002010-01-05241A
6USGS014910002010-01-06224A
\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 | "
  1. 'agency_cd'
  2. 'site_no'
  3. 'dateTime'
  4. 'X_00060_00000'
  5. 'X_00060_00000_cd'
  6. '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 | "\n", 387 | "\n", 388 | "\t\n", 389 | "\t\n", 390 | "\n", 391 | "\n", 392 | "\t\n", 393 | "\t\n", 394 | "\t\n", 395 | "\t\n", 396 | "\t\n", 397 | "\t\n", 398 | "\n", 399 | "
A data.frame: 6 × 6
agency_cdsite_nodateTimeX_00060_00000X_00060_00000_cdtz_cd
<chr><chr><dttm><dbl><chr><chr>
1USGS014910002010-01-03 05:00:00389AUTC
2USGS014910002010-01-03 05:15:00386AUTC
3USGS014910002010-01-03 05:30:00386AUTC
4USGS014910002010-01-03 05:45:00382AUTC
5USGS014910002010-01-03 06:00:00382AUTC
6USGS014910002010-01-03 06:15:00379AUTC
\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 | ![](pictures/workflow.png) 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 | ![](v2-4e4ce4ad47c1409e837b0182b39f84e3_r.jpg) 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 | ![](lightness_hue_saturation_618.png) 31 | 32 | 然而计算机却是以RGB的方式处理颜色的。并且不是人眼观测意义上的红绿蓝。计算机屏幕显示的颜色是一个很窄频率波段内的颜色的组合,而我们眼睛视网膜内的每个锥体是能检测到一个相对较宽的频谱的。更复杂的是计算机是线性计算光线的,而我们人类是对低光度比对高光度的变化更敏感的,且对绿色光比对红色光更敏感,对蓝光更不敏感。 33 | 34 | ![](red_green_blue_618.png) 35 | 36 | 比如上图三原色,我们是觉得绿色更亮的。因此,人类观察和计算机表达并不完全一致。 37 | 38 | 在我们的视觉中这些非线性的综合结果就是颜色感知是有些笨的。比如我们对一个颜色的饱和度范围的辨识能力是高度依赖于它的亮度的。换句话说,没有暗黄这种颜色的,即太暗了之后就辨别不出是黄色了。比如下图(最左边的hue小图和下方的lightness箭头以及中间图的saturation是三个坐标,该图片共三个图)。在亮度范围的中心附近,蓝色和红色渐变是可以非常饱和,但绿色色调不能(即我们观察绿色饱和度变化不明显)。此外,非常亮和非常暗的颜色总是不饱和的。 39 | 40 | ![](hsl_diagram_618.png) 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 | ![](simultaneous_contrast_618.png) 63 | 64 | simultaneous contrast 在单色调色板中最明显,而色相的急剧变化使这种效果最小化。因此,彩虹调色板的变化有利于保存准确量。 65 | 66 | 那么如何利用灰度调色板(保留形式)和彩虹调色板(保留数量)的优点,同时最小化它们的缺点? 67 | 68 | 将亮度的线性、比例变化与色相和饱和度的同时变化结合起来。科林·威尔(Colin Ware)将这种调色板描述为一种螺旋形的色彩空间,在各种色调之间循环,同时不断增加明度。**亮度的连续、平滑的增加**保存了模式,**色调的变化**帮助精确量的读取,而**饱和度的变化**增强了对比度。比如下列调色板: 69 | 70 | ![](three_perceptual_palettes_618.png) 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 | ![](1_K8q5e6QuHTGSPtObumouVQ.png) 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 | ![](1_QlF69QpvfTQsf2pulCj1og.png) 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 | --------------------------------------------------------------------------------