docstr: Test that dataframe dtypes are preserved for empty tables.
          
docstr_tok: ["Test","that","dataframe","dtypes","are","preserved","for","empty","tables","."]
code: def test_empty_frame_dtypes(self, convert_dates):
      """Test that dataframe dtypes are preserved for empty tables."""
      sids = np.arange(5)
      dates = self.trading_calendar.all_sessions.tz_convert(None)
  
      if convert_dates:
          date_dtype = np.dtype("M8[ns]")
      else:
          date_dtype = np.dtype("int64")
  
      # Write all empty frames.
      self.writer_without_pricing(dates, sids).write()
  
      dfs = self.component_dataframes(convert_dates)
  
      for df in dfs.values():
          assert_equal(len(df), 0)
  
      for key in "splits", "mergers", "dividends":
          result = dfs[key].dtypes
          expected = pd.Series(
              {
                  "effective_date": date_dtype,
                  "ratio": np.dtype("float64"),
                  "sid": np.dtype("int64"),
              }
          ).sort_index()
          assert_equal(result, expected)
  
      result = dfs["dividend_payouts"].dtypes
      expected = pd.Series(
          {
              "sid": np.dtype("int64"),
              "ex_date": date_dtype,
              "declared_date": date_dtype,
              "record_date": date_dtype,
              "pay_date": date_dtype,
              "amount": np.dtype("float64"),
          }
      ).sort_index()
  
      assert_equal(result, expected)
  
      result = dfs["stock_dividend_payouts"].dtypes
      expected = pd.Series(
          {
              "sid": np.dtype("int64"),
              "ex_date": date_dtype,
              "declared_date": date_dtype,
              "record_date": date_dtype,
              "pay_date": date_dtype,
              "payment_sid": np.dtype("int64"),
              "ratio": np.dtype("float64"),
          }
      ).sort_index()
  
      assert_equal(result, expected)
  
imports: import logbook
  import numpy
  import pandas
  from zipline.data.adjustments import SQLiteAdjustmentReader, SQLiteAdjustmentWriter
  from zipline.data.in_memory_daily_bars import InMemoryDailyBarReader
  from zipline.testing import parameter_space
  from zipline.testing.predicates import assert_equal
  from zipline.testing.fixtures import WithInstanceTmpDir, WithTradingCalendars, WithLogger, ZiplineTestCase
label_desc: Use image node_id 14 for calling the TestSQLiteAdjustmentsWriter obj's underlying member method code with example usage: obj.test_empty_frame_dtypes(convert_dates) without return types