PythonでLibreOffice Calcファイルを読み込む

####実行した環境
Ubuntu Stdio 18.04LTS
Python 3.6.5

####参考
How to convert OpenDocument spreadsheets to a pandas DataFrame?
https://stackoverflow.com/questions/17834995/how-to-convert-opendocument-spreadsheets-to-a-pandas-dataframe

pandas.read_excel()と言うExcelを読み込んだり、いろいろ出来る関数があるのを今日知ったのですが、私はUbuntuを使用しているので使えません。残念

それで色々検索していたら、LibreOffice Calcを読み込むパッケージがあると言うことで、インストールしました。

####注意）
上記の参考にも書いてあるように、あくまでも実験の段階で、色々な機能はありません。

```sh:
 ODFスプレッドシート（​​ .odsファイル）のサポートは、 pandas問題追跡ツール： https : //github.com/pydata/pandas/issues/2311で要求されていますが 、まだ実装されていません。

 ezodfは未完成のPR9070で、パンダでODFサポートを実装するために使用されました。 そのPRは現在閉鎖されています（技術的な話し合いのためにPRを読んでください）が、 この pandasフォークの実験的な機能としてまだ利用可能です。
    XMLコード（ ここでは ）から直接読み込むいくつかの強引な方法もあります

 header 、 skiprows 、 index_col 、 parse_colsような他の有用なパラメータはこの関数では実装されていません。実装したい場合はこの質問を更新してください
```

####インストール
(Ubuntu Studio 18.04の場合)

```shell-session
$ pip3 search pandas //検索
pandas (0.23.4)                    - Powerful data structures for data
                                     analysis, time series, and statistics

$ pip3 search ezodf
ezodf (0.3.2)          - A Python package to create/manipulate
                         OpenDocumentFormat files.

$ pip3 install pandas //インストール

$ pip3 install ezodf
```

```python:
#!/usr/bin/python3
# coding: UTF-8

import pandas as pd 
import ezodf 
def read_ods(filename, sheet_no=0, header=0): 
    tab = ezodf.opendoc(filename=filename).sheets[sheet_no] 
    return pd.DataFrame({col[header].value:[x.value for x in col[header+1:]] for col in tab.columns()}) 

df = read_ods(filename='fn.ods') 
print(df)
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/8533f6e6-1887-4add-7fdc-1a768dc21c09.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/b62a46d5-70ec-6fca-78f0-7feb3cf415c1.png)

####使い物になるか？
＜class 'pandas.core.frame.DataFrame'＞
typeで調べるとpandas　DataFrame？？
まったく知識がないので、ネットのサイトを参考にして行います。

RemrinのPython攻略日記さんのサイトを参考にします。
http://python-remrin.hatenadiary.jp/entry/2017/05/08/212120

*データフレームを作る（２）リストから

```python:
import numpy as np
import pandas as pd

d =[[1, 2, 3], 
    [50, 60, 70]]
frame = pd.DataFrame(d)

print(frame)
print(frame.T) # .Tで行列変換(転置)
```

```sh:
print(frame)
#     0   1   2
# 0   1   2   3
# 1  50  60  70

print(frame.T)
#    0   1
# 0  1  50
# 1  2  60
# 2  3  70
```
ezodfでCalcから読み込んで実行

```python:
#!/usr/bin/python3
# coding: UTF-8

import pandas as pd 
import ezodf
import sys

def read_ods(filename, sheet_no=0, header=0): 
    tab = ezodf.opendoc(filename=filename).sheets[sheet_no] 
    return pd.DataFrame({col[header].value:[x.value for x in col[header+1:]] for col in tab.columns()}) 

d = read_ods(filename = 'リストからデータフレームを作る.ods')

print(d)
print(d.T)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/20bdaa13-c143-58f1-ee41-fb3c2e9eca26.png)

ちゃんと動作しています。

後、いろいろやって見ましたが全てができる訳ではないようです。

Intro to Data Structuresさんのサイトを参考にします。
https://pandas.pydata.org/pandas-docs/stable/dsintro.html

```python:
import pandas as pd 

d = {'one' : [1., 2., 3., 4.],
     'two' : [4., 3., 2., 1.]}

print(pd.DataFrame(d))
'''
   one  two
0  1.0  4.0
1  2.0  3.0
2  3.0  2.0
3  4.0  1.0
'''

print(pd.DataFrame(d, index=['a', 'b', 'c', 'd']))
'''
   one  two
a  1.0  4.0
b  2.0  3.0
c  3.0  2.0
d  4.0  1.0
'''
```
ezodfでindexを変更します。

```python:
import pandas as pd 
import ezodf

def read_ods(filename, sheet_no=0, header=0): 
    tab = ezodf.opendoc(filename=filename).sheets[sheet_no] 
    return pd.DataFrame({col[header].value:[x.value for x in col[header+1:]] for col in tab.columns()})

d = read_ods(filename = 'index変更.ods')

print(d)

print(pd.DataFrame(d, index=['a', 'b', 'c', 'd']))
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/238800/fe3699d4-a6dd-2ef6-7c6d-a2452399b4ac.png)

indexは変更されていますが、他のデータがNaNになってしまいます。
これ以外は、大体できていると思います。
全てをやった訳でもないので、まだ不具合がでる可能性もあります。