Executando verificação de segurança...
12

📊⚔️[Dúvida] Como Transformei Minha Paixão por World of Warcraft em um Projeto de Análise de Dados!"🎮🔍

Olá, TapNews!

Desde que descobri uma paixão por dados e pelo jogo World of Warcraft, sempre busquei formas de combinar esses mundos. Jogando WoW por bastante tempo, decidi enfrentar o desafio de converter logs brutos de combate em um banco de dados estruturado. Dediquei dois meses nesse projeto e, com 8.15GB de logs '.txt', conto com mais de 2000 registros de combates em arenas para análise. Meu aprendizado sobre os logs vieram de fontes como o wowpedia e outros repositórios relacionados ao WoW.

Contexto

Os logs de eventos de combate são repletos de informações, mas também são complexamente codificados. A título de ilustração, compartilho uma linha de log:

   4/3 22:13:15.456  SPELL_DAMAGE,Player-7852-0B30BA11,"Flex-Ragnaros",0x548,0x0,
    Creature-0-3698-7854-95214-235743-0000369825F,"Earthen Wall Totem",0x2148,0x0,
    201657,"Earthen Wall",0x8,0000000000000000,0000000000000000,0,0,0,0,0,0,
    -1,0,0,0,0.00,0.00,0,0.0000,0,152,152,-1,8,0,0,0,nil,nil,nil"

E também um trecho do arquivo JSON deste projeto:

{
        "timestamp": 1870266654.159,
        "event": "COMBATANT_INFO",
        "playerguid": "Player-6587-0DEBA182",
        "faction": 1,
        "character_stats": {
            "strength": 371,
            "agility": 1772,
            "stamina": 314,
            "intelligence": 316,
            "dodge": 0,
            "parry": 0,
            "block": 0,
            "critMelee": 531,
            "critRanged": 531,
            "critSpell": 533,
            "speed": 0,
            "lifesteal": 0,
            "hasteMelee": 332,
            "hasteRanged": 312,
            "hasteSpell": 332,
            "avoidance": 0,
            "mastery": 533,
            "versatilityDamageDone": 789,
            "versatilityHealingDone": 789,
            "versatilityDamageTaken": 789,
            "armor": 790
        },

Cada registro é singular e pode variar em quantidade de elementos, dependendo do evento e das flags presentes, tornando o projeto ainda mais desafiador.

Tecnologias e Abordagem

Para processar esses dados brutos, recorri ao Python, e pelo potencial analítico e versatilidade, escolhi o armazenamento em formato JSON.

Detalhando a Abordagem Técnica

Aprofundando um pouco mais na mecânica do que estou desenvolvendo, o cerne deste projeto é um script de conversão que já ultrapassa as 1300 linhas. Embora tenha buscado inspiração em vários repositórios no GitHub - alguns até datando de uma década atrás - o meu trabalho não se limitou a apenas copiar e colar. A tecnologia evoluiu, e muitas das informações que encontrei foram adaptadas e melhoradas para atender às necessidades atuais. Um bom exemplo disso é o evento "COMBATANT_INFO", que não existia há 10 anos. Para incorporá-lo, precisei investir tempo em pesquisa e inúmeros testes.

Recentemente, finalizei a construção de todas as funções que acredito serem essenciais para o projeto. Ainda que não tenha implementado testes unitários, incorporei algumas verificações ao longo das funções para garantir a integridade dos dados. Com a vasta quantidade de informações já coletadas, não vejo necessidade de adquirir mais dados no momento. Em vez disso, minha prioridade é identificar e corrigir quaisquer falhas presentes no script. Dado o ritmo constante de atualizações do WoW, não planejo manter o script atualizado indefinidamente, especialmente considerando que provavelmente o utilizarei uma única vez.

Com a fase de coleta e estruturação dos dados quase concluída, estou ansiose para avançar para a próxima etapa assim que os potenciais problemas do script forem resolvidos.

Por Que Este Projeto?

A motivação para este projeto está enraizada no meu amor ao WoW e no interesse em explorar o mundo dos dados. Este projeto representa uma oportunidade de combinar paixão e crescimento profissional.

Direção Futura

Após a etapa de estruturação dos dados, pretendo me aprofundar em análises estatísticas. Planejo compartilhar este trabalho no LinkedIn e GitHub, enriquecendo meu portfólio.

Considerações Finais

Seria de grande valor se alguém pudesse indicar uma biblioteca específica para extração de dados, pois meu principal desafio tem sido usar Python puro e expressões regulares para alcançar esse objetivo. No mais, estou bastante contente com essa empreitada e gostaria de conhecer a opinião da comunidade. Feedbacks, sugestões ou comentários serão muito apreciados.

Gratidão pela atenção dispensada!

Carregando publicação patrocinada...
1

Há muito tempo eu queria fazer algum projeto de dados envolvendo os jogos que eu gosto. Minha primeira ideia foi Magic the Gathering, mas nunca foi para a frente. Sua ideia me inspirou a talvez tentar fazer com o meu MMO favorito que é Final Fantasy 14.

Infelizmente tô em semestre de TCC e buscando emprego e tô com pouco tempo para isso, mas vou com certeza acompanhar a evolução do teu projeto e talvez ajudar caso necessário.

Boa sorte e bom trabalho! :)

