3

1timeseries年間に3つの異なるセンサーからのデータがあります。センサーは、およそ3分ごとにデータポイントを生成します。センサーは同期​​されていないため、相互に異なる時間にデータポイント出力を生成します。

このデータは、約50万レコードの1つのテーブルのsqliteデータベースにあります。javascriptチャートライブラリdygraphを使用してこのデータを表示するつもりですtimeseries。センサー名でSQLクエリを実行し、csvに保存することで、これらのセンサーごとにチャートを個別に作成しました。各センサーを表す線で、すべてのデータポイントを表示する1つのグラフが必要です。

'minutes_array'というタイプの文字列のnumpy2d配列を作成しました。最初の列は、センサーの時系列の開始から終了まで1分ごとに最も近い分に丸められたunixタイムスタンプであり、それぞれからのデータで埋められる3つの空の列があります。利用可能な場合は3つのセンサーのうち。

minutes_array

[['1316275620' '' '' '']
 ['1316275680' '' '' '']
 ['1316275740' '' '' '']
 ..., 
 ['1343206920' '' '' '']
 ['1343206980' '' '' '']
 ['1343207040' '' '' '']]

次に、センサーの時系列データも最も近い分に丸められます。numpy.in1dを使用して、上記の「minutes_array」および「sensor_data」配列からタイムスタンプを取得し、そのセンサーに関連するレコードのマスクを作成します。

Sensor_data

[['1316275680' '215.2']
 ['1316275860' '227.0']
 ['1316276280' '212.2']
 ..., 
 ['1343206380' '187.7']
 ['1343206620' '189.4']
 ['1343206980' '192.9']]

 mask = np.in1d(minutes_array[:,0], sensor_data[:,0])

 [False  True False ..., False  True False]

次に、そのマスクに当てはまるminutes_arrayのレコードを変更し、sensor_data値をminutes_arrayのタイムスタンプに続く最初の列に配置します。私の試みから、マスクが適用されたときに元の「minutes_array」を変更することは不可能のようですが、forループを使用せず、タイムスタンプを個別に一致させることなく、numpyでこの結果を達成する方法はありますか?

解決しました

@eumiroからの以下の回答に基づいて、PandasDocsのソリューションと上記の「sensor_data」numpy配列を使用しました

sensors = ['s1','s2','s3']    
sensor_results = {}
for sensor in sensors:
    sensor_data = get_array(db_cursor, sensor)
    sensor_results[sensor] = pd.Series(sensor_data[:,1], \
                                   index=sensor_data[:,0])
df = pd.DataFrame(buoy_results)
df.to_csv("output.csv")
4

1 に答える 1

4

50万は、Python辞書では管理できない数ではありません。

データベースからすべてのセンサーのデータを読み取り、辞書に入力してから、numpy配列を作成するか、さらに良い方法として、それをpandas.DataFrameに変換します。

import pandas as pd

inp1 = [(1316275620,   1), (1316275680,   2)]
inp2 = [(1316275620,  10), (1316275740,  20)]
inp3 = [(1316275680, 100), (1316275740, 200)]

inps = [('s1', inp1), ('s2', inp2), ('s3', inp3)]

data = {}
for name, inp in inps:
    d = data.setdefault(name, {})
    for timestamp, value in inp:
        d[timestamp] = value
df = pd.DataFrame.from_dict(data)

df今です:

            s1  s2   s3
1316275620   1  10  NaN
1316275680   2 NaN  100
1316275740 NaN  20  200
于 2012-07-27T10:47:55.103 に答える