https://github.com/rumor-thrower/novelpiaanalysis
Analysis layer for Novelpia web-novel data (npia export ingestion, DataFrames, stats, charts)
https://github.com/rumor-thrower/novelpiaanalysis
data-analysis novelpia statistics visualization webnovel
Last synced: 1 day ago
JSON representation
Analysis layer for Novelpia web-novel data (npia export ingestion, DataFrames, stats, charts)
- Host: GitHub
- URL: https://github.com/rumor-thrower/novelpiaanalysis
- Owner: rumor-thrower
- License: mit
- Created: 2026-07-01T18:40:06.000Z (7 days ago)
- Default Branch: main
- Last Pushed: 2026-07-07T07:08:15.000Z (1 day ago)
- Last Synced: 2026-07-07T08:18:24.009Z (1 day ago)
- Topics: data-analysis, novelpia, statistics, visualization, webnovel
- Language: Julia
- Homepage:
- Size: 24.4 KB
- Stars: 0
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# NovelpiaAnalysis.jl
[](https://github.com/rumor-thrower/NovelpiaAnalysis/actions/workflows/CI.yml)
Analysis layer for Novelpia web-novel data — ingestion of `npia export` output,
DataFrame shaping, summary statistics, and chart rendering. Built on top of the
Rust [`novelpia_api`](https://github.com/rumor-thrower/novelpia_api) / `npia` CLI.
## Submodules
- `Load` — reads an `npia export` output directory into typed DataFrames
- `Frames` — derived columns (per-episode retention, cumulative views)
- `Stats` — summary statistics and conditional-ratio helpers
- `Charts` — shared SVG bar-chart renderer for analysis notebooks
## Installation
Not registered in the General registry. There is no package-level dependency on
the Rust side — the only coupling is the on-disk file contract produced by
`npia export`:
```julia
using Pkg
Pkg.add(url = "https://github.com/rumor-thrower/NovelpiaAnalysis.jl")
```
## Usage
```julia
using NovelpiaAnalysis
# `dir` holds novel__episodes.csv / _reviews.csv / _manifest.json
# produced by: npia export --novel 127306 --out dir
data = Load.load("dir", 127306)
Frames.add_retention!(data.episodes)
Frames.add_cumulative_views!(data.episodes)
Stats.summary(data.episodes)
Charts.barchart(data.episodes.episode_no, data.episodes.count_view; title = "Views by episode")
```
## License
[MIT](LICENSE) — © 2026 rumor-thrower.