2

"Demorei muito tempo para começar também, protelando bastante. Uma dica que te dou é: comece de qualquer jeito! Deixe seu código porco, mas funcionando, e não se preocupe com a qualidade no início. Minha maior dificuldade foi encontrar dados correspondentes ao jogo, mas quando finalmente encontrei, 'minha vida mudou' emocionante ^^!"

1

Boa tarde Estagiario, tudo bem?

Me explica melhor sobre a biblioteca que você pede ajuda no final...

Seria extração mesmo ou limpeza dos json?

Tem como dar um flatten no json, conforme aqui: https://www.tutorialspoint.com/flattening-json-objects-in-python

Sugiro também sempre usar get quando estiver usando dicionários, porque evita erros caso o elemento não exista.

Uma sugestão legal de análise seria análise de outlier para esses dados.

1

Não estou familiarizado com as bibliotecas ou ferramentas que podem facilitar a vida de um analista de dados, por isso estou pedindo ajuda para encontrar algo que possa me auxiliar na extração dos dados. Os dados estão em formato bruto, no formato de log de eventos assim:

11/17 21:13:58.323  SPELL_AURA_APPLIED,Player-1425-07B0EE09,"Cloverzan-Drakkari",0x548,0x0,Player-1425-07B0EE09,"Cloverzan-Drakkari",0x548,0x0,154797,"Touch of Elune - Night",0x1,BUFF
11/17 21:13:58.323  SPELL_AURA_APPLIED,Player-1425-07B0EE09,"Cloverzan-Drakkari",0x548,0x0,Player-1425-07B0EE09,"Cloverzan-Drakkari",0x548,0x0,340546,"Tireless Pursuit",0x8,BUFF
11/17 21:13:58.323  SPELL_AURA_APPLIED,Player-1425-07B0EE09,"Cloverzan-Drakkari",0x548,0x0,Player-1425-07B0EE09,"Cloverzan-Drakkari",0x548,0x0,5487,"Bear Form",0x1,BUFF

E meu script o transforma em JSON, assim (isso abaixo é só uma linha convertida😅):

{
        "timestamp": 1700266438.253,
        "event": "SPELL_PERIODIC_DAMAGE",
        "sourceGUID": "Player-3684-0DEBA294",
        "sourceName": "Rawdogger-Mal'Ganis",
        "sourceFlags": [
            "AFFILIATION_OUTSIDER",
            "AFFILIATION_MASK",
            "REACTION_HOSTILE",
            "REACTION_MASK",
            "CONTROL_PLAYER",
            "CONTROL_MASK",
            "TYPE_PLAYER",
            "TYPE_MASK"
        ],
        "sourceRaidFlags": [],
        "destGUID": "Player-1171-0A9765E1",
        "destName": "Zuberion-WyrmrestAccord",
        "destFlags": [
            "AFFILIATION_PARTY",
            "AFFILIATION_MASK",
            "REACTION_FRIENDLY",
            "REACTION_MASK",
            "CONTROL_PLAYER",
            "CONTROL_MASK",
            "TYPE_PLAYER",
            "TYPE_MASK"
        ],
        "destRaidFlags": [
            "AFFILIATION_PARTY",
            "AFFILIATION_MASK"
        ],
        "spellId": "391191",
        "spellName": "Burning Wound",
        "spellSchool": [
            "Fire",
            "Nature",
            "Frost",
            "Shadow",
            "Arcane"
        ],
        "amount": 0,
        "overkill": "9020",
        "school": [
            "Frost"
        ],
        "resisted": 0,
        "blocked": 1292.99,
        "absorbed": 1677.99,
        "critical": true,
        "glancing": true,
        "crushing": true
    }

1

Estagiario,

Como você está iniciando, eu sugeriria você colocar em um DataFrame de polars (ou pandas que seria mais fácil pra quem está iniciando) e depois você vai explorar os dados.

Minha sugestão é que por enquanto você tire campos que sejam listas e foque nos que facilitam criar o dataframe.

Depois pode pegar uma biblioteca de exploração como o PandasProfiling, por exemplo (mas aí o dataset tem que ser em Pandas) ou o PyGWalker.

1

Desde o início, tenho me concentrado exatamente nisso. No entanto, como vou transformá-lo em um dataframe se os dados não estão estruturados? O arquivo de log é bastante complexo, como eu exemplifiquei. É como se fosse um diário que registra tudo o que acontece no jogo World of Warcraft. Ele nos diz quem fez o quê, quando e onde no jogo. Por exemplo, se um personagem chamado "Kizradath" lançou um feitiço chamado "Arena Preparation", o log registra isso, mas de uma forma muito bagunçada, como se todas as informações estivessem misturadas. Portanto, minha primeira tarefa é separar e organizar esses registros para que possamos entender melhor o que está acontecendo e, só então, conseguiremos criar um dataframe.

1

Então Estagiario,

Você tem um script que transforma em JSON, aí você tem dados semi-estruturados, tira o que está retornando dicionários e listas, aí você vai ter uma linha de um dataframe.

Talvez você diga que vai perder informações importantes, mas você está começando o seu projeto, tire do papel primeiro.

Quando você deixar o seu JSON como um dicionário normal, uma key para um valor, você pode transformar essa linha com pd.from_dict.

1

Esse script que transforma em JSON tô nele ainda, mas não está rolando para todos os logs, e o código não está lá essas coisas. Ainda dá erro quando tento converter alguns logs, então estou lidando com esses problemas. Quanto ao que você mencionou, por exemplo, se eu quiser fazer um medidor de dano por partida até dá, porque já tenho os dados do dano. Mas aí fica complicado porque não vou entender totalmente esses dados, já que a parte do log que mostra os equipamentos do jogador está dando trabalho (ainda não tratados). Pensando bem, você tem uma certa razão, mas não tem jeito, vou ter que voltar nos dados para resolver isso em algum momento.

1

Essa geralmente é a parte mais importante da análise de dados, que é a limpeza de dados...

É trabalhosa, mas é essencial e recompensa.

Você não ter todos os dados não é um problema, o problema é você fazer uma primeira entrega.

Faça essa primeira entrega como se não tivesse os dados completos, isso vai te motivar a seguir e depois você, com paciência, vai lidando com os outros dados que são mais complexos.

1

Eu estou nessa parte há muito tempo, mas do que deveria, kkkkk uns 2 meses, vou tentar rodar os dados como ele estão, lembrando que só testo o script com um único log, vou fazer um "for" e rodar em todos os 2000 arquivos e rezar para n dar erro, kkkkkkk...

1