Giter Club home page Giter Club logo

da-in-gamedev-labs's Introduction

АНАЛИЗ ДАННЫХ И ИСКУССТВЕННЫЙ ИНТЕЛЛЕКТ [in GameDev] от УрФУ и Targem Games

Отчет по лабораторной работе #2 выполнил(а):

  • Чашкин Никита Андреевич
  • РИ210941

Отметка о выполнении заданий (заполняется студентом):

Задание Выполнение Баллы
Задание 1 * 60
Задание 2 * 20
Задание 3 * 20

знак "*" - задание выполнено; знак "#" - задание не выполнено;

Работу проверили:

  • к.т.н., доцент Денисов Д.В.
  • к.э.н., доцент Панов М.А.
  • ст. преп., Фадеев В.О.

Цель работы

Познакомиться с программными средствами для организции передачи данных между инструментами google, Python и Unity

Задание 1

Реализовать совместную работу и передачу данных в связке Python - Google-Sheets – Unity.

Подключил API для работы с Google Sheets:

image

Python код для записи данных из скрипта в Google Sheets:

import gspread
import numpy as np

gc = gspread.service_account(filename='unitydatascience-364516-d5142e967d57.json')
sh = gc.open("UnitySheets")
price = np.random.randint(2000, 10000, 11)
for i in range(1, 12):
    tempInf = str(((price[i - 1] - price[i - 2]) / price[i - 2]) * 100)
    tempInf = tempInf.replace('.', ',')
    sh.sheet1.update(f'A{i}', str(i))
    sh.sheet1.update(f'B{i}', str(price[i - 1]))
    sh.sheet1.update(f'C{i}', str(tempInf))
    print(f'{i}\t{tempInf}')

Создал Unity проект и написал скрипт для получения данных из Google Sheets:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using SimpleJSON;

public class NewBehaviourScript : MonoBehaviour
{
    public AudioClip goodSpeak;
    public AudioClip normalSpeak;
    public AudioClip badSpeak;
    private AudioSource selectAudio;
    private Dictionary<string, float> dataSet = new();
    private bool statusStart = false;
    private int i = 1;

    void Start()
    {
        StartCoroutine(GoogleSheets());
    }
    
    IEnumerator GoogleSheets()
    {
        UnityWebRequest curentResp =
            UnityWebRequest.Get(
                "https://sheets.googleapis.com/v4/spreadsheets/1rwDRyBppb0PxRqmkm4YcOo6ly1daXr3dHR3ULpX8HMg/values/Sheet1?key=*API-Ключ*");
        yield return curentResp.SendWebRequest();
        string rawResp = curentResp.downloadHandler.text;
        var rawJson = JSON.Parse(rawResp);
        foreach (var itemRawJson in rawJson["values"])
        {
            var parseJson = JSON.Parse(itemRawJson.ToString());
            var selectRow = parseJson[0].AsStringList;
            dataSet.Add(("Mon_" + selectRow[0]), float.Parse(selectRow[2]));
        }
    }

Добавил функционал для воспроизведения аудио в зависимости от полученных данных:

    void Update()
    {
        if (dataSet["Mon_" + i.ToString()] <= 10 & statusStart == false & i != dataSet.Count)
        {
            StartCoroutine(PlaySelectAudioGood());
            Debug.Log(dataSet["Mon_" + i.ToString()]);
        }

        if (dataSet["Mon_" + i.ToString()] > 10 & dataSet["Mon_" + i.ToString()] < 100 & statusStart == false &
            i != dataSet.Count)
        {
            StartCoroutine(PlaySelectAudioNormal());
            Debug.Log(dataSet["Mon_" + i.ToString()]);
        }

        if (dataSet["Mon_" + i.ToString()] >= 100 & statusStart == false & i != dataSet.Count)
        {
            StartCoroutine(PlaySelectAudioBad());
            Debug.Log(dataSet["Mon_" + i.ToString()]);
        }
    }
    
    IEnumerator PlaySelectAudioGood()
    {
        statusStart = true;
        selectAudio = GetComponent<AudioSource>();
        selectAudio.clip = goodSpeak;
        selectAudio.Play();
        yield return new WaitForSeconds(3);
        statusStart = false;
        i++;
    }

    IEnumerator PlaySelectAudioNormal()
    {
        statusStart = true;
        selectAudio = GetComponent<AudioSource>();
        selectAudio.clip = normalSpeak;
        selectAudio.Play();
        yield return new WaitForSeconds(3);
        statusStart = false;
        i++;
    }

