エクセルが苦手な人のために簡単な表計算アプリを開発した

Python で表計算アプリを開発した。NumPy と pandas を利用している。

<img width="1177" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305996/5c93267e-584d-b714-74a7-f114cacc53db.png">

[表計算アプリ](https://math.myserif.com/search?query=t)

## 使い方

* ヘッダーのフォームに t を入力
* 左のテキストエリアにタブ区切りのデータを貼りつける
* 青い矢印のアイコンをクリックするか、カーソルがフォームにフォーカスされた状態でエンターキーを押す

説明のために次のデータを使う。

```
Country	Area	Population
Russia	17,098,242	145,934,462
Canada	9,984,670	37,742,154
United States	9,833,517	331,002,651
China	9,596,960	1,439,323,776
Brazil	8,515,770	212,559,417
Australia	7,741,220	25,499,884
```

データ出典 [Countries in the world by population (2020)](https://www.worldometers.info/world-population/population-by-country/)

## 列の抽出

<img width="1172" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305996/dc77100c-4e28-f312-e07c-b7cb613f8e5b.png">

`[` と `]` の間に列名を入れるとその列が抽出される。カンマ区切りで複数の列を抽出できる。例えば `t [Country,Area]` で Country と Area の列が抽出される。

<img width="1171" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305996/f07e9f84-b8cb-53f3-2d88-b83c31513806.png">

## 行の抽出

<img width="1174" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305996/0b7506db-dc14-1dc5-2cc0-6be057ab1060.png">

`[:3]` とすると 0 行目から 3 行目までが抽出される。`[0:3]` とやっても同じ結果になる。

`[2:]` と入力すると 3 行目からすべての行が抽出される。つまり 2 行目までの行が消される。

<img width="1164" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305996/24736d05-77b6-6b03-4cce-56ee6aa5ebc6.png">

`t [2]` と入力すると、下図のように 3 行目のアメリカだけが抽出される。

<img width="1170" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305996/99943444-903f-0765-22ca-08552af64158.png">

## 並び替え

ハイフン `-` を列名につけると、その列でソートされる。ハイフン 1 つで昇順になる。

<img width="1168" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305996/187c4572-4967-bee2-778d-c863b1a2d1ac.png">

下図のように、ハイフン 2 つで降順になる。中国が一番上にきている。

<img width="1167" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305996/a10b776c-dd0e-5f01-49aa-eb2141d4f7df.png">

## 新しい列の追加

`&` の後に列名と式を入れると、新しい列が追加される。

<img width="1175" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305996/15d50ba9-e786-eefa-8f3c-09b6fa084218.png">

上図では人口密度という列を追加している。式は `Density=Population/Area` である。

## 今までの機能を組みあわせた例

人口密度の列を追加し、面積の列を消し、人口密度で並び替え、上位 3 国を抽出する例。

<img width="1253" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305996/242f66be-5ebf-56f2-be8c-c2746d3118ad.png">

コマンド

```
t &Density=Population/Area [Country,Population,Density] --Density [:3]
```
## 統計

平均や分散などの関数をオプションで入力できる。a は平均。`t a` と入力するだけで各列の平均が求まる。

<img width="1099" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305996/bbf1536c-6f40-f316-4747-5c12e31d695a.png">

オプション一覧

a 平均
median 中央値
mode モード
var 分散
std 標準偏差

<img width="1099" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305996/c45f97bf-e865-1028-2b90-616c6ae4b5c0.png">

## 数式

上の例は `Density=Population/Area` という数式で列を追加したが、高度な関数も直感的に入力できる。

<img width="1099" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305996/873299df-eb5b-1c12-fe73-2a24d17a2f2a.png">

入れ子になった関数も対応済み。三角関数などの標準的な関数はだいたい入っている。べき乗は `^` でなく `**` を使う。

## 図

これまで `t` を使ってきたが、`g` で図を表示できる。グラフは開発途中なため、Matplotlib の原始的なグラフしか表示されない。また `t` コマンドと接続もできない。

グラフは `g` コマンドに `line` などのオプションを入力する。現在は 2 列のデータを棒グラフと折れ線グラフにしか表示できない。

<img width="1100" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305996/2ec5ed7b-6587-9bcb-4d2c-a6a2441a4677.png">

<img width="1096" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305996/3d279b15-d294-aea2-8fa2-a04c06719552.png">

## このアプリの長所

* 無料
* オンラインで手軽に操作できる
* 余計なデザインがなく、操作に集中できる
* 機能が随時更新される
* 余計な中間データを作らずにデータを作成できる
* 出力データはタブ区切りであるため、簡単にエクセルに貼りつけられる
* 高度な数式を入力できる
* 図を表示できる

表計算アプリ
[表計算](https://math.myserif.com/search?query=t)

公式ページ
[Math-Serif](https://math.myserif.com/)

## このアプリの短所

* ドキュメントはすべて英語
* サーバーがアメリカ東海岸にあるため、レスポンスがほんの少し遅い

ドキュメントはすべて英語で書かれているが、表計算アプリは `t` コマンドですべて動く。入力したデータ、出力されるデータはもちろんサーバー内に保存されない。