0

プロットアプリケーションによって生成されたデータ系列があり、それらを保存して.csvで自由に呼び出したいとします。

各データセットには4つの特性があります。名前、x値のセット(xvals)、y値のセット(yvals)、および親。

私は現在、Excelで生成する種類の.csvファイルを想像しており、次のことを考えています。

name, DataSet1
xvals, 1,2,3,4,5
yvals, 1,4,9,16,25
parent, None
<linebreak>
name, DataSet2
xvals, 1,2,3,4,5
yvals, 21,23,24,25,26
parent, None
<linebreak>

等々。それはあまり自然な感じではなく、実装はちょっと醜いように見えます。誰か提案はありますか?

私のアプリケーションでは、各DataSeriesインスタンスに必要なすべてのデータがすでに含まれています。インスタンスオブジェクト自体(またはそれらのコレクション)を実際に保存できれば、当面は同様に機能します(ただし、最終的にはExcelで使用するためにデータをエクスポートできるようにしたいと思います)。

Pythonに伝えたい:

  1. ファイル内のすべての行を読み取ります。「空白」行を読み取るたびに、区切り文字を挿入します。行の各塊をデータセットと見なします。

  2. パッケージの各行の最初の項目を読んでください。これは、行の残りのセルに含まれる情報のタイプです。その参照を取得し、隣接するすべてのセルのデータをリストとして、対応するオブジェクト属性に配置します。

私にはこれを実現する方法がありますが、それは「GOTO」ステートメントを思い出させるキャラクターやポジションへの厄介な特定の呼び出しをたくさん含みます。もっと有機的でPythonicなものが欲しいです。

現在のアプローチ:

class DataSet(object):
    def __init__(self, name, xvals, yvals, parent=None):
        self.name = name
        self.xvals = xvals
        self.yvals = yvals
        self.parent = parent

loaded_data = csv.reader(open('csv_data.csv', 'r'), delimiter=',')

container = []
dict = {}
for row in loaded_data:
    if list(row)[0] == '':
        container.append(dict)
        dict = {}
    else:
        dict[list(row)[0]] = filter(None,list(row)[1:])
container.append(dict)
4

2 に答える 2

3

データセットと親を列にすると、データは次のようになります。

"Dataset","Parent","XVal","YVal"
DataSet1,None,1,1
DataSet1,None,2,4
...
DataSet2,None,1,21
DataSet2,None,2,23

一般に、データを表形式(CSVなど)にするには、データを行として再構築する必要があります。行ではなく行のグループ(「データセット名」など)に関連付けられている情報がある場合は、これを、関連する行で値が重複している列に再キャストする必要があります。データを読み込むと、この列を簡単にフィルタリングして、関連するグループを取り戻すことができます。

ちなみに、パンダは、表形式のデータを処理するための便利なツールを提供するライブラリです(CSVの読み取りと書き込み、および説明した方法での列値のグループ化を含む)。

編集:コメントに基づくと、CSVを使用してデータを保存する方法を尋ねていないようです。アドホック形式を解析する方法を尋ねています。その答えは「自分でパーサーを書く」です。あなたはpyparsingを見ることができます。フォーマットは実際にはCSVではないため、CSVライブラリはそれを解析しません。スプレッドシートは表形式ではないため、ご使用のフォーマットではうまく機能しません。既成のツールを使用してデータを処理する場合は、既存の形式を使用するようにデータを変更する必要があります。これにより、長期的には処理が容易になり、データを適切な形式に変更することはそれほど難しくありません。

于 2012-07-24T20:42:18.847 に答える
0

csvを使用する代わりに、jsonを使用できます。このモジュールは、非表形式のデータをシリアル化jsonするのに適しています。したがって、データセットのリストがある場合は、次のようになります。

data_sets = [{"name": "DataSet1", "xvals": [1,2,3,4,5], 
              "yvals": [1,4,9,16,25], "parent": None},
             {"name": "DataSet2", "xvals": [1,2,3,4,5], 
              "yvals": [21,23,24,25,26], "parent": None}]

jsonを使用してそのデータをファイルにエクスポートおよびインポートするのに問題はありません。

import json

# export to a file
with open("path/to/file.json", "wb") as f:
    f.write(json.dumps(data_sets))

# import from a file
with open("path/to/file.json", "rb") as f:
    loaded_data = json.loads(f.read())

print loaded_data

これは、データをExcelにロードするのに役立ちませんが、後で使用するために単純なPythonデータ構造をファイルにダンプする便利な方法を提供します。

ただし、jsonファイルからロードすると、Pythonの基本strオブジェクトではなくUnicodeオブジェクトが表示されることに注意してください。これは、Python 2では少し奇妙に見える可能性があります。たとえば、上記の行を実行した後、u前の行に注意してください。各キー:

>>> print loaded_data[0]
{u'xvals': [1, 2, 3, 4, 5], u'yvals': [1, 4, 9, 16, 25], 
u'name': u'DataSet1', u'parent': None}

つまり、キーがユニコード文字列になったことを意味します。これは悪いことではありませんが、それでも通常のstrオブジェクトとうまく比較できます。

>>> 'xvals' == u'xvals'
True
>>> print loaded_data[0]['xvals']
[1, 2, 3, 4, 5]
于 2012-07-24T20:54:33.350 に答える