1

私は3D辞書に次のようなデータを持っています:

 movieid, date,customer_id,views
 0, (2011,12,22), 0, 22
 0, (2011,12,22), 1, 2
 0, (2011,12,22), 2, 12
 .....
 0, (2011,12,22), 7, 2
 0, (2011,12,23), 0, 123

..基本的に、データは、各顧客が1日に映画を何回視聴したかを表します(顧客は8人だけです)。

ここで、各顧客が映画を平均して何回視聴したかを計算したいと思います。

だから基本的に

    movie_id,customer_id, avg_views
     0, 0, 33.2
     0, 1 , 22.3

  and so on

これを解決するためのPythonの方法は何ですか。

タクンズ

編集:

 data = defaultdict(lambda : defaultdict(dict))
 date = datetime.datetime(2011,1,22)
 data[0][date][0] = 22
 print data
defaultdict(<function <lambda> at 0x00000000022F7CF8>, 
 {0: defaultdict(<type 'dict'>, 
 {datetime.datetime(2011, 1, 22, 0, 0): {0: 22}}))

顧客が2人、映画が1人、データが2日分しかないとします。

 movie_id, date, customer_id,views
 0 , 2011,1,22,0,22
 0 , 2011,1,22,1,23
 0 , 2011,1,23,0,44

注:顧客1は1月23日に映画ID0を視聴しませんでした。

 movie_id,customer_id,avg_views
  0   , 0 ,    (22+44)/2
  0,    1,      (23)/1
4

3 に答える 3

1

sumこれを簡単にします。私の元のバージョンではよく使用dict.keys()しましたが、辞書を反復処理すると、デフォルトでキーが提供されます。

この関数は、結果の1行を計算します。

def average_daily_views(movie_id, customer_id, data):
    daily_values = [data[movie_id][date][customer_id] for date in data[movie_id]]
    return sum(daily_values)/len(daily_values)

次に、それをループして、必要なフォームを取得できます。多分:

def get_averages(data):
    result = [average_daily_views(movie, customer, data) for customer in 
              data[movie] for movie in data]
于 2012-11-26T16:17:18.923 に答える
1

私のビジョンは次のとおりです。

pool = [
    (0, (2011,12,22), 0, 22),
    (0, (2011,12,22), 1, 2),
    (0, (2011,12,22), 2, 12),
    (0, (2011,12,22), 7, 2),
    (0, (2011,12,23), 0, 123),
]


def calc(memo, row):
    if (row[2] in memo.keys()):
        num, value = memo[2]
    else:
        num, value = 0, 0

    memo[row[2]] = (num + 1, value + row[3])
    return memo

# dic with sum and number
v = reduce(calc, pool, {})
# calc average
avg = map(lambda x: (x[0], x[1][1] / x[1][0]), v.items())

print dict(avg)

ここで、avg-はkey = customer_idの辞書であり、value-ビューの平均です。

于 2012-11-26T16:24:05.653 に答える
1

目的をよりよく果たすために、データを少し再構築する必要があると思います。

restructured_data = collections.defaultdict(lambda: collections.deafualtdict(collections.defaultdict(int)))
for movie in data:
    for date in data[movie]:
        for customer,count in date.iteritems():
            restructured_data[customer_id][movie_id][date] += count

averages = collections.defaultdict(dict)
for customer in restructured_data:
    for movie in restructured_data[customer]:
        avg = sum(restructured_data[customer][movie].itervalues())/float(len(restructured_data[customer][movie]))
        averages[movie][customer] = avg

for movie in averages:
    for customer, avg in averages[movie].iteritems():
        print "%d, %d, %f" %(movie, customer, avg)

お役に立てれば

于 2012-11-26T16:40:27.680 に答える