特に大規模なデータセットを簡単にアクセスできる方法で保存するために、しばらくの間スクリプト内で pandas を使用しています。数日前にこの問題に出くわしましたが、これまで解決できませんでした。
問題は、巨大なデータ フレームを hdf5 ファイルに格納した後、後でそれをロードしたときに、1 つまたは複数の列 (オブジェクト型の列からのみ) が完全にアクセスできず、「NoneType オブジェクトは反復可能ではありません」を返すことがあることです。エラー。
メモリ内のフレームを使用している間、以下の例よりも適度に大きなデータ セットであっても問題はありません。フレームには、複数の日時列または複数のVMS タイムスタンプのいずれか、および文字列、文字、整数列が含まれていることに注意してください。オブジェクト以外の列はすべて、欠損値を持つ可能性があり、実際に欠損値を持つことがあります。
最初は、「オブジェクト タイプ」列の 1 つに「NA」値を保存していると思いました。次に、最新の pandas バージョン (0.9.1) に更新しようとしました。これまでのところ何も機能していません。
次のコードでエラーを再現できました。
import pandas as pd
import numpy as np
import datetime
# Get VMS timestamps for today
time_now = datetime.datetime.today()
start_vms = datetime.datetime(1858, 11, 17)
t_delta = (time_now - start_vms)
vms_time = t_delta.total_seconds() * 10000000
# Generate Test Frame (dense)
test_records = []
vms_time1 = vms_time
vms_time2 = vms_time
for i in range(2000000):
vms_time1 += 15 * np.random.randn()
vms_time2 += 25 * np.random.randn()
vms_time_diff = vms_time2 - vms_time1
string1 = 'XXXXXXXXXX'
string2 = 'XXXXXXXXXX'
string3 = 'XXXXX'
string4 = 'XXXXX'
char1 = 'A'
char2 = 'B'
char3 = 'C'
char4 = 'D'
number1 = np.random.randint(1,10)
number2 = np.random.randint(1,100)
number3 = np.random.randint(1,1000)
test_records.append((char1, string1, vms_time1, number1, char2, string2, vms_time2, number2, char3, string3, vms_time_diff, number3, char4, string4))
df = pd.DataFrame(test_records, columns = ["column_1", "column_2", "column_3", "column_4", "column_5", "column_6", "column_7", "column_8", "column_9", "column_10", "column_11", "column_12", "column_13", "column_14"])
# Generate Test Frame (sparse)
test_records = []
vms_time1 = vms_time
vms_time2 = vms_time
count = 0
for i in range(2000000):
if (count%23 == 0):
vms_time1 += 15 * np.random.randn()
string1 = 'XXXXXXXXXX'
string2 = ' '
string3 = 'XXXXX'
string4 = 'XXXXX'
char1 = 'A'
char2 = 'B'
char3 = 'C'
char4 = 'D'
number1 = None
number2 = np.random.randint(1,100)
number3 = np.random.randint(1,1000)
test_records.append((char1, string1, vms_time1, number1, char2, None, None, number2, char3, string3, None, number3, None, string4))
else:
vms_time1 += 15 * np.random.randn()
vms_time2 += 25 * np.random.randn()
vms_time_diff = vms_time2 - vms_time1
string1 = 'XXXXXXXXXX'
string2 = 'XXXXXXXXXX'
string3 = 'XXXXX'
string4 = 'XXXXX'
char1 = 'A'
char2 = 'B'
char3 = 'C'
char4 = 'D'
number1 = np.random.randint(1,10)
number2 = np.random.randint(1,100)
number3 = np.random.randint(1,1000)
test_records.append((char1, string1, vms_time1, number1, char2, string2, vms_time2, number2, char3, string3, vms_time_diff, number3, char4, string4))
count += 1
df1 = pd.DataFrame(test_records, columns = ["column_1", "column_2", "column_3", "column_4", "column_5", "column_6", "column_7", "column_8", "column_9", "column_10", "column_11", "column_12", "column_13", "column_14"])
store_loc = "Some Location for the file"
h5_store = pd.HDFStore(store_loc )
h5_store['df1'] = df
h5_store['df2'] = df1
h5_store.close()
このストアからロードしようとすると、「df1」は正常に動作していますが、「df2」は次のエラーを生成しています。
TypeError: 'NoneType' object is not iterable