    IEnumerator PlaySelectAudioBad()
    {
        statusStart = true;
        selectAudio = GetComponent<AudioSource>();
        selectAudio.clip = badSpeak;
        selectAudio.Play();
        yield return new WaitForSeconds(4);
        statusStart = false;
        i++;
    }

Задание 2: Реализовать запись в Google-таблицу набора данных, полученных с помощью линейной регрессии из лабораторной работы № 1

Создал второй лист, изменил код из задания #1 для корректной записи данных в Google Sheets

import numpy as np
import gspread


def model(a, b, x):
    return a * x + b


def loss_function(a, b, x, y):
    num = len(x)
    prediction = model(a, b, x)
    return (0.5 / num) * (np.square(prediction - y)).sum()


def optimize(a, b, x, y):
    num = len(x)
    prediction = model(a, b, x)
    da = (1.0 / num) * ((prediction - y) * x).sum()
    db = (1.0 / num) * (prediction - y).sum()
    a = a - Lr * da
    b = b - Lr * db
    return a, b


def iterate(a, b, x, y, times):
    for i in range(times):
        a, b = optimize(a, b, x, y)
    return a, b


gc = gspread.service_account(filename='unitydatascience-364516-d5142e967d57.json')
sh = gc.open("UnitySheets")
x = [3, 21, 22, 34, 54, 34, 55, 67, 89, 99]
y = [2, 22, 24, 65, 79, 82, 55, 130, 150, 199]
x, y = np.array(x), np.array(y)
n_iterations = 1
initialized = False
worksheet = sh.get_worksheet(1)


for i in range(2, 9):
    if not initialized:
        worksheet.update('A1', "Значение a")
        worksheet.update('B1', "Значение b")
        worksheet.update('C1', "Количество итераций")
        worksheet.update('D1', "Потеря (loss)")
        initialized = True

    a, b = np.random.rand(1), np.random.rand(1)
    Lr = 0.000_000_01

    a, b = iterate(a, b, x, y, n_iterations)
    prediction = model(a, b, x)
    loss = loss_function(a, b, x, y)

    a_value = a[0]
    b_value = b[0]
    worksheet.update(f'A{i}', a_value)
    worksheet.update(f'B{i}', b_value)
    worksheet.update(f'C{i}', n_iterations)
    worksheet.update(f'D{i}', loss)
    print(f"a: {a_value}, b: {b_value}, iterations: {n_iterations}, loss: {loss}")
    n_iterations *= 10

Результат выполнения скрипта:

image

Задание 3

- Самостоятельно разработать сценарий воспроизведения звукового сопровождения в Unity в зависимости от изменения считанных данных в задании 2

Изменил код скрипта так, чтобы он подтягивал данные со второго листа, изменил значения при которых будут воспроизводиться конкретные аудиодорожки:

    void Update()
    {
        if (statusStart || i == dataSet.Count + 1) return;
        if (dataSet["Mon_" + i] >= 1000)
        {
            StartCoroutine(PlaySelectAudioBad());
            Debug.Log(dataSet["Mon_" + i]);
        }
        if (dataSet["Mon_" + i] >= 190 && dataSet["Mon_" + i] < 1000)
        {
            StartCoroutine(PlaySelectAudioNormal());
            Debug.Log(dataSet["Mon_" + i]);
        }

        if (!(dataSet["Mon_" + i] <= 190)) return;
        
        StartCoroutine(PlaySelectAudioGood());
        Debug.Log(dataSet["Mon_" + i]);
    }
    
    IEnumerator GoogleSheets()
    {
        var currentResp =
            UnityWebRequest.Get(
                "https://sheets.googleapis.com/v4/spreadsheets/1rwDRyBppb0PxRqmkm4YcOo6ly1daXr3dHR3ULpX8HMg/values/Sheet2?key=*API-Ключ*");
        yield return currentResp.SendWebRequest();
        var rawResp = currentResp.downloadHandler.text;
        var rawJson = JSON.Parse(rawResp);
        foreach (var itemRawJson in rawJson["values"])
        {
            var parseJson = JSON.Parse(itemRawJson.ToString());
            var selectRow = parseJson[0].AsStringList;
            dataSet.Add(("Mon_" + selectRow[0]), float.Parse(selectRow[4]));
        }
    }

Вывод в консоль:

image

Выводы

Получил навык работы с Google Sheets как с интсрументом для анализа данных, научился заносить и парсить данные с помощью Google Sheets. К тому же меня 5 раз назвали тираном, но только 1 раз доверились мне и 1 раз восхитились.

Powered by

BigDigital Team: Denisov | Fadeev | Panov

da-in-gamedev-labs's People

Contributors

den1sovdm1triy avatar codenjoyer avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.