-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathexport.py
More file actions
127 lines (119 loc) · 3.37 KB
/
Copy pathexport.py
File metadata and controls
127 lines (119 loc) · 3.37 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import json
import sqlite3
import traceback
from functools import reduce
# Init
conn = sqlite3.connect('database.db')
c = conn.cursor()
try:
# The items you want to export
bigItems = set([3001, 3003, 3004, 3006, 3009, 3020, 3022, 3023, 3025, 3026, 3027, 3031, 3035, 3041, 3046, 3047, 3050, 3056, 3060, 3065, 3068, 3069, 3071,
3072, 3074, 3075, 3078, 3083, 3084, 3085, 3087, 3089, 3091, 3092, 3100, 3102, 3110, 3111, 3115, 3116, 3117, 3122, 3124, 3135, 3139, 3141, 3142, 3143,
3146, 3151, 3152, 3153, 3156, 3157, 3158, 3165, 3172, 3174, 3180, 3190, 3222, 3285, 3290, 3401, 3504, 3508, 3512, 3706, 3711, 3713, 3715, 3742, 3800])
# Nodes
def exportNodes():
c.execute('''SELECT itemStat.version, itemStat.id, item.name, itemStat.winRate, itemStat.avgBuyTime, itemStat.goldThreshold, itemStat.buyOrder,
itemStat.finalStacks
FROM itemStat
LEFT JOIN item ON itemStat.version = item.version AND itemStat.id = item.id
''')
def nodeFilter(node):
return node[1] in bigItems
def nodesToDict(node):
return {
'version' : node[0],
'id' : node[1],
'name' : node[2],
'winRate': node[3],
'avgBuyTime' : node[4],
'goldThreshold' : node[5],
'buyOrder' : node[6],
'finalStacks' : node[7]
}
return list(map(nodesToDict, filter(nodeFilter, c.fetchall())))
# Links
def exportLinks():
c.execute('''SELECT [match].version,
item1 AS item1Id,
item2 AS item2Id,
CAST (COUNT() AS FLOAT) / (
SELECT TOTAL(itemStat.timesBought)
FROM itemStat
WHERE match.version = itemStat.version AND
(item1 = itemStat.id OR item2 = itemStat.id)
)
FROM (
SELECT i1.matchId,
i1.participantId,
i1.shortItemId AS item1,
i2.shortItemId AS item2
FROM participantItem AS i1
CROSS JOIN
participantItem AS i2 ON i1.matchId = i2.matchId AND
i1.participantId = i2.participantId AND
i1.shortItemId < i2.shortItemId
)
LEFT JOIN
[match] ON matchId = [match].id
GROUP BY [match].version,
item1,
item2
''')
def linkFilter(link):
return (link[1] in bigItems and link[2] in bigItems) and link[3] > 0
def linksToDict(link):
return {
'version' : link[0],
'source' : link[1],
'target' : link[2],
'value' : link[3]
}
return list(map(linksToDict, filter(linkFilter, c.fetchall())))
with open('itemCross.json', 'w') as f:
f.write(
json.dumps({
'nodes' : exportNodes(),
'links' : exportLinks()
}
)
)
# Buy times
c.execute('''SELECT itemStat.version, itemStat.id, item.name, itemStat.avgBuyTime, itemStat.medianBuyTime, itemStat.winRate
FROM itemStat
LEFT JOIN item ON itemStat.version = item.version AND itemStat.id = item.id
GROUP BY itemStat.id, itemStat.version
''')
def itemFilter(item):
return item[1] in bigItems
def itemToDict(item):
return {
'version' : item[0],
'id' : item[1],
'name' : item[2],
'avgBuyTime' : item[3],
'medianBuyTime' : item[4],
'winRate' : item[5]
}
def itemReduce(prev, curr):
if curr['id'] not in prev:
prev[curr['id']] = {}
prev[curr['id']][curr['version']] = curr
return prev
items = reduce(
itemReduce,
map(
itemToDict,
filter(
itemFilter,
c.fetchall()
)
),
{}
)
with open('itemStats.json', 'w') as f:
f.write(json.dumps(items))
except:
traceback.print_exc()
conn.close()
print('Done!')
input()