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

   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.

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! :)

"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 ^^!"

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.

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😅): ```JSON { "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 } ```
`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.
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.
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.
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.
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.
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...

Eu gostaria de dar uma olhadinha no repositório, tem link? Sou iniciante e fiquei curioso.