{"id":46634,"date":"2021-03-09T00:00:00","date_gmt":"2021-03-09T08:00:00","guid":{"rendered":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/"},"modified":"2025-11-13T12:55:13","modified_gmt":"2025-11-13T20:55:13","slug":"creating-a-performance-tracker-for-car-races-collecting-race-data","status":"publish","type":"post","link":"https:\/\/www.griddb.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/","title":{"rendered":"Creating a Performance Tracker for Car Races &#8211; Collecting Race Data"},"content":{"rendered":"<p>Collecting and analyzing data is an integral part of any data-driven organization or software application. One of the most cumbersome tasks when it comes to collecting data is populating the Database. This article focuses on providing a simple method to convert raw data and populate the Database using them in a structured manner.<\/p>\n<h2> Prerequisites<\/h2>\n<p>In this tutorial, you will be using Python as the programming language to create the script while using GridDB as the backend database.<\/p>\n<p>Before continuing, you need to have a GridDB database up and running. We have provided comprehensive documentation on how to install GridDB via the <a href=\"https:\/\/docs.griddb.net\/gettingstarted\/using-source-code\/\">source code<\/a> or as a <a href=\"https:\/\/docs.griddb.net\/gettingstarted\/using-rpmyum\/\">package<\/a><\/p>\n<p>To create the connection between Python and GridDB, you will be using the <a href=\"https:\/\/pypi.org\/project\/griddb-python\/\">GridDB Python Connector<\/a>. The final outcome should be a data set that you can obtain using <a href=\"https:\/\/www.kaggle.com\">Kaggle<\/a>. You will be using the <a href=\"https:\/\/www.kaggle.com\/rohanrao\/formula-1-world-championship-1950-2020?select=lap_times.csv\">Formula 1 World Championship (1950 &#8211; 2020)<\/a> dataset in CSV format for the purpose of this tutorial.<\/p>\n<p>That dataset contains multiple CSV files, and you will be using circuits.csv and races.csv files there for the examples in this article. The following tables display the basic structure of each table and the changes planned for transforming the data. The Data Type refers to the target data type in GridDB.<\/p>\n<p><a href=\"#source-code\"> FULL SOURCE CODE <\/a><\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2021\/03\/1.png\"><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2021\/03\/1.png\" alt=\"\" width=\"617\" height=\"366\" class=\"aligncenter size-full wp-image-27311\" srcset=\"\/wp-content\/uploads\/2021\/03\/1.png 617w, \/wp-content\/uploads\/2021\/03\/1-300x178.png 300w, \/wp-content\/uploads\/2021\/03\/1-600x356.png 600w\" sizes=\"(max-width: 617px) 100vw, 617px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2021\/03\/2.png\"><img decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2021\/03\/2.png\" alt=\"\" width=\"622\" height=\"338\" class=\"aligncenter size-full wp-image-27313\" srcset=\"\/wp-content\/uploads\/2021\/03\/2.png 622w, \/wp-content\/uploads\/2021\/03\/2-300x163.png 300w, \/wp-content\/uploads\/2021\/03\/2-600x326.png 600w\" sizes=\"(max-width: 622px) 100vw, 622px\" \/><\/a><\/p>\n<h2>Extracting Data<\/h2>\n<p>When it comes to extracting data from a CSV file, the main steps would be to read the CSV file, identify the data structure and finally iterate each row of data. This is the universal process for any data extraction from a CSV file.<\/p>\n<p>One method to achieve this would be to open the CSV file, then read it as a CSV using the \u00e2\u20ac\u0153csv.reader\u00e2\u20ac\u009d function and identify the column names and data separately.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">import csv\n \n        with open(\".\/dataset\/circuits.csv\") as csv_file:\n            csv_reader = csv.reader(csv_file, delimiter=',')\n            line_count = 0\n            for row in csv_reader:\n                if line_count == 0:\n                    print(f'Column Names : {\", \".join(row)}')\n                    line_count += 1\n                else:\n                    print(f'{\", \".join(row)}')<\/code><\/pre>\n<\/div>\n<p>The above code block will read the circuits.csv file and identify the column names and data to be extracted from each row. However, this method limits what you can do with the extracted data. For a complex data analysis, you need a structured data set that can be manipulated.<\/p>\n<p>Python has a powerful and unique library called Pandas, specifically designed to create data structures and analyze complex data. Therefore, when migrating data, the best option will be to create a Pandas data frame from the extracted data. It will enable us to transform the data according to our requirements easily.<\/p>\n<p>Pandas library contains all the functions you need to extract data from a CSV file. The read_csv function in Pandas will read a designated CSV file and automatically identify the column names and data. You can illustrate this functionality of Pandas as shown below.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">import pandas as pd\n \n        # Create a data frame from circuits.csv\n        circuits_data = pd.read_csv(\".\/dataset\/circuits.csv\") \n        # Create a data frame from races.csv\n        races_data = pd.read_csv(\".\/dataset\/races.csv\") \n         \n        # Print all rows in circuits.csv\n        for row in circuits_data.itertuples(index=False):\n            print(f\"{row}\")\n         \n        # Print all rows in races.csv\n        for row in races_data.itertuples(index=False):\n            print(f\"{row}\")<\/code><\/pre>\n<\/p><\/div>\n<p>The above code will create two data frames as one for each CSV file, which then iterates the data frame to identify the structured data set extracted from the CSV files. The index option is set to False as there is already an index used within the data sets (circuitId and raceId). Data frames are the gateway for managing and transforming your data.<\/p>\n<p>The next step would be to clean and transform the extracted data. It can be easily done using the functions provided by the Pandas data frame. So, let&#8217;s clean and transform the CSV files to provide a structured data set to the Database.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">import pandas as pd\n \n        # Create data frames while defining null values\n        circuits_data = pd.read_csv(\".\/dataset\/circuits.csv\", na_values=['\\N']) \n        races_data = pd.read_csv(\".\/dataset\/races.csv\", na_values=['\\N']) \n         \n        # View the structure of the data frames\n        circuits_data.info()\n        races_data.info()\n         \n        # Drop the alt column \n        circuits_data.drop(['alt'], inplace=True, axis=1)\n         \n        # Create a combined raceTime column\n        races_data['time'].replace({pd.NaT: \"00:00:00\"}, inplace=True)\n        races_data['raceTime'] = races_data['date'] + \" \" + races_data['time']\n        races_data['raceTime'] = pd.to_datetime(races_data['raceTime'], infer_datetime_format=True)\n         \n        # Drop the data and time columns\n        races_data.drop(['date', 'time'], inplace=True, axis=1)\n         \n        # View the structure of modified data frames\n        circuits_data.info()\n        races_data.info()\n        <\/code><\/pre>\n<\/p><\/div>\n<p>In the above code block, you have changed the way of reading the CSV files using the na_values option. You can identify null values defined as (N) in the CSV file and convert them to actual pandas null values (NaT).<\/p>\n<p>Then, using the info() method, you can identify the structure of the data frame.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2021\/03\/3.png\"><img decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2021\/03\/3.png\" alt=\"\" width=\"611\" height=\"346\" class=\"aligncenter size-full wp-image-27314\" srcset=\"\/wp-content\/uploads\/2021\/03\/3.png 611w, \/wp-content\/uploads\/2021\/03\/3-300x170.png 300w, \/wp-content\/uploads\/2021\/03\/3-150x85.png 150w, \/wp-content\/uploads\/2021\/03\/3-600x340.png 600w\" sizes=\"(max-width: 611px) 100vw, 611px\" \/><\/a><\/p>\n<p>Since there is only one record (Non-Null Count) for the alt column in the circuits_data, you can drop it from the data set. Then, in the races_data, first, replace the null values in the time column. Then, combine data and time columns to a new column called raceTime and convert it to a datetime field. Finally, drop the redundant data and time columns from the data frame.<\/p>\n<p>You can view the modified data frames by using the info() method again.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2021\/03\/4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2021\/03\/4.png\" alt=\"\" width=\"622\" height=\"339\" class=\"aligncenter size-full wp-image-27315\" srcset=\"\/wp-content\/uploads\/2021\/03\/4.png 622w, \/wp-content\/uploads\/2021\/03\/4-300x164.png 300w, \/wp-content\/uploads\/2021\/03\/4-600x327.png 600w\" sizes=\"(max-width: 622px) 100vw, 622px\" \/><\/a><\/p>\n<p>The next step would be to insert the data into the Database.<\/p>\n<h2> Interacting with the Database<\/h2>\n<p>The usual way for interacting with the Database would be to create a container in GridDB and insert data to it using either put or multi_put methods. However, The GridDB python client also supports inserting data using data frames.<\/p>\n<p>The first step in the container method is to create the containers to store data. In this instance, you will create two GridDB containers called circuits and races. When creating the containers, the most important thing is to define the correct data types, as incorrect data types can cause errors when performing database operations.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">   circuits_container = \"circuits\"\n        races_container = \"races\"\n     \n        # Create Collection circuits\n        circuits_containerInfo = griddb.ContainerInfo(circuits_container,\n                        [[\"circuitId\", griddb.Type.INTEGER],\n                        [\"circuitRef\", griddb.Type.STRING],\n                        [\"name\", griddb.Type.STRING],\n                        [\"location\", griddb.Type.STRING],\n                        [\"country\", griddb.Type.STRING],\n                        [\"lat\", griddb.Type.FLOAT],\n                        [\"lng\", griddb.Type.FLOAT],\n                        [\"url\", griddb.Type.STRING]],\n                        griddb.ContainerType.COLLECTION, True)\n        circuits_columns = gridstore.put_container(circuits_containerInfo)\n        \n        # Create Collection races\n        races_containerInfo = griddb.ContainerInfo(races_container,\n                        [[\"raceID\", griddb.Type.INTEGER],\n                        [\"year\", griddb.Type.INTEGER],\n                        [\"round\", griddb.Type.INTEGER],\n                        [\"circuitId\", griddb.Type.INTEGER],\n                        [\"name\", griddb.Type.STRING],\n                        [\"url\", griddb.Type.STRING],\n                        [\"raceTime\", griddb.Type.TIMESTAMP]],\n                        griddb.ContainerType.COLLECTION, True)\n        races_columns = gridstore.put_container(races_containerInfo)<\/code><\/pre>\n<\/p><\/div>\n<p>    The next step is to insert the rows into the Database. Using the put_rows function, you can define data frames as the input. This will insert each row in the data frame into the GridDB collection. <\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">    # Put rows\n        # Define the data frames\n        circuits_columns.put_rows(circuits_data)\n        races_columns.put_rows(races_data)<\/code><\/pre>\n<\/p><\/div>\n<p>    That&#8217;s it, and you have successfully transformed and cleaned the data retrieved via the CSV file and added the required data to the GridDB collections in a structured format.<\/p>\n<h2>Retrieving Data from the Database<\/h2>\n<p>    In this section, let&#8217;s see how to retrieve data from the Database. GridDB provides the query functionality which enables users to query the containers to retrieve data from the Database. Have a look at the following code block. There, we have retrieved containers using the get_container function and then querying the collection to extract the required data.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\">    # Define the container names\n            circuits_container = \"circuits\"\n            races_container = \"races\"\n         \n            # Get the containers\n            circuits_data = gridstore.get_container(circuits_container)\n            races_data = gridstore.get_container(races_container)\n            \n            # Fetch all rows - circuits_container\n            query = circuits_data.query(\"select *\")\n            rs = query.fetch(False)\n            print(f\"{circuits_container} Data\")\n            \n            # Iterate and create a list\n            retrieved_data= []\n            while rs.has_next():\n                data = rs.next()\n                retrieved_data.append(data)\n           \n            print(retrieved_data)\n         \n            # Convert the list to a pandas data frame\n            circuits_dataframe = pd.DataFrame(retrieved_data, columns=['circuitId', 'circuitRef', 'name', 'location', 'country', 'lat', 'lng', 'url'])\n         \n            # Get the data frame details\n            print(circuits_dataframe )\n            circuits_dataframe.info()\n            \n            # Fetch all rows - races_container\n            query = races_data.query(\"select * where raceTime >= TIMESTAMP('2010-12-31T00:00:00.000Z')\")\n            rs = query.fetch()\n            print(f\"{races_container} Data\")\n         \n            # Iterate and create a list\n            retrieved_data= []\n            while rs.has_next():\n                data = rs.next()\n                retrieved_data.append(data)\n          \n            print(retrieved_data)\n         \n            # Convert the list to a pandas data frame\n            races_dataframe = pd.DataFrame(retrieved_data, columns=['raceID', 'year', 'round', 'circuitId', 'name', 'url', 'raceTime'])\n         \n            # Get the data frame details\n            print(races_dataframe )\n            races_dataframe.info()<\/code><\/pre>\n<\/p><\/div>\n<p>In the above code, you are querying for all the records in the &#8220;circuits&#8221; collection and selecting races that happened on or after 2010-12-31 using TQL, which is the GridDB query language.<\/p>\n<p>You can use a basic TQL select statement for the circuits container to select all the records as below.<\/p>\n<p><code>circuits_data.query(\"select *\")<\/code><\/p>\n<p>For the races container, you have to filter data to retrieve the races that only happened on or after 2010-12-31.<\/p>\n<p><code>races_data.query(\"select * where raceTime >= TIMESTAMP('2010-12-31T00:00:00.000Z')\")<\/code><\/p>\n<p>If needed, you can filter data further using conditions, ordering, limits and offsets in TQL according to your requirements. Following are some example queries that can be performed using TQL.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\"># TQL Example Queries\n        query = races_data.query(\"select * where circuitID = 22 raceTime >= TIMESTAMP('2010-12-31T10:10:00.000Z')\")\n        query = races_data.query(\"select * where raceTime >= TIMESTAMP('2010-12-31T10:10:00.000Z') order by asc\")\n        query = races_data.query(\"select * limit 25\")<\/code><\/pre>\n<\/p><\/div>\n<p>Next, you have to fetch the resulting output and then iterate the output to create a list containing all the fetched records. Finally, convert the lists into two Pandas data frames called circuits_dataframe and races_dataframe.<\/p>\n<p>When converting the lists to data frames, you can define the columns option to map the data with the relevant fields. Now you have two new data frames populated by the data in the GridDB database.<\/p>\n<h2>Organizing Data<\/h2>\n<p>Now you have two data sets, and what can you do with them? The answer is anything. You can use that data to fulfill any user requirement. Consider the simple example of having to create a single combined data set using both data frames.<\/p>\n<p>For that, you can use the merge function in the Pandas library to combine the two data frames to a single data frame using the circuitID as the relationship between the two data sets. Before merging, you need to change the column name as there is a name and URL column in both data frames. Let&#8217;s rename each data frame to represent their individual data set and merge the data into a single data frame called results.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-python\"># Rename columns in circuits_dataframe\n        circuits_dataframe.rename(\n            columns={\n                'name' : 'circuit_name',\n                'url' : 'circuit_info'\n            }, inplace=True\n        )\n         \n        # Rename columns in races_dataframe\n        races_dataframe.rename(\n            columns={\n                'name' : 'race_name',\n                'url' : 'race_info'\n            }, inplace=True\n        )\n         \n        # Merge the two data sets\n        result = pd.merge(races_dataframe, circuits_dataframe, on='circuitId')\n         \n        # Print the result\n        print(result)<\/code><\/pre>\n<\/p><\/div>\n<p>It&#8217;s that simple. Now you have successfully created a single data set that can be used to analyze the data more effectively.<\/p>\n<h2>Conclusion<\/h2>\n<p>In this article, you learned how to transform and clean data retrieved by a CSV file. Additionally, you could also learn how to interact with GridDB to create collections using the transformed data and how to query them to extract the required information. You can use this article as a base for starting your data journey into the data analytics world.<\/p>\n<h3 id=\"source-code\">Source Code<\/h3>\n<p><a href=\"https:\/\/github.com\/griddbnet\/Blogs\/tree\/main\/Creating%20a%20Performance%20Tracker%20for%20Car%20Races%20-%20Collecting%20Race%20Data\"> GitHub <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Collecting and analyzing data is an integral part of any data-driven organization or software application. One of the most cumbersome tasks when it comes to collecting data is populating the Database. This article focuses on providing a simple method to convert raw data and populate the Database using them in a structured manner. Prerequisites In [&hellip;]<\/p>\n","protected":false},"author":41,"featured_media":27312,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[121],"tags":[],"class_list":["post-46634","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Creating a Performance Tracker for Car Races - Collecting Race Data | GridDB: Open Source Time Series Database for IoT<\/title>\n<meta name=\"description\" content=\"Collecting and analyzing data is an integral part of any data-driven organization or software application. One of the most cumbersome tasks when it comes\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Creating a Performance Tracker for Car Races - Collecting Race Data | GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"og:description\" content=\"Collecting and analyzing data is an integral part of any data-driven organization or software application. One of the most cumbersome tasks when it comes\" \/>\n<meta property=\"og:url\" content=\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/\" \/>\n<meta property=\"og:site_name\" content=\"GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/griddbcommunity\/\" \/>\n<meta property=\"article:published_time\" content=\"2021-03-09T08:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-13T20:55:13+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.griddb.net\/wp-content\/uploads\/2021\/03\/58818-auto-racing_2560x1920.jpeg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1920\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"griddb-admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:site\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"griddb-admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/\"},\"author\":{\"name\":\"griddb-admin\",\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233\"},\"headline\":\"Creating a Performance Tracker for Car Races &#8211; Collecting Race Data\",\"datePublished\":\"2021-03-09T08:00:00+00:00\",\"dateModified\":\"2025-11-13T20:55:13+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/\"},\"wordCount\":1319,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/griddb.net\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2021\/03\/58818-auto-racing_2560x1920.jpeg\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/\",\"url\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/\",\"name\":\"Creating a Performance Tracker for Car Races - Collecting Race Data | GridDB: Open Source Time Series Database for IoT\",\"isPartOf\":{\"@id\":\"https:\/\/griddb.net\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2021\/03\/58818-auto-racing_2560x1920.jpeg\",\"datePublished\":\"2021-03-09T08:00:00+00:00\",\"dateModified\":\"2025-11-13T20:55:13+00:00\",\"description\":\"Collecting and analyzing data is an integral part of any data-driven organization or software application. One of the most cumbersome tasks when it comes\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/#primaryimage\",\"url\":\"\/wp-content\/uploads\/2021\/03\/58818-auto-racing_2560x1920.jpeg\",\"contentUrl\":\"\/wp-content\/uploads\/2021\/03\/58818-auto-racing_2560x1920.jpeg\",\"width\":2560,\"height\":1920},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/griddb.net\/en\/#website\",\"url\":\"https:\/\/griddb.net\/en\/\",\"name\":\"GridDB: Open Source Time Series Database for IoT\",\"description\":\"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL\",\"publisher\":{\"@id\":\"https:\/\/griddb.net\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/griddb.net\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/griddb.net\/en\/#organization\",\"name\":\"Fixstars\",\"url\":\"https:\/\/griddb.net\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"contentUrl\":\"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"width\":200,\"height\":83,\"caption\":\"Fixstars\"},\"image\":{\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/griddbcommunity\/\",\"https:\/\/x.com\/GridDBCommunity\",\"https:\/\/www.linkedin.com\/company\/griddb-by-toshiba\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233\",\"name\":\"griddb-admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb.net\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g\",\"caption\":\"griddb-admin\"},\"url\":\"https:\/\/www.griddb.net\/en\/author\/griddb-admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Creating a Performance Tracker for Car Races - Collecting Race Data | GridDB: Open Source Time Series Database for IoT","description":"Collecting and analyzing data is an integral part of any data-driven organization or software application. One of the most cumbersome tasks when it comes","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/","og_locale":"en_US","og_type":"article","og_title":"Creating a Performance Tracker for Car Races - Collecting Race Data | GridDB: Open Source Time Series Database for IoT","og_description":"Collecting and analyzing data is an integral part of any data-driven organization or software application. One of the most cumbersome tasks when it comes","og_url":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/","og_site_name":"GridDB: Open Source Time Series Database for IoT","article_publisher":"https:\/\/www.facebook.com\/griddbcommunity\/","article_published_time":"2021-03-09T08:00:00+00:00","article_modified_time":"2025-11-13T20:55:13+00:00","og_image":[{"width":2560,"height":1920,"url":"https:\/\/www.griddb.net\/wp-content\/uploads\/2021\/03\/58818-auto-racing_2560x1920.jpeg","type":"image\/jpeg"}],"author":"griddb-admin","twitter_card":"summary_large_image","twitter_creator":"@GridDBCommunity","twitter_site":"@GridDBCommunity","twitter_misc":{"Written by":"griddb-admin","Est. reading time":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/#article","isPartOf":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/"},"author":{"name":"griddb-admin","@id":"https:\/\/griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233"},"headline":"Creating a Performance Tracker for Car Races &#8211; Collecting Race Data","datePublished":"2021-03-09T08:00:00+00:00","dateModified":"2025-11-13T20:55:13+00:00","mainEntityOfPage":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/"},"wordCount":1319,"commentCount":0,"publisher":{"@id":"https:\/\/griddb.net\/en\/#organization"},"image":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2021\/03\/58818-auto-racing_2560x1920.jpeg","articleSection":["Blog"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/","url":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/","name":"Creating a Performance Tracker for Car Races - Collecting Race Data | GridDB: Open Source Time Series Database for IoT","isPartOf":{"@id":"https:\/\/griddb.net\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/#primaryimage"},"image":{"@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2021\/03\/58818-auto-racing_2560x1920.jpeg","datePublished":"2021-03-09T08:00:00+00:00","dateModified":"2025-11-13T20:55:13+00:00","description":"Collecting and analyzing data is an integral part of any data-driven organization or software application. One of the most cumbersome tasks when it comes","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/en\/blog\/creating-a-performance-tracker-for-car-races-collecting-race-data\/#primaryimage","url":"\/wp-content\/uploads\/2021\/03\/58818-auto-racing_2560x1920.jpeg","contentUrl":"\/wp-content\/uploads\/2021\/03\/58818-auto-racing_2560x1920.jpeg","width":2560,"height":1920},{"@type":"WebSite","@id":"https:\/\/griddb.net\/en\/#website","url":"https:\/\/griddb.net\/en\/","name":"GridDB: Open Source Time Series Database for IoT","description":"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL","publisher":{"@id":"https:\/\/griddb.net\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/griddb.net\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/griddb.net\/en\/#organization","name":"Fixstars","url":"https:\/\/griddb.net\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb.net\/en\/#\/schema\/logo\/image\/","url":"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","contentUrl":"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","width":200,"height":83,"caption":"Fixstars"},"image":{"@id":"https:\/\/griddb.net\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/griddbcommunity\/","https:\/\/x.com\/GridDBCommunity","https:\/\/www.linkedin.com\/company\/griddb-by-toshiba"]},{"@type":"Person","@id":"https:\/\/griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233","name":"griddb-admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb.net\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g","caption":"griddb-admin"},"url":"https:\/\/www.griddb.net\/en\/author\/griddb-admin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts\/46634","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/comments?post=46634"}],"version-history":[{"count":1,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts\/46634\/revisions"}],"predecessor-version":[{"id":51310,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts\/46634\/revisions\/51310"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/media\/27312"}],"wp:attachment":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/media?parent=46634"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/categories?post=46634"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/tags?post=46634"